Add immutable LanguageSettings interface and apply it to compilation

LanguageSettingsBuilder extends LanguageSettings
This commit is contained in:
Anton Lakotka
2021-03-25 09:48:29 +01:00
committed by Sergey Igushkin
parent 54c6ae2cce
commit de4221afd8
11 changed files with 47 additions and 25 deletions
@@ -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<String>
override val enabledLanguageFeatures: Set<String>
fun useExperimentalAnnotation(name: String)
val experimentalAnnotationsInUse: Set<String>
override val experimentalAnnotationsInUse: Set<String>
}
@@ -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<T : KotlinCommonOptions> {
val project: Project
@@ -27,7 +27,7 @@ interface KotlinCompilationData<T : KotlinCommonOptions> {
val compileDependencyFiles: FileCollection
val output: KotlinCompilationOutput
val languageSettings: LanguageSettingsBuilder
val languageSettings: LanguageSettings
val platformType: KotlinPlatformType
val moduleName: String
@@ -61,7 +61,7 @@ interface KotlinVariantCompilationData<T : KotlinCommonOptions> : KotlinCompilat
override val compileDependencyFiles: FileCollection
get() = owner.compileDependencyFiles
override val languageSettings: LanguageSettingsBuilder
override val languageSettings: LanguageSettings
get() = owner.languageSettings
override val platformType: KotlinPlatformType
@@ -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
@@ -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<BasicKotlinModuleVariant>().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()
@@ -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
@@ -72,7 +72,7 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
project.provider { project.buildDir.resolve("processedResources/${fragment.disambiguateName("metadata")}") }
)
override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder() // FIXME apply settings
override val languageSettings: LanguageSettingsBuilder = fragment.languageSettings
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.common
@@ -77,5 +77,5 @@ internal class KotlinNativeVariantCompilationData(
override val owner: KotlinNativeVariant
get() = variant
override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { languageSettings }
override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings }
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinNativeCompile
import org.jetbrains.kotlin.project.model.LanguageSettings
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
@@ -98,7 +99,7 @@ internal class DefaultLanguageSettingsBuilder : LanguageSettingsBuilder {
}
internal fun applyLanguageSettingsToKotlinOptions(
languageSettingsBuilder: LanguageSettingsBuilder,
languageSettingsBuilder: LanguageSettings,
kotlinOptions: KotlinCommonOptions
) = with(kotlinOptions) {
languageVersion = languageVersion ?: languageSettingsBuilder.languageVersion
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.konan.target.Distribution
import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.library.*
import org.jetbrains.kotlin.project.model.LanguageSettings
import java.io.File
import java.nio.charset.StandardCharsets
import java.security.MessageDigest
@@ -180,7 +181,7 @@ abstract class AbstractKotlinNativeCompile<T : KotlinCommonToolOptions, K : Kotl
abstract val additionalCompilerOptions: Provider<Collection<String>>
@get:Internal
val languageSettings: LanguageSettingsBuilder by project.provider {
val languageSettings: LanguageSettings by project.provider {
compilation.languageSettings
}
@@ -14,6 +14,8 @@ interface KotlinModuleFragment {
val fragmentName: String
val directRefinesDependencies: Iterable<KotlinModuleFragment>
val languageSettings: LanguageSettings
// TODO: scopes
val declaredModuleDependencies: Iterable<KotlinModuleDependency>
@@ -46,7 +48,8 @@ val KotlinModuleFragment.refinesClosure: Set<KotlinModuleFragment>
open class BasicKotlinModuleFragment(
override val containingModule: KotlinModule,
override val fragmentName: String
override val fragmentName: String,
override val languageSettings: LanguageSettings
) : KotlinModuleFragment {
override val directRefinesDependencies: MutableSet<BasicKotlinModuleFragment> = 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<KotlinAttributeKey, String> = mutableMapOf()
override fun toString(): String = "variant $fragmentName"
@@ -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<String>
val experimentalAnnotationsInUse: Set<String>
}