MPP: Configure Kotlin facets for Android modules

#KT-26770 Fixed
This commit is contained in:
Alexey Sedunov
2018-09-12 18:15:17 +03:00
parent 9253f88220
commit 1de0dbd67d
6 changed files with 71 additions and 59 deletions
@@ -23,6 +23,7 @@ import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.gradle.KotlinCompilation
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
import java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -58,6 +59,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
rootModel.addModuleOrderEntry(sourceSetModule)
}
}
KotlinSourceSetDataService.configureFacet(moduleData, sourceSetInfo, nodeToImport, module, modelsProvider)
}
}
@@ -21,6 +21,7 @@ import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.gradle.KotlinCompilation
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
import java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -56,6 +57,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
rootModel.addModuleOrderEntry(sourceSetModule)
}
}
KotlinSourceSetDataService.configureFacet(moduleData, sourceSetInfo, nodeToImport, module, modelsProvider)
}
}
@@ -23,6 +23,7 @@ import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.gradle.KotlinCompilation
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
import java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -58,6 +59,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
rootModel.addModuleOrderEntry(sourceSetModule)
}
}
KotlinSourceSetDataService.configureFacet(moduleData, sourceSetInfo, nodeToImport, module, modelsProvider)
}
}
@@ -26,6 +26,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.gradle.KotlinCompilation
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData
import java.io.File
@@ -71,6 +72,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
rootModel.addModuleOrderEntry(sourceSetModule)
}
}
KotlinSourceSetDataService.configureFacet(moduleData, sourceSetInfo, nodeToImport, module, modelsProvider)
}
ContentRootDataService().importData(contentRootsToImport, projectData, project, modelsProvider)
@@ -23,6 +23,7 @@ import org.jetbrains.jps.model.java.JavaSourceRootType
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
import org.jetbrains.kotlin.gradle.KotlinCompilation
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService
import java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -58,6 +59,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
rootModel.addModuleOrderEntry(sourceSetModule)
}
}
KotlinSourceSetDataService.configureFacet(moduleData, sourceSetInfo, nodeToImport, module, modelsProvider)
}
}
@@ -62,74 +62,76 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
}
}
private val KotlinModule.kind
get() = when (this) {
is KotlinCompilation -> KotlinModuleKind.COMPILATION_AND_SOURCE_SET_HOLDER
is KotlinSourceSet -> KotlinModuleKind.SOURCE_SET_HOLDER
else -> KotlinModuleKind.DEFAULT
}
private fun configureFacet(
sourceSetData: GradleSourceSetData,
kotlinSourceSet: KotlinSourceSetInfo,
mainModuleNode: DataNode<ModuleData>,
ideModule: Module,
modelsProvider: IdeModifiableModelsProvider
) {
val compilerVersion = mainModuleNode
.findAll(BuildScriptClasspathData.KEY)
.firstOrNull()
?.data
?.let { findKotlinPluginVersion(it) } ?: return
val platformKind = IdePlatformKindTooling.getTooling(kotlinSourceSet.platform).kind
val platform = when (platformKind) {
is JvmIdePlatformKind -> {
val target = JvmTarget.fromString(sourceSetData.targetCompatibility ?: "") ?: JvmTarget.DEFAULT
JvmIdePlatformKind.Platform(target)
companion object {
private val KotlinModule.kind
get() = when (this) {
is KotlinCompilation -> KotlinModuleKind.COMPILATION_AND_SOURCE_SET_HOLDER
is KotlinSourceSet -> KotlinModuleKind.SOURCE_SET_HOLDER
else -> KotlinModuleKind.DEFAULT
}
else -> platformKind.defaultPlatform
}
val coroutinesProperty = CoroutineSupport.byCompilerArgument(
mainModuleNode.coroutines ?: findKotlinCoroutinesProperty(ideModule.project)
)
fun configureFacet(
moduleData: ModuleData,
kotlinSourceSet: KotlinSourceSetInfo,
mainModuleNode: DataNode<ModuleData>,
ideModule: Module,
modelsProvider: IdeModifiableModelsProvider
) {
val compilerVersion = mainModuleNode
.findAll(BuildScriptClasspathData.KEY)
.firstOrNull()
?.data
?.let { findKotlinPluginVersion(it) } ?: return
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider)
val platformKind = IdePlatformKindTooling.getTooling(kotlinSourceSet.platform).kind
val platform = when (platformKind) {
is JvmIdePlatformKind -> {
val target = JvmTarget.fromString(moduleData.targetCompatibility ?: "") ?: JvmTarget.DEFAULT
JvmIdePlatformKind.Platform(target)
}
else -> platformKind.defaultPlatform
}
val compilerArguments = kotlinSourceSet.compilerArguments
val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments
if (compilerArguments != null) {
applyCompilerArgumentsToFacet(
compilerArguments,
defaultCompilerArguments,
kotlinFacet,
modelsProvider
val coroutinesProperty = CoroutineSupport.byCompilerArgument(
mainModuleNode.coroutines ?: findKotlinCoroutinesProperty(ideModule.project)
)
}
adjustClasspath(kotlinFacet, kotlinSourceSet.dependencyClasspath)
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider)
kotlinFacet.noVersionAutoAdvance()
with(kotlinFacet.configuration.settings) {
kind = kotlinSourceSet.kotlinModule.kind
isTestModule = kotlinSourceSet.isTestModule
sourceSetNames = kotlinSourceSet.sourceSetIdsByName.values.mapNotNull { sourceSetId ->
val node = mainModuleNode.findChildModuleById(sourceSetId) ?: return@mapNotNull null
val data = node.data as? ModuleData ?: return@mapNotNull null
modelsProvider.findIdeModule(data)?.name
val compilerArguments = kotlinSourceSet.compilerArguments
val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments
if (compilerArguments != null) {
applyCompilerArgumentsToFacet(
compilerArguments,
defaultCompilerArguments,
kotlinFacet,
modelsProvider
)
}
if (kotlinSourceSet.isTestModule) {
testOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile
productionOutputPath = null
} else {
productionOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile
testOutputPath = null
adjustClasspath(kotlinFacet, kotlinSourceSet.dependencyClasspath)
kotlinFacet.noVersionAutoAdvance()
with(kotlinFacet.configuration.settings) {
kind = kotlinSourceSet.kotlinModule.kind
isTestModule = kotlinSourceSet.isTestModule
sourceSetNames = kotlinSourceSet.sourceSetIdsByName.values.mapNotNull { sourceSetId ->
val node = mainModuleNode.findChildModuleById(sourceSetId) ?: return@mapNotNull null
val data = node.data as? ModuleData ?: return@mapNotNull null
modelsProvider.findIdeModule(data)?.name
}
if (kotlinSourceSet.isTestModule) {
testOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile
productionOutputPath = null
} else {
productionOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile
testOutputPath = null
}
}
}
}