From eeed0a6eeed2383056bc0fbf284d49c29e4c6f74 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 27 Jul 2016 22:28:18 +0300 Subject: [PATCH] Refactoring: stop using internal classes to create DSL extensions --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 65 ++++++------------- .../kotlin/gradle/plugin/gradleUtils.kt | 11 +++- 2 files changed, 29 insertions(+), 47 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 95c9f68e1d6..a2f55349a6d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -16,10 +16,8 @@ import org.gradle.api.artifacts.dsl.DependencyHandler import org.gradle.api.file.FileCollection import org.gradle.api.file.SourceDirectorySet import org.gradle.api.initialization.dsl.ScriptHandler -import org.gradle.api.internal.HasConvention import org.gradle.api.logging.Logger import org.gradle.api.logging.Logging -import org.gradle.api.plugins.ExtensionAware import org.gradle.api.plugins.JavaBasePlugin import org.gradle.api.plugins.JavaPlugin import org.gradle.api.plugins.JavaPluginConvention @@ -73,15 +71,13 @@ abstract class KotlinSourceSetProcessor( doTargetSpecificProcessing() } - private fun createKotlinSourceSet(): KotlinSourceSet? = - if (sourceSet is HasConvention) { - logger.kotlinDebug("Creating KotlinSourceSet for source set ${sourceSet}") - val kotlinSourceSet = kotlinSourceSetProvider.create(sourceSet.name) - sourceSet.convention.plugins.put(pluginName, kotlinSourceSet) - kotlinSourceSet - } else { - null - } + private fun createKotlinSourceSet(): KotlinSourceSet { + logger.kotlinDebug("Creating KotlinSourceSet for source set $sourceSet") + val kotlinSourceSet = kotlinSourceSetProvider.create(sourceSet.name) + kotlinSourceSet.kotlin.srcDir(project.file(sourceRootDir)) + sourceSet.addExtension(pluginName, kotlinSourceSet) + return kotlinSourceSet + } private fun createKotlinDirSet(): SourceDirectorySet? { val srcDir = project.file(sourceRootDir) @@ -305,23 +301,18 @@ open class KotlinAndroidPlugin( val kotlinAnnotationProcessingDep = "org.jetbrains.kotlin:kotlin-annotation-processing:$projectVersion" ext.sourceSets.all { sourceSet -> - if (sourceSet is HasConvention) { - val sourceSetName = sourceSet.name - val kotlinSourceSet = kotlinSourceSetProvider.create(sourceSetName) - sourceSet.convention.plugins.put("kotlin", kotlinSourceSet) - val kotlinDirSet = kotlinSourceSet.kotlin - kotlinDirSet.srcDir(project.file("src/$sourceSetName/kotlin")) + 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.addExtension("kotlin", kotlinSourceSet) - aptConfigurations.put(sourceSet.name, - project.createAptConfiguration(sourceSet.name, kotlinAnnotationProcessingDep)) - - project.logger.kotlinDebug("Created kotlin sourceDirectorySet at ${kotlinDirSet.srcDirs}") - } + aptConfigurations.put(sourceSet.name, + project.createAptConfiguration(sourceSet.name, kotlinAnnotationProcessingDep)) } - val extensions = (ext as ExtensionAware).extensions - extensions.add("kotlinOptions", K2JVMCompilerArguments::class.java) - AndroidGradleWrapper.setNoJdk(extensions.getByName("kotlinOptions")) + val kotlinOptions = K2JVMCompilerArguments() + kotlinOptions.noJdk = true + ext.addExtension("kotlinOptions", kotlinOptions) project.createKaptExtension() @@ -333,7 +324,7 @@ open class KotlinAndroidPlugin( val variantManager = AndroidGradleWrapper.getVariantDataManager(plugin) processVariantData(variantManager.variantDataList, project, - ext, plugin, aptConfigurations) + ext, plugin, aptConfigurations, kotlinOptions) } } } @@ -343,11 +334,10 @@ open class KotlinAndroidPlugin( project: Project, androidExt: BaseExtension, androidPlugin: BasePlugin, - aptConfigurations: Map + aptConfigurations: Map, + kotlinOptions: K2JVMCompilerArguments ) { val logger = project.logger - val kotlinOptions = getExtension(androidExt, "kotlinOptions") - val subpluginEnvironment = loadSubplugins(project) for (variantData in variantDataList) { @@ -365,9 +355,7 @@ open class KotlinAndroidPlugin( val kotlinTask = tasksProvider.createKotlinJVMTask(project, kotlinTaskName) kotlinTask.extensions.extraProperties.set("defaultModuleName", "${project.name}-$kotlinTaskName") - if (kotlinOptions != null) { - kotlinTask.setProperty("kotlinOptions", kotlinOptions) - } + kotlinTask.kotlinOptions = kotlinOptions // store kotlin classes in separate directory. They will serve as class-path to java compiler kotlinTask.destinationDir = File(project.buildDir, "tmp/kotlin-classes/$variantDataName") @@ -411,7 +399,7 @@ open class KotlinAndroidPlugin( val logger = kotlinTask.project.logger for (provider in variantData.sourceProviders) { - val kotlinSourceSet = getExtension(provider, "kotlin") + val kotlinSourceSet = provider.findExtension("kotlin") as? KotlinSourceSet ?: continue kotlinTask.source(kotlinSourceSet.kotlin) } @@ -423,17 +411,6 @@ open class KotlinAndroidPlugin( private val BaseVariantData<*>.sourceProviders: List get() = variantConfiguration.sortedSourceProviders - - fun getExtension(obj: Any, extensionName: String): T { - if (obj is ExtensionAware) { - val result = obj.extensions.findByName(extensionName) - if (result != null) { - return result as T - } - } - val result = (obj as HasConvention).convention.plugins[extensionName] - return result as T - } } private fun configureJavaTask(kotlinTask: KotlinCompile, javaTask: AbstractCompile, kotlinAfterJavaTask: KotlinCompile?, logger: Logger) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt index 02feee24404..cef7bcb4692 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt @@ -2,10 +2,9 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Task import org.gradle.api.file.FileCollection -import org.gradle.api.internal.AbstractTask +import org.gradle.api.plugins.ExtensionAware import org.gradle.api.tasks.compile.AbstractCompile import java.io.File -import kotlin.reflect.KProperty internal fun AbstractCompile.appendClasspathDynamically(file: File) { var added = false @@ -31,4 +30,10 @@ internal fun Task.finalizedByIfNotFailed(finalizer: Task) { fun AbstractCompile.mapClasspath(fn: ()->FileCollection) { conventionMapping.map("classpath", fn) -} \ No newline at end of file +} + +internal inline fun Any.addExtension(name: String, extension: T) = + (this as ExtensionAware).extensions.add(name, extension) + +internal fun Any.findExtension(name: String): Any? = + (this as ExtensionAware).extensions.findByName(name) \ No newline at end of file