MPP: Support language settings in new model import

This commit is contained in:
Alexey Sedunov
2018-08-17 19:52:15 +03:00
parent c45608a46e
commit acbe299126
5 changed files with 67 additions and 7 deletions
@@ -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)
}
}
}
}
@@ -19,11 +19,19 @@ interface KotlinModule : Serializable {
}
interface KotlinSourceSet : KotlinModule {
val languageSettings: KotlinLanguageSettings
val sourceDirs: Set<File>
val resourceDirs: Set<File>
val dependsOnSourceSets: Set<String>
}
interface KotlinLanguageSettings : Serializable {
val languageVersion: String?
val apiVersion: String?
val isProgressiveMode: Boolean
val enabledLanguageFeatures: Set<String>
}
interface KotlinCompilationOutput : Serializable {
val classesDirs: Set<File>
val effectiveClassesDir: File?
@@ -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<Named>)?.mapTo(LinkedHashSet()) { it.name } ?: emptySet<String>()
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<String> ?: emptySet()
)
}
private fun buildDependencies(
@@ -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<Named>)?.mapTo(LinkedHashSet()) { it.name } ?: emptySet<String>()
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<String> ?: emptySet()
)
}
private fun buildDependencies(
@@ -9,6 +9,7 @@ import java.io.File
class KotlinSourceSetImpl(
override val name: String,
override val languageSettings: KotlinLanguageSettings,
override val sourceDirs: Set<File>,
override val resourceDirs: Set<File>,
override val dependencies: Set<KotlinDependency>,
@@ -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<String>
) : KotlinLanguageSettings
class KotlinCompilationOutputImpl(
override val classesDirs: Set<File>,
override val effectiveClassesDir: File?,