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