diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt index ddeaf18ba61..bf997d991f9 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinMPPGradleProjectResolver.kt @@ -25,6 +25,7 @@ import org.gradle.tooling.model.UnsupportedMethodException import org.gradle.tooling.model.idea.IdeaContentRoot import org.gradle.tooling.model.idea.IdeaModule import org.jetbrains.kotlin.cli.common.arguments.* +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.gradle.* import org.jetbrains.plugins.gradle.model.* import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData @@ -575,12 +576,21 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() { gradleModule: IdeaModule, resolverCtx: ProjectResolverContext ): KotlinSourceSetInfo { - return KotlinSourceSetInfo(sourceSet).also { - it.moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx) - it.platform = sourceSet.platform - it.isTestModule = sourceSet.isTestModule - it.compilerArguments = createCompilerArguments(emptyList(), sourceSet.platform).also { + return KotlinSourceSetInfo(sourceSet).also { info -> + val languageSettings = sourceSet.languageSettings + info.moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx) + info.platform = sourceSet.platform + info.isTestModule = sourceSet.isTestModule + info.compilerArguments = createCompilerArguments(emptyList(), sourceSet.platform).also { it.multiPlatform = true + it.languageVersion = languageSettings.languageVersion + it.apiVersion = languageSettings.apiVersion + it.progressiveMode = languageSettings.isProgressiveMode + it.internalArguments = languageSettings.enabledLanguageFeatures.mapNotNull { + val feature = LanguageFeature.fromString(it) ?: return@mapNotNull null + val arg = "-XXLanguage:+$it" + ManualLanguageFeatureSetting(feature, LanguageFeature.State.ENABLED, arg) + } } } } diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt index 881fae782d9..ac7a3f04ed5 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModel.kt @@ -19,11 +19,19 @@ interface KotlinModule : Serializable { } interface KotlinSourceSet : KotlinModule { + val languageSettings: KotlinLanguageSettings val sourceDirs: Set val resourceDirs: Set val dependsOnSourceSets: Set } +interface KotlinLanguageSettings : Serializable { + val languageVersion: String? + val apiVersion: String? + val isProgressiveMode: Boolean + val enabledLanguageFeatures: Set +} + interface KotlinCompilationOutput : Serializable { val classesDirs: Set val effectiveClassesDir: File? diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt index 4565b8ba6df..c49e6c52a55 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt @@ -75,15 +75,32 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { project: Project ): KotlinSourceSetImpl? { val sourceSetClass = gradleSourceSet.javaClass + val getLanguageSettings = sourceSetClass.getMethodOrNull("getLanguageSettings") ?: return null val getSourceDirSet = sourceSetClass.getMethodOrNull("getKotlin") ?: return null val getResourceDirSet = sourceSetClass.getMethodOrNull("getResources") ?: return null val getDependsOn = sourceSetClass.getMethodOrNull("getDependsOn") ?: return null + val languageSettings = getLanguageSettings(gradleSourceSet)?.let { buildLanguageSettings(it) } ?: return null val sourceDirs = (getSourceDirSet(gradleSourceSet) as? SourceDirectorySet)?.srcDirs ?: emptySet() val resourceDirs = (getResourceDirSet(gradleSourceSet) as? SourceDirectorySet)?.srcDirs ?: emptySet() val dependencies = buildSourceSetDependencies(gradleSourceSet, dependencyResolver, project) @Suppress("UNCHECKED_CAST") val dependsOnSourceSets = (getDependsOn(gradleSourceSet) as? Set)?.mapTo(LinkedHashSet()) { it.name } ?: emptySet() - return KotlinSourceSetImpl(gradleSourceSet.name, sourceDirs, resourceDirs, dependencies, dependsOnSourceSets) + return KotlinSourceSetImpl(gradleSourceSet.name, languageSettings, sourceDirs, resourceDirs, dependencies, dependsOnSourceSets) + } + + private fun buildLanguageSettings(gradleLanguageSettings: Any): KotlinLanguageSettings? { + val languageSettingsClass = gradleLanguageSettings.javaClass + val getLanguageVersion = languageSettingsClass.getMethodOrNull("getLanguageVersion") ?: return null + val getApiVersion = languageSettingsClass.getMethodOrNull("getApiVersion") ?: return null + val getProgressiveMode = languageSettingsClass.getMethodOrNull("getProgressiveMode") ?: return null + val getEnabledLanguageFeatures = languageSettingsClass.getMethodOrNull("getEnabledLanguageFeatures") ?: return null + @Suppress("UNCHECKED_CAST") + return KotlinLanguageSettingsImpl( + getLanguageVersion(gradleLanguageSettings) as? String, + getApiVersion(gradleLanguageSettings) as? String, + getProgressiveMode(gradleLanguageSettings) as? Boolean ?: false, + getEnabledLanguageFeatures(gradleLanguageSettings) as? Set ?: emptySet() + ) } private fun buildDependencies( diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt.181 b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt.181 index 08eba876333..93135400c31 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt.181 +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt.181 @@ -75,15 +75,32 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { project: Project ): KotlinSourceSetImpl? { val sourceSetClass = gradleSourceSet.javaClass + val getLanguageSettings = sourceSetClass.getMethodOrNull("getLanguageSettings") ?: return null val getSourceDirSet = sourceSetClass.getMethodOrNull("getKotlin") ?: return null val getResourceDirSet = sourceSetClass.getMethodOrNull("getResources") ?: return null val getDependsOn = sourceSetClass.getMethodOrNull("getDependsOn") ?: return null + val languageSettings = getLanguageSettings(gradleSourceSet)?.let { buildLanguageSettings(it) } ?: return null val sourceDirs = (getSourceDirSet(gradleSourceSet) as? SourceDirectorySet)?.srcDirs ?: emptySet() val resourceDirs = (getResourceDirSet(gradleSourceSet) as? SourceDirectorySet)?.srcDirs ?: emptySet() val dependencies = buildSourceSetDependencies(gradleSourceSet, dependencyResolver, project) @Suppress("UNCHECKED_CAST") val dependsOnSourceSets = (getDependsOn(gradleSourceSet) as? Set)?.mapTo(LinkedHashSet()) { it.name } ?: emptySet() - return KotlinSourceSetImpl(gradleSourceSet.name, sourceDirs, resourceDirs, dependencies, dependsOnSourceSets) + return KotlinSourceSetImpl(gradleSourceSet.name, languageSettings, sourceDirs, resourceDirs, dependencies, dependsOnSourceSets) + } + + private fun buildLanguageSettings(gradleLanguageSettings: Any): KotlinLanguageSettings? { + val languageSettingsClass = gradleLanguageSettings.javaClass + val getLanguageVersion = languageSettingsClass.getMethodOrNull("getLanguageVersion") ?: return null + val getApiVersion = languageSettingsClass.getMethodOrNull("getApiVersion") ?: return null + val getProgressiveMode = languageSettingsClass.getMethodOrNull("getProgressiveMode") ?: return null + val getEnabledLanguageFeatures = languageSettingsClass.getMethodOrNull("getEnabledLanguageFeatures") ?: return null + @Suppress("UNCHECKED_CAST") + return KotlinLanguageSettingsImpl( + getLanguageVersion(gradleLanguageSettings) as? String, + getApiVersion(gradleLanguageSettings) as? String, + getProgressiveMode(gradleLanguageSettings) as? Boolean ?: false, + getEnabledLanguageFeatures(gradleLanguageSettings) as? Set ?: emptySet() + ) } private fun buildDependencies( diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt index 3a551708b86..5f1b02dd47e 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelImpl.kt @@ -9,6 +9,7 @@ import java.io.File class KotlinSourceSetImpl( override val name: String, + override val languageSettings: KotlinLanguageSettings, override val sourceDirs: Set, override val resourceDirs: Set, override val dependencies: Set, @@ -23,6 +24,13 @@ class KotlinSourceSetImpl( override fun toString() = name } +class KotlinLanguageSettingsImpl( + override val languageVersion: String?, + override val apiVersion: String?, + override val isProgressiveMode: Boolean, + override val enabledLanguageFeatures: Set +) : KotlinLanguageSettings + class KotlinCompilationOutputImpl( override val classesDirs: Set, override val effectiveClassesDir: File?,