Refactoring: stop using internal classes to create DSL extensions

This commit is contained in:
Alexey Tsvetkov
2016-07-27 22:28:18 +03:00
parent d9c9fb11ea
commit eeed0a6eee
2 changed files with 29 additions and 47 deletions
@@ -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<T : AbstractCompile>(
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<String, Configuration>
aptConfigurations: Map<String, Configuration>,
kotlinOptions: K2JVMCompilerArguments
) {
val logger = project.logger
val kotlinOptions = getExtension<Any?>(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<KotlinSourceSet>(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<SourceProvider>
get() = variantConfiguration.sortedSourceProviders
fun <T> 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) {
@@ -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)
}
}
internal inline fun <reified T : Any> 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)