Refactor loading kotlin version in gradle plugin
This commit is contained in:
+24
-30
@@ -97,7 +97,8 @@ class Kotlin2JvmSourceSetProcessor(
|
||||
javaBasePlugin: JavaBasePlugin,
|
||||
sourceSet: SourceSet,
|
||||
tasksProvider: KotlinTasksProvider,
|
||||
kotlinSourceSetProvider: KotlinSourceSetProvider
|
||||
kotlinSourceSetProvider: KotlinSourceSetProvider,
|
||||
private val kotlinPluginVersion: String
|
||||
) : KotlinSourceSetProcessor<KotlinCompile>(
|
||||
project, javaBasePlugin, sourceSet, tasksProvider, kotlinSourceSetProvider,
|
||||
dslExtensionName = KOTLIN_DSL_NAME,
|
||||
@@ -116,23 +117,16 @@ class Kotlin2JvmSourceSetProcessor(
|
||||
tasksProvider.createKotlinJVMTask(project, taskName)
|
||||
|
||||
override fun doTargetSpecificProcessing() {
|
||||
val kotlinAnnotationProcessingDep = cachedKotlinAnnotationProcessingDep ?: run {
|
||||
val projectVersion = loadKotlinVersionFromResource(project.logger)
|
||||
val dep = "org.jetbrains.kotlin:kotlin-annotation-processing:$projectVersion"
|
||||
cachedKotlinAnnotationProcessingDep = dep
|
||||
dep
|
||||
}
|
||||
|
||||
val aptConfiguration = project.createAptConfiguration(sourceSet.name, kotlinAnnotationProcessingDep)
|
||||
val aptConfiguration = project.createAptConfiguration(sourceSet.name, kotlinPluginVersion)
|
||||
|
||||
project.afterEvaluate { project ->
|
||||
if (project != null) {
|
||||
val javaTask = project.tasks.findByName(sourceSet.compileJavaTaskName)
|
||||
|
||||
val subpluginEnvironment = loadSubplugins(project)
|
||||
subpluginEnvironment.addSubpluginArguments(project, kotlinTask,
|
||||
subpluginEnvironment.addSubpluginArguments(project, kotlinTask,
|
||||
javaTask as JavaCompile, null, sourceSet)
|
||||
|
||||
|
||||
var kotlinAfterJavaTask: KotlinCompile? = null
|
||||
|
||||
if (aptConfiguration.dependencies.size > 1 && !Kapt2GradleSubplugin.isEnabled(project)) {
|
||||
@@ -201,8 +195,8 @@ class Kotlin2JsSourceSetProcessor(
|
||||
}
|
||||
|
||||
|
||||
abstract class AbstractKotlinPlugin(val tasksProvider: KotlinTasksProvider, val kotlinSourceSetProvider: KotlinSourceSetProvider) : Plugin<Project> {
|
||||
abstract fun buildSourceSetProcessor(project: Project, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet): KotlinSourceSetProcessor<*>
|
||||
abstract class AbstractKotlinPlugin(val tasksProvider: KotlinTasksProvider, val kotlinSourceSetProvider: KotlinSourceSetProvider, val kotlinPluginVersion: String) : Plugin<Project> {
|
||||
abstract fun buildSourceSetProcessor(project: Project, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet, kotlinPluginVersion: String): KotlinSourceSetProcessor<*>
|
||||
|
||||
override fun apply(project: Project) {
|
||||
val javaBasePlugin = project.plugins.apply(JavaBasePlugin::class.java)
|
||||
@@ -219,7 +213,7 @@ abstract class AbstractKotlinPlugin(val tasksProvider: KotlinTasksProvider, val
|
||||
javaPluginConvention: JavaPluginConvention
|
||||
) {
|
||||
javaPluginConvention.sourceSets?.all { sourceSet ->
|
||||
buildSourceSetProcessor(project, javaBasePlugin, sourceSet).run()
|
||||
buildSourceSetProcessor(project, javaBasePlugin, sourceSet, kotlinPluginVersion).run()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -227,10 +221,11 @@ abstract class AbstractKotlinPlugin(val tasksProvider: KotlinTasksProvider, val
|
||||
|
||||
open class KotlinPlugin(
|
||||
tasksProvider: KotlinTasksProvider,
|
||||
kotlinSourceSetProvider: KotlinSourceSetProvider
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinSourceSetProvider) {
|
||||
override fun buildSourceSetProcessor(project: Project, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet) =
|
||||
Kotlin2JvmSourceSetProcessor(project, javaBasePlugin, sourceSet, tasksProvider, kotlinSourceSetProvider)
|
||||
kotlinSourceSetProvider: KotlinSourceSetProvider,
|
||||
kotlinPluginVersion: String
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinSourceSetProvider, kotlinPluginVersion) {
|
||||
override fun buildSourceSetProcessor(project: Project, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet, kotlinPluginVersion: String) =
|
||||
Kotlin2JvmSourceSetProcessor(project, javaBasePlugin, sourceSet, tasksProvider, kotlinSourceSetProvider, kotlinPluginVersion)
|
||||
|
||||
override fun apply(project: Project) {
|
||||
project.createKaptExtension()
|
||||
@@ -241,15 +236,17 @@ open class KotlinPlugin(
|
||||
|
||||
open class Kotlin2JsPlugin(
|
||||
tasksProvider: KotlinTasksProvider,
|
||||
kotlinSourceSetProvider: KotlinSourceSetProvider
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinSourceSetProvider) {
|
||||
override fun buildSourceSetProcessor(project: Project, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet) =
|
||||
kotlinSourceSetProvider: KotlinSourceSetProvider,
|
||||
kotlinPluginVersion: String
|
||||
) : AbstractKotlinPlugin(tasksProvider, kotlinSourceSetProvider, kotlinPluginVersion) {
|
||||
override fun buildSourceSetProcessor(project: Project, javaBasePlugin: JavaBasePlugin, sourceSet: SourceSet, kotlinPluginVersion: String) =
|
||||
Kotlin2JsSourceSetProcessor(project, javaBasePlugin, sourceSet, tasksProvider, kotlinSourceSetProvider)
|
||||
}
|
||||
|
||||
open class KotlinAndroidPlugin(
|
||||
val tasksProvider: KotlinTasksProvider,
|
||||
private val kotlinSourceSetProvider: KotlinSourceSetProvider
|
||||
private val kotlinSourceSetProvider: KotlinSourceSetProvider,
|
||||
private val kotlinPluginVersion: String
|
||||
) : Plugin<Project> {
|
||||
|
||||
private val log = Logging.getLogger(this.javaClass)
|
||||
@@ -267,17 +264,13 @@ open class KotlinAndroidPlugin(
|
||||
|
||||
val aptConfigurations = hashMapOf<String, Configuration>()
|
||||
|
||||
val projectVersion = loadKotlinVersionFromResource(log)
|
||||
val kotlinAnnotationProcessingDep = "org.jetbrains.kotlin:kotlin-annotation-processing:$projectVersion"
|
||||
|
||||
ext.sourceSets.all { sourceSet ->
|
||||
log.kotlinDebug("Creating KotlinSourceSet for source set $sourceSet")
|
||||
val kotlinSourceSet = kotlinSourceSetProvider.create(sourceSet.name)
|
||||
kotlinSourceSet.kotlin.srcDir(project.file(project.file("src/${sourceSet.name}/kotlin")))
|
||||
sourceSet.addConvention(KOTLIN_DSL_NAME, kotlinSourceSet)
|
||||
|
||||
aptConfigurations.put(sourceSet.name,
|
||||
project.createAptConfiguration(sourceSet.name, kotlinAnnotationProcessingDep))
|
||||
aptConfigurations.put(sourceSet.name, project.createAptConfiguration(sourceSet.name, kotlinPluginVersion))
|
||||
}
|
||||
|
||||
val kotlinOptions = K2JVMCompilerArguments()
|
||||
@@ -486,8 +479,8 @@ class SubpluginEnvironment(
|
||||
) {
|
||||
|
||||
fun addSubpluginArguments(
|
||||
project: Project,
|
||||
kotlinTask: KotlinCompile,
|
||||
project: Project,
|
||||
kotlinTask: KotlinCompile,
|
||||
javaTask: AbstractCompile,
|
||||
variantData: Any?,
|
||||
javaSourceSet: SourceSet?) {
|
||||
@@ -520,10 +513,11 @@ private fun Project.getAptDirsForSourceSet(sourceSetName: String): Pair<File, Fi
|
||||
return aptOutputDirForVariant to aptWorkingDirForVariant
|
||||
}
|
||||
|
||||
private fun Project.createAptConfiguration(sourceSetName: String, kotlinAnnotationProcessingDep: String): Configuration {
|
||||
private fun Project.createAptConfiguration(sourceSetName: String, kotlinPluginVersion: String): Configuration {
|
||||
val aptConfigurationName = Kapt2KotlinGradleSubplugin.getKaptConfigurationName(sourceSetName)
|
||||
|
||||
val aptConfiguration = configurations.create(aptConfigurationName)
|
||||
val kotlinAnnotationProcessingDep = "org.jetbrains.kotlin:kotlin-annotation-processing:$kotlinPluginVersion"
|
||||
aptConfiguration.dependencies.add(dependencies.create(kotlinAnnotationProcessingDep))
|
||||
|
||||
return aptConfiguration
|
||||
|
||||
+20
-6
@@ -3,24 +3,25 @@ package org.jetbrains.kotlin.gradle.plugin
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.internal.file.FileResolver
|
||||
import org.gradle.api.logging.Logger
|
||||
import org.gradle.api.logging.Logging
|
||||
import org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImpl
|
||||
import org.jetbrains.kotlin.gradle.tasks.AndroidTasksProvider
|
||||
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
|
||||
import java.io.FileNotFoundException
|
||||
import java.util.*
|
||||
import javax.inject.Inject
|
||||
|
||||
// TODO: simplify: the complicated structure is a leftover from dynamic loading of plugin core, could be significantly simplified now
|
||||
|
||||
abstract class KotlinBasePluginWrapper(protected val fileResolver: FileResolver): Plugin<Project> {
|
||||
private val log = Logging.getLogger(this.javaClass)
|
||||
protected val kotlinPluginVersion = loadKotlinVersionFromResource(log)
|
||||
|
||||
override fun apply(project: Project) {
|
||||
// TODO: consider only set if if daemon or parallel compilation are enabled, though this way it should be safe too
|
||||
System.setProperty(org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY, "true")
|
||||
|
||||
val kotlinPluginVersion = loadKotlinVersionFromResource(log)
|
||||
project.extensions.extraProperties?.set("kotlin.gradle.plugin.version", kotlinPluginVersion)
|
||||
|
||||
val plugin = getPlugin()
|
||||
plugin.apply(project)
|
||||
|
||||
@@ -34,16 +35,29 @@ abstract class KotlinBasePluginWrapper(protected val fileResolver: FileResolver)
|
||||
|
||||
open class KotlinPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin() =
|
||||
KotlinPlugin(KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver))
|
||||
KotlinPlugin(KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver), kotlinPluginVersion)
|
||||
}
|
||||
|
||||
open class KotlinAndroidPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin() =
|
||||
KotlinAndroidPlugin(AndroidTasksProvider(), KotlinSourceSetProviderImpl(fileResolver))
|
||||
KotlinAndroidPlugin(AndroidTasksProvider(), KotlinSourceSetProviderImpl(fileResolver), kotlinPluginVersion)
|
||||
}
|
||||
|
||||
open class Kotlin2JsPluginWrapper @Inject constructor(fileResolver: FileResolver): KotlinBasePluginWrapper(fileResolver) {
|
||||
override fun getPlugin() =
|
||||
Kotlin2JsPlugin(KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver))
|
||||
Kotlin2JsPlugin(KotlinTasksProvider(), KotlinSourceSetProviderImpl(fileResolver), kotlinPluginVersion)
|
||||
}
|
||||
|
||||
private fun Any.loadKotlinVersionFromResource(log: Logger): String {
|
||||
log.kotlinDebug("Loading version information")
|
||||
val props = Properties()
|
||||
val propFileName = "project.properties"
|
||||
val inputStream = javaClass.classLoader!!.getResourceAsStream(propFileName) ?:
|
||||
throw FileNotFoundException("property file '$propFileName' not found in the classpath")
|
||||
|
||||
props.load(inputStream)
|
||||
|
||||
val projectVersion = props["project.version"] as String
|
||||
log.kotlinDebug("Found project version [$projectVersion]")
|
||||
return projectVersion
|
||||
}
|
||||
|
||||
-35
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2015 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin
|
||||
|
||||
import org.gradle.api.logging.Logger
|
||||
import java.io.FileNotFoundException
|
||||
import java.util.*
|
||||
|
||||
internal fun Any.loadKotlinVersionFromResource(log: Logger): String {
|
||||
log.kotlinDebug("Loading version information")
|
||||
val props = Properties()
|
||||
val propFileName = "project.properties"
|
||||
val inputStream = javaClass.classLoader!!.getResourceAsStream(propFileName) ?:
|
||||
throw FileNotFoundException("property file '$propFileName' not found in the classpath")
|
||||
|
||||
props.load(inputStream)
|
||||
|
||||
val projectVersion = props["project.version"] as String
|
||||
log.kotlinDebug("Found project version [$projectVersion]")
|
||||
return projectVersion
|
||||
}
|
||||
Reference in New Issue
Block a user