Refactor kotlin multiplatform extension access

This commit is contained in:
Ilya Matveev
2019-03-04 13:58:39 +03:00
parent 52c9c74f52
commit 1f2f0244a1
7 changed files with 25 additions and 30 deletions
@@ -34,6 +34,12 @@ internal fun Project.createKotlinExtension(extensionClass: KClass<out KotlinProj
internal val Project.kotlinExtension: KotlinProjectExtension
get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinProjectExtension
internal val Project.multiplatformExtensionOrNull: KotlinMultiplatformExtension?
get() = extensions.findByName(KOTLIN_PROJECT_EXTENSION_NAME) as? KotlinMultiplatformExtension
internal val Project.multiplatformExtension: KotlinMultiplatformExtension
get() = extensions.getByName(KOTLIN_PROJECT_EXTENSION_NAME) as KotlinMultiplatformExtension
open class KotlinProjectExtension {
val experimental: ExperimentalExtension
get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java)
@@ -20,7 +20,6 @@ import com.android.build.gradle.BaseExtension
import com.android.build.gradle.api.AndroidSourceSet
import com.android.build.gradle.api.BaseVariant
import com.android.build.gradle.api.TestVariant
import com.android.build.gradle.internal.variant.BaseVariantData
import com.android.build.gradle.internal.variant.TestVariantData
import org.gradle.api.Plugin
import org.gradle.api.Project
@@ -32,7 +31,7 @@ import org.gradle.tooling.provider.model.ToolingModelBuilderRegistry
import org.jetbrains.kotlin.gradle.model.builder.KotlinAndroidExtensionModelBuilder
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.multiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.w3c.dom.Document
import java.io.File
@@ -93,7 +92,7 @@ class AndroidSubplugin : KotlinGradleSubplugin<KotlinCompile> {
if (project.plugins.findPlugin(AndroidExtensionsSubpluginIndicator::class.java) == null) {
return false
}
project.multiplatformExtension?.let { kotlin ->
project.multiplatformExtensionOrNull?.let { kotlin ->
return kotlin.targets.any { target ->
target is KotlinAndroidTarget && target.compilations.any { it.compileKotlinTaskName == task.name }
}
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.multiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinJsDce
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -30,7 +30,7 @@ import java.io.File
class KotlinJsDcePlugin : Plugin<Project> {
override fun apply(project: Project) {
val kotlinExtension = project.multiplatformExtension ?: run {
val kotlinExtension = project.multiplatformExtensionOrNull ?: run {
project.pluginManager.apply(Kotlin2JsPluginWrapper::class.java)
project.kotlinExtension as KotlinSingleJavaTargetExtension
}
@@ -9,7 +9,7 @@ import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.Sync
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.addExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
@@ -143,12 +143,7 @@ open class KotlinCocoapodsPlugin: Plugin<Project> {
override fun apply(project: Project): Unit = with(project) {
pluginManager.withPlugin("kotlin-multiplatform") {
val kotlinExtension = project.kotlinExtension as? KotlinMultiplatformExtension
if (kotlinExtension == null) {
logger.info("Cannot apply cocoapods plugin: Cannot cast ${project.kotlinExtension} to KotlinMultiplatformExtension")
return@withPlugin
}
val kotlinExtension = project.multiplatformExtension
val cocoapodsExtension = CocoapodsExtension(this)
kotlinExtension.addExtension(EXTENSION_NAME, cocoapodsExtension)
@@ -23,9 +23,7 @@ import org.gradle.api.tasks.compile.AbstractCompile
import org.gradle.internal.reflect.Instantiator
import org.gradle.jvm.tasks.Jar
import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.configureOrCreate
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
@@ -34,10 +32,6 @@ import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.presetName
internal val Project.multiplatformExtension
get(): KotlinMultiplatformExtension? =
project.extensions.findByName("kotlin") as? KotlinMultiplatformExtension
class KotlinMultiplatformPlugin(
private val fileResolver: FileResolver,
private val instantiator: Instantiator,
@@ -102,7 +96,7 @@ class KotlinMultiplatformPlugin(
private fun setupCompilerPluginOptions(project: Project) {
// common source sets use the compiler options from the metadata compilation:
val metadataCompilation =
project.multiplatformExtension!!.targets
project.multiplatformExtension.targets
.getByName(METADATA_TARGET_NAME)
.compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME)
@@ -137,7 +131,7 @@ class KotlinMultiplatformPlugin(
}
fun setupDefaultPresets(project: Project) {
with((project.kotlinExtension as KotlinMultiplatformExtension).presets) {
with(project.multiplatformExtension.presets) {
add(KotlinJvmTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion))
add(KotlinJsTargetPreset(project, instantiator, fileResolver, kotlinPluginVersion))
add(KotlinAndroidTargetPreset(project, kotlinPluginVersion))
@@ -150,15 +144,15 @@ class KotlinMultiplatformPlugin(
private fun configurePublishingWithMavenPublish(project: Project) = project.pluginManager.withPlugin("maven-publish") { _ ->
if (project.multiplatformExtension!!.run { isGradleMetadataAvailable && isGradleMetadataExperimental }) {
if (project.multiplatformExtension.run { isGradleMetadataAvailable && isGradleMetadataExperimental }) {
SingleWarningPerBuild.show(
project,
GRADLE_METADATA_WARNING
)
}
val targets = project.multiplatformExtension!!.targets
val kotlinSoftwareComponent = project.multiplatformExtension!!.rootSoftwareComponent
val targets = project.multiplatformExtension.targets
val kotlinSoftwareComponent = project.multiplatformExtension.rootSoftwareComponent
project.extensions.configure(PublishingExtension::class.java) { publishing ->
@@ -171,7 +165,7 @@ class KotlinMultiplatformPlugin(
// Publish the root publication only if Gradle metadata publishing is enabled:
project.tasks.withType(AbstractPublishToMaven::class.java).all { publishTask ->
publishTask.onlyIf { publishTask.publication != rootPublication || project.multiplatformExtension!!.isGradleMetadataAvailable }
publishTask.onlyIf { publishTask.publication != rootPublication || project.multiplatformExtension.isGradleMetadataAvailable }
}
// Enforce the order of creating the publications, since the metadata publication is used in the other publications:
@@ -216,7 +210,7 @@ class KotlinMultiplatformPlugin(
}
}
private fun configureSourceSets(project: Project) = with(project.kotlinExtension as KotlinMultiplatformExtension) {
private fun configureSourceSets(project: Project) = with(project.multiplatformExtension) {
val production = sourceSets.create(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
val test = sourceSets.create(KotlinSourceSet.COMMON_TEST_SOURCE_SET_NAME)
@@ -232,7 +226,7 @@ class KotlinMultiplatformPlugin(
}
private fun setUpConfigurationAttributes(project: Project) {
val targets = (project.kotlinExtension as KotlinMultiplatformExtension).targets
val targets = project.multiplatformExtension.targets
project.afterEvaluate {
targets.all { target ->
@@ -306,7 +300,7 @@ internal fun sourcesJarTask(compilation: KotlinCompilation<*>, componentName: St
internal fun compilationsBySourceSet(project: Project): Map<KotlinSourceSet, Set<KotlinCompilation<*>>> =
HashMap<KotlinSourceSet, MutableSet<KotlinCompilation<*>>>().also { result ->
for (target in project.multiplatformExtension!!.targets) {
for (target in project.multiplatformExtension.targets) {
for (compilation in target.compilations) {
for (sourceSet in compilation.allKotlinSourceSets) {
result.getOrPut(sourceSet) { mutableSetOf() }.add(compilation)
@@ -207,7 +207,7 @@ private object CompilationSourceSetUtil {
projectSourceSetsInMultipleCompilationsCache.computeIfAbsent(project) { _ ->
check(project.state.executed) { "Should only be computed after the project is evaluated" }
val compilations = (project.kotlinExtension as? KotlinMultiplatformExtension)?.targets?.flatMap { it.compilations }
val compilations = project.multiplatformExtensionOrNull?.targets?.flatMap { it.compilations }
?: return@computeIfAbsent null
val sources = compilations
@@ -14,6 +14,7 @@ import org.gradle.api.artifacts.ProjectDependency
import org.gradle.api.attributes.Usage
import org.gradle.api.internal.component.SoftwareComponentInternal
import org.gradle.api.internal.component.UsageContext
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetComponent
@@ -115,7 +116,7 @@ private fun associateDependenciesWithActualModuleDependencies(
when (dependency) {
is ProjectDependency -> {
val dependencyProject = dependency.dependencyProject
val dependencyProjectKotlinExtension = dependencyProject.multiplatformExtension
val dependencyProjectKotlinExtension = dependencyProject.multiplatformExtensionOrNull
?: return@associate dependency to dependency
val resolved = resolvedDependencies[Triple(dependency.group, dependency.name, dependency.version)]