Refactor loading kotlin version in gradle plugin

This commit is contained in:
Alexey Tsvetkov
2016-08-16 16:29:15 +03:00
parent 8a5df120a5
commit 3922ebcd4b
3 changed files with 44 additions and 71 deletions
@@ -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
@@ -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
}
@@ -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
}