From de4221afd8006a846a36c37f7a1ece857624bbfb Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Thu, 25 Mar 2021 09:48:29 +0100 Subject: [PATCH] Add immutable LanguageSettings interface and apply it to compilation LanguageSettingsBuilder extends LanguageSettings --- .../gradle/plugin/LanguageSettingsBuilder.kt | 14 ++++++++------ .../plugin/mpp/pm20/KotlinCompilationData.kt | 6 +++--- .../gradle/plugin/mpp/pm20/KotlinGradleFragment.kt | 5 +---- .../plugin/mpp/GradleProjectModuleBuilder.kt | 9 +++++---- .../gradle/plugin/mpp/pm20/DependencyResolution.kt | 3 ++- .../mpp/pm20/KotlinMetadataCompilationData.kt | 2 +- .../gradle/plugin/mpp/pm20/KotlinNativeVariant.kt | 2 +- .../sources/DefaultLanguageSettingsBuilder.kt | 3 ++- .../targets/native/tasks/KotlinNativeTasks.kt | 3 ++- .../src/main/kotlin/KotlinModuleFragment.kt | 11 ++++++++--- .../src/main/kotlin/LanguageSettings.kt | 14 ++++++++++++++ 11 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 libraries/tools/kotlin-project-model/src/main/kotlin/LanguageSettings.kt diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/LanguageSettingsBuilder.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/LanguageSettingsBuilder.kt index 81c07ed6212..1398c58495b 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/LanguageSettingsBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/LanguageSettingsBuilder.kt @@ -5,18 +5,20 @@ package org.jetbrains.kotlin.gradle.plugin -interface LanguageSettingsBuilder { - var languageVersion: String? +import org.jetbrains.kotlin.project.model.LanguageSettings - var apiVersion: String? +interface LanguageSettingsBuilder : LanguageSettings { + override var languageVersion: String? - var progressiveMode: Boolean + override var apiVersion: String? + + override var progressiveMode: Boolean fun enableLanguageFeature(name: String) - val enabledLanguageFeatures: Set + override val enabledLanguageFeatures: Set fun useExperimentalAnnotation(name: String) - val experimentalAnnotationsInUse: Set + override val experimentalAnnotationsInUse: Set } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt index 4877c2be7c0..513e255100a 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinCompilationData.kt @@ -11,7 +11,7 @@ import org.gradle.api.file.SourceDirectorySet import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType -import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder +import org.jetbrains.kotlin.project.model.LanguageSettings interface KotlinCompilationData { val project: Project @@ -27,7 +27,7 @@ interface KotlinCompilationData { val compileDependencyFiles: FileCollection val output: KotlinCompilationOutput - val languageSettings: LanguageSettingsBuilder + val languageSettings: LanguageSettings val platformType: KotlinPlatformType val moduleName: String @@ -61,7 +61,7 @@ interface KotlinVariantCompilationData : KotlinCompilat override val compileDependencyFiles: FileCollection get() = owner.compileDependencyFiles - override val languageSettings: LanguageSettingsBuilder + override val languageSettings: LanguageSettings get() = owner.languageSettings override val platformType: KotlinPlatformType diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt index 6c0b8e71e70..a28eeb7ce39 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinGradleFragment.kt @@ -22,10 +22,7 @@ interface KotlinGradleFragment : KotlinModuleFragment, HasKotlinDependencies, Na override fun getName(): String = fragmentName - // TODO pull up to KotlinModuleFragment - // FIXME apply to compilation - // FIXME check for consistency - val languageSettings: LanguageSettingsBuilder + override val languageSettings: LanguageSettingsBuilder val project: Project get() = containingModule.project diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt index c5f9a2c0632..40972bd36e6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/GradleProjectModuleBuilder.kt @@ -19,6 +19,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations import org.jetbrains.kotlin.project.model.* @@ -32,11 +33,11 @@ class ProjectStructureMetadataModuleBuilder { ): KotlinModule { val moduleData = BasicKotlinModule(component.toSingleModuleIdentifier()).apply { metadata.sourceSetNamesByVariantName.keys.forEach { variantName -> - fragments.add(BasicKotlinModuleVariant(this@apply, variantName)) + fragments.add(BasicKotlinModuleVariant(this@apply, variantName, DefaultLanguageSettingsBuilder())) } fun fragment(sourceSetName: String): BasicKotlinModuleFragment { if (fragments.none { it.fragmentName == sourceSetName }) - fragments.add(BasicKotlinModuleFragment(this@apply, sourceSetName)) + fragments.add(BasicKotlinModuleFragment(this@apply, sourceSetName, DefaultLanguageSettingsBuilder())) return fragmentByName(sourceSetName) } metadata.sourceSetNamesByVariantName.forEach { (variantName, sourceSets) -> @@ -163,7 +164,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp ?: listOf(compilation.defaultSourceSetName) variantNames.forEach { variantName -> - val variant = BasicKotlinModuleVariant(this@apply, variantName) + val variant = BasicKotlinModuleVariant(this@apply, variantName, DefaultLanguageSettingsBuilder()) moduleByFragment[variant] = this@apply variantToCompilation[variant] = compilation fragments.add(variant) @@ -180,7 +181,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp // Once all fragments are created, add dependencies between them sourceSetsToInclude.forEach { sourceSet -> val existingVariant = fragments.filterIsInstance().find { it.fragmentName == sourceSet.name } - val fragment = existingVariant ?: BasicKotlinModuleFragment(this@apply, sourceSet.name).also { fragments.add(it) } + val fragment = existingVariant ?: BasicKotlinModuleFragment(this@apply, sourceSet.name, sourceSet.languageSettings).also { fragments.add(it) } moduleByFragment[fragment] = this@apply fragment.kotlinSourceRoots = sourceSet.kotlin.sourceDirectories.toList() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt index 502f5f0b2e8..d978035ecf6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/DependencyResolution.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.getProjectStructureMetadata import org.jetbrains.kotlin.gradle.plugin.mpp.resolvableMetadataConfiguration +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.project.model.* import java.util.ArrayDeque @@ -148,7 +149,7 @@ class FragmentDependenciesDiscovery( internal fun buildSyntheticModule(resolvedComponentResult: ResolvedComponentResult, singleVariantName: String): ExternalSyntheticKotlinModule { val moduleDependency = resolvedComponentResult.toModuleDependency() return ExternalSyntheticKotlinModule(BasicKotlinModule(moduleDependency.moduleIdentifier).apply { - BasicKotlinModuleVariant(this@apply, singleVariantName).apply { + BasicKotlinModuleVariant(this@apply, singleVariantName, DefaultLanguageSettingsBuilder()).apply { fragments.add(this) this.declaredModuleDependencies.addAll( resolvedComponentResult.dependencies diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt index 01b5a095213..915ec9053cf 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/pm20/KotlinMetadataCompilationData.kt @@ -72,7 +72,7 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData> @get:Internal - val languageSettings: LanguageSettingsBuilder by project.provider { + val languageSettings: LanguageSettings by project.provider { compilation.languageSettings } diff --git a/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt b/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt index f349a45bf05..1250ab869fa 100644 --- a/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt +++ b/libraries/tools/kotlin-project-model/src/main/kotlin/KotlinModuleFragment.kt @@ -14,6 +14,8 @@ interface KotlinModuleFragment { val fragmentName: String val directRefinesDependencies: Iterable + val languageSettings: LanguageSettings + // TODO: scopes val declaredModuleDependencies: Iterable @@ -46,7 +48,8 @@ val KotlinModuleFragment.refinesClosure: Set open class BasicKotlinModuleFragment( override val containingModule: KotlinModule, - override val fragmentName: String + override val fragmentName: String, + override val languageSettings: LanguageSettings ) : KotlinModuleFragment { override val directRefinesDependencies: MutableSet = mutableSetOf() @@ -59,10 +62,12 @@ open class BasicKotlinModuleFragment( class BasicKotlinModuleVariant( containingModule: KotlinModule, - fragmentName: String + fragmentName: String, + languageSettings: LanguageSettings ) : BasicKotlinModuleFragment ( containingModule, - fragmentName + fragmentName, + languageSettings ), KotlinModuleVariant { override val variantAttributes: MutableMap = mutableMapOf() override fun toString(): String = "variant $fragmentName" diff --git a/libraries/tools/kotlin-project-model/src/main/kotlin/LanguageSettings.kt b/libraries/tools/kotlin-project-model/src/main/kotlin/LanguageSettings.kt new file mode 100644 index 00000000000..75a6f748971 --- /dev/null +++ b/libraries/tools/kotlin-project-model/src/main/kotlin/LanguageSettings.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.project.model + +interface LanguageSettings { + val languageVersion: String? + val apiVersion: String? + val progressiveMode: Boolean + val enabledLanguageFeatures: Set + val experimentalAnnotationsInUse: Set +}