MPP: Support Android platform in new model import

This commit is contained in:
Alexey Sedunov
2018-08-17 14:56:02 +03:00
parent b983c93930
commit a5de065d7c
12 changed files with 28 additions and 42 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.jps.model.java.JavaResourceRootType
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 java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -43,7 +44,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
val compilation = sourceSetInfo.kotlinModule as? KotlinCompilation ?: continue
val rootModel = modelsProvider.getModifiableRootModel(module)
for (sourceSet in compilation.sourceSets) {
if (sourceSet.isAndroid) {
if (sourceSet.platform == KotlinPlatform.ANDROID) {
val sourceType = if (sourceSet.isTestModule) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE
val resourceType = if (sourceSet.isTestModule) JavaResourceRootType.TEST_RESOURCE else JavaResourceRootType.RESOURCE
sourceSet.sourceDirs.forEach { addSourceRoot(it, sourceType, rootModel) }
@@ -20,6 +20,7 @@ import org.jetbrains.jps.model.java.JavaResourceRootType
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 java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -41,7 +42,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
val compilation = sourceSetInfo.kotlinModule as? KotlinCompilation ?: continue
val rootModel = modelsProvider.getModifiableRootModel(module)
for (sourceSet in compilation.sourceSets) {
if (sourceSet.isAndroid) {
if (sourceSet.platform == KotlinPlatform.ANDROID) {
val sourceType = if (sourceSet.isTestModule) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE
val resourceType = if (sourceSet.isTestModule) JavaResourceRootType.TEST_RESOURCE else JavaResourceRootType.RESOURCE
sourceSet.sourceDirs.forEach { addSourceRoot(it, sourceType, rootModel) }
@@ -22,6 +22,7 @@ import org.jetbrains.jps.model.java.JavaResourceRootType
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 java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -43,7 +44,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
val compilation = sourceSetInfo.kotlinModule as? KotlinCompilation ?: continue
val rootModel = modelsProvider.getModifiableRootModel(module)
for (sourceSet in compilation.sourceSets) {
if (sourceSet.isAndroid) {
if (sourceSet.platform == KotlinPlatform.ANDROID) {
val sourceType = if (sourceSet.isTestModule) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE
val resourceType = if (sourceSet.isTestModule) JavaResourceRootType.TEST_RESOURCE else JavaResourceRootType.RESOURCE
sourceSet.sourceDirs.forEach { addSourceRoot(it, sourceType, rootModel) }
@@ -22,6 +22,7 @@ import org.jetbrains.jps.model.java.JavaResourceRootType
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 java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -43,7 +44,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
val compilation = sourceSetInfo.kotlinModule as? KotlinCompilation ?: continue
val rootModel = modelsProvider.getModifiableRootModel(module)
for (sourceSet in compilation.sourceSets) {
if (sourceSet.isAndroid) {
if (sourceSet.platform == KotlinPlatform.ANDROID) {
val sourceType = if (sourceSet.isTestModule) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE
val resourceType = if (sourceSet.isTestModule) JavaResourceRootType.TEST_RESOURCE else JavaResourceRootType.RESOURCE
sourceSet.sourceDirs.forEach { addSourceRoot(it, sourceType, rootModel) }
@@ -22,6 +22,7 @@ import org.jetbrains.jps.model.java.JavaResourceRootType
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 java.io.File
class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<ModuleData, Void>() {
@@ -43,7 +44,7 @@ class KotlinAndroidGradleMPPModuleDataService : AbstractProjectDataService<Modul
val compilation = sourceSetInfo.kotlinModule as? KotlinCompilation ?: continue
val rootModel = modelsProvider.getModifiableRootModel(module)
for (sourceSet in compilation.sourceSets) {
if (sourceSet.isAndroid) {
if (sourceSet.platform == KotlinPlatform.ANDROID) {
val sourceType = if (sourceSet.isTestModule) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE
val resourceType = if (sourceSet.isTestModule) JavaResourceRootType.TEST_RESOURCE else JavaResourceRootType.RESOURCE
sourceSet.sourceDirs.forEach { addSourceRoot(it, sourceType, rootModel) }
@@ -19,6 +19,7 @@ import com.intellij.openapi.util.Key
import org.gradle.tooling.model.idea.IdeaModule
import org.jetbrains.kotlin.gradle.KotlinMPPGradleModel
import org.jetbrains.kotlin.gradle.KotlinMPPGradleModelBuilder
import org.jetbrains.kotlin.gradle.KotlinPlatform
import org.jetbrains.kotlin.idea.configuration.KotlinMPPGradleProjectResolver
import org.jetbrains.kotlin.idea.configuration.KotlinSourceSetInfo
import org.jetbrains.kotlin.idea.configuration.kotlinSourceSet
@@ -88,7 +89,7 @@ class KotlinAndroidMPPGradleProjectResolver : AbstractProjectResolverExtension()
.targets
.asSequence()
.flatMap { it.compilations.asSequence() }
.filter { it.isAndroid }
.filter { it.platform == KotlinPlatform.ANDROID }
.map { KotlinMPPGradleProjectResolver.createSourceSetInfo(it, gradleModule, resolverCtx) }
.toList()
}
@@ -166,7 +166,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
val sourceSetToCompilationData = LinkedHashMap<KotlinSourceSet, MutableSet<GradleSourceSetData>>()
for (target in mppModel.targets) {
if (target.isAndroid) continue
if (target.platform == KotlinPlatform.ANDROID) continue
val targetData = KotlinTargetData(target.name).also {
it.archiveFile = target.jar?.archiveFile
}
@@ -210,7 +210,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
val kotlinSourceSet = createSourceSetInfo(compilation, gradleModule, resolverCtx)
if (compilation.platform == KotlinPlatform.JVM) {
if (compilation.platform == KotlinPlatform.JVM || compilation.platform == KotlinPlatform.ANDROID) {
compilationData.targetCompatibility = (kotlinSourceSet.compilerArguments as? K2JVMCompilerArguments)?.jvmTarget
}
@@ -232,7 +232,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
}
for (sourceSet in mppModel.sourceSets.values) {
if (sourceSet.isAndroid) continue
if (sourceSet.platform == KotlinPlatform.ANDROID) continue
val moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx)
val existingSourceSetDataNode = sourceSetMap[moduleId]?.first
if (existingSourceSetDataNode?.kotlinSourceSet != null) continue
@@ -455,7 +455,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
}
}
for (sourceSet in mppModel.sourceSets.values) {
if (sourceSet.isAndroid) continue
if (sourceSet.platform == KotlinPlatform.ANDROID) continue
val moduleId = getKotlinModuleId(gradleModule, sourceSet, resolverCtx)
val moduleDataNode = sourceSetsMap[moduleId] ?: continue
processor(moduleDataNode, sourceSet)
@@ -476,7 +476,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
}
}
for (target in mppModel.targets) {
if (target.isAndroid) continue
if (target.platform == KotlinPlatform.ANDROID) continue
for (compilation in target.compilations) {
val moduleId = getKotlinModuleId(gradleModule, compilation, resolverCtx)
val moduleDataNode = sourceSetsMap[moduleId] ?: continue
@@ -610,7 +610,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
private fun createCompilerArguments(args: List<String>, platform: KotlinPlatform): CommonCompilerArguments {
return when (platform) {
KotlinPlatform.COMMON -> K2MetadataCompilerArguments()
KotlinPlatform.JVM -> K2JVMCompilerArguments()
KotlinPlatform.JVM, KotlinPlatform.ANDROID -> K2JVMCompilerArguments()
KotlinPlatform.JS -> K2JSCompilerArguments()
}.also {
parseCommandLineArguments(args, it)
@@ -53,7 +53,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
val platform = kotlinSourceSet.platform
val rootModel = modelsProvider.getModifiableRootModel(ideModule)
if (platform != KotlinPlatform.JVM) {
if (platform != KotlinPlatform.JVM && platform != KotlinPlatform.ANDROID) {
migrateNonJvmSourceFolders(rootModel)
}
@@ -81,7 +81,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
?.data
?.let { findKotlinPluginVersion(it) } ?: return
val platformKind = when (kotlinSourceSet.platform) {
KotlinPlatform.JVM -> TargetPlatformKind.Jvm[JvmTarget.fromString(
KotlinPlatform.JVM, KotlinPlatform.ANDROID -> TargetPlatformKind.Jvm[JvmTarget.fromString(
sourceSetData.targetCompatibility ?: ""
) ?: JvmTarget.DEFAULT]
KotlinPlatform.JS -> TargetPlatformKind.JavaScript
@@ -12,7 +12,6 @@ import java.io.Serializable
typealias KotlinDependency = ExternalDependency
interface KotlinModule : Serializable {
val isAndroid: Boolean
val name: String
val platform: KotlinPlatform
val dependencies: Set<KotlinDependency>
@@ -52,7 +51,8 @@ interface KotlinCompilation : KotlinModule {
enum class KotlinPlatform(val id: String) {
COMMON("common"),
JVM("jvm"),
JS("js");
JS("js"),
ANDROID("androidJvm");
companion object {
fun byId(id: String) = values().firstOrNull { it.id == id }
@@ -64,7 +64,6 @@ interface KotlinTargetJar : Serializable {
}
interface KotlinTarget : Serializable {
val isAndroid: Boolean
val name: String
val disambiguationClassifier: String?
val platform: KotlinPlatform
@@ -144,13 +144,12 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val platformId = (getPlatformType.invoke(gradleTarget) as? Named)?.name ?: return null
val platform = KotlinPlatform.byId(platformId) ?: return null
val disambiguationClassifier = getDisambiguationClassifier(gradleTarget) as? String
val isAndroid = targetClass.name == KOTLIN_ANDROID_TARGET_CLASS_NAME
@Suppress("UNCHECKED_CAST")
val gradleCompilations =
(getCompilations.invoke(gradleTarget) as? NamedDomainObjectContainer<Named>)?.asMap?.values ?: emptyList<Named>()
val compilations = gradleCompilations.mapNotNull { buildCompilation(it, sourceSetMap, dependencyResolver, isAndroid, project) }
val compilations = gradleCompilations.mapNotNull { buildCompilation(it, sourceSetMap, dependencyResolver, project) }
val jar = buildTargetJar(gradleTarget, project)
val target = KotlinTargetImpl(isAndroid, gradleTarget.name, disambiguationClassifier, platform, compilations, jar)
val target = KotlinTargetImpl(gradleTarget.name, disambiguationClassifier, platform, compilations, jar)
compilations.forEach { it.target = target }
return target
}
@@ -170,7 +169,6 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
gradleCompilation: Named,
sourceSetMap: Map<String, KotlinSourceSet>,
dependencyResolver: DependencyResolver,
isAndroid: Boolean,
project: Project
): KotlinCompilationImpl? {
val compilationClass = gradleCompilation.javaClass
@@ -186,7 +184,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val arguments = buildCompilationArguments(compileKotlinTask) ?: return null
val dependencyClasspath = buildDependencyClasspath(compileKotlinTask)
val dependencies = buildCompilationDependencies(gradleCompilation, dependencyResolver, project)
return KotlinCompilationImpl(isAndroid, gradleCompilation.name, kotlinSourceSets, dependencies, output, arguments, dependencyClasspath)
return KotlinCompilationImpl(gradleCompilation.name, kotlinSourceSets, dependencies, output, arguments, dependencyClasspath)
}
private fun buildCompilationDependencies(
@@ -280,15 +278,10 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
if (compilations != null) {
sourceSet.platform = compilations.map { it.platform }.distinct().singleOrNull() ?: KotlinPlatform.COMMON
sourceSet.isTestModule = compilations.all { it.isTestModule }
sourceSet.isAndroid = compilations.all { it.isAndroid }
} else {
// TODO: change me after design about it
sourceSet.isTestModule = "Test" in sourceSet.name
}
}
}
companion object {
private val KOTLIN_ANDROID_TARGET_CLASS_NAME = "org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget"
}
}
@@ -144,13 +144,12 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val platformId = (getPlatformType.invoke(gradleTarget) as? Named)?.name ?: return null
val platform = KotlinPlatform.byId(platformId) ?: return null
val disambiguationClassifier = getDisambiguationClassifier(gradleTarget) as? String
val isAndroid = targetClass.name == KOTLIN_ANDROID_TARGET_CLASS_NAME
@Suppress("UNCHECKED_CAST")
val gradleCompilations =
(getCompilations.invoke(gradleTarget) as? NamedDomainObjectContainer<Named>)?.asMap?.values ?: emptyList<Named>()
val compilations = gradleCompilations.mapNotNull { buildCompilation(it, sourceSetMap, dependencyResolver, isAndroid, project) }
val compilations = gradleCompilations.mapNotNull { buildCompilation(it, sourceSetMap, dependencyResolver, project) }
val jar = buildTargetJar(gradleTarget, project)
val target = KotlinTargetImpl(isAndroid, gradleTarget.name, disambiguationClassifier, platform, compilations, jar)
val target = KotlinTargetImpl(gradleTarget.name, disambiguationClassifier, platform, compilations, jar)
compilations.forEach { it.target = target }
return target
}
@@ -170,7 +169,6 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
gradleCompilation: Named,
sourceSetMap: Map<String, KotlinSourceSet>,
dependencyResolver: DependencyResolver,
isAndroid: Boolean,
project: Project
): KotlinCompilationImpl? {
val compilationClass = gradleCompilation.javaClass
@@ -186,7 +184,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val arguments = buildCompilationArguments(compileKotlinTask) ?: return null
val dependencyClasspath = buildDependencyClasspath(compileKotlinTask)
val dependencies = buildCompilationDependencies(gradleCompilation, dependencyResolver, project)
return KotlinCompilationImpl(isAndroid, gradleCompilation.name, kotlinSourceSets, dependencies, output, arguments, dependencyClasspath)
return KotlinCompilationImpl(gradleCompilation.name, kotlinSourceSets, dependencies, output, arguments, dependencyClasspath)
}
private fun buildCompilationDependencies(
@@ -280,15 +278,10 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
if (compilations != null) {
sourceSet.platform = compilations.map { it.platform }.distinct().singleOrNull() ?: KotlinPlatform.COMMON
sourceSet.isTestModule = compilations.all { it.isTestModule }
sourceSet.isAndroid = compilations.all { it.isAndroid }
} else {
// TODO: change me after design about it
sourceSet.isTestModule = "Test" in sourceSet.name
}
}
}
companion object {
private val KOTLIN_ANDROID_TARGET_CLASS_NAME = "org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget"
}
}
@@ -14,9 +14,6 @@ class KotlinSourceSetImpl(
override val dependencies: Set<KotlinDependency>,
override val dependsOnSourceSets: Set<String>
) : KotlinSourceSet {
override var isAndroid: Boolean = false
internal set
override var platform: KotlinPlatform = KotlinPlatform.COMMON
internal set
@@ -38,7 +35,6 @@ class KotlinCompilationArgumentsImpl(
) : KotlinCompilationArguments
class KotlinCompilationImpl(
override val isAndroid: Boolean,
override val name: String,
override val sourceSets: Collection<KotlinSourceSet>,
override val dependencies: Set<KotlinDependency>,
@@ -63,7 +59,6 @@ class KotlinTargetJarImpl(
) : KotlinTargetJar
class KotlinTargetImpl(
override val isAndroid: Boolean,
override val name: String,
override val disambiguationClassifier: String?,
override val platform: KotlinPlatform,