From 1b281d623b987824f4e3cfdf73bac789f99caccd Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Wed, 25 Mar 2020 15:42:19 +0700 Subject: [PATCH] HMPP: Propagate K/N flavor into each imported K/N module --- .../KotlinMPPGradleProjectResolver.kt | 31 ++++++++++++++----- .../KotlinSourceSetDataService.kt | 28 +++++++++++++---- 2 files changed, 46 insertions(+), 13 deletions(-) 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 49697f54480..3f98a72f50e 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 @@ -272,8 +272,6 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtensionComp val mppModel = resolverCtx.getMppModel(gradleModule) if (mppModel == null || externalProject == null) return - mainModuleNode.kotlinNativeHome = mppModel.kotlinNativeHome - val jdkName = gradleModule.jdkNameIfAny // save artefacts locations. @@ -306,7 +304,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtensionComp val sourceSetToRunTasks = calculateRunTasks(mppModel, gradleModule, resolverCtx) - val sourceSetToCompilationData = LinkedHashMap>() + val sourceSetToCompilationData = LinkedHashMap>() for (target in mppModel.targets) { if (delegateToAndroidPlugin(target)) continue if (target.name == KotlinTarget.METADATA_TARGET_NAME) continue @@ -362,10 +360,19 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtensionComp if (compilation.platform == KotlinPlatform.JVM || compilation.platform == KotlinPlatform.ANDROID) { compilationData.targetCompatibility = (kotlinSourceSet.compilerArguments as? K2JVMCompilerArguments)?.jvmTarget + } else if (compilation.platform == KotlinPlatform.NATIVE) { + // Kotlin/Native target has been added to KotlinNativeCompilation only in 1.3.60, + // so 'nativeExtensions' may be null in 1.3.5x or earlier versions + compilation.nativeExtensions?.konanTarget?.let { konanTarget -> + compilationData.konanTargets = setOf(konanTarget) + } } for (sourceSet in compilation.sourceSets) { - sourceSetToCompilationData.getOrPut(sourceSet) { LinkedHashSet() } += compilationData + sourceSetToCompilationData.getOrPut(sourceSet.name) { LinkedHashSet() } += compilationData + for (dependentSourceSetName in sourceSet.dependsOnSourceSets) { + sourceSetToCompilationData.getOrPut(dependentSourceSetName) { LinkedHashSet() } += compilationData + } } val compilationDataNode = @@ -415,9 +422,18 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtensionComp it.ideModuleGroup = moduleGroup it.sdkName = jdkName - it.targetCompatibility = sourceSetToCompilationData[sourceSet] - ?.mapNotNull { it.targetCompatibility } - ?.minWith(VersionComparatorUtil.COMPARATOR) + + sourceSetToCompilationData[sourceSet.name]?.let { compilationDataRecords -> + it.targetCompatibility = compilationDataRecords + .mapNotNull { compilationData -> compilationData.targetCompatibility } + .minWith(VersionComparatorUtil.COMPARATOR) + + if (sourceSet.actualPlatforms.getSinglePlatform() == KotlinPlatform.NATIVE) { + it.konanTargets = compilationDataRecords + .flatMap { compilationData -> compilationData.konanTargets } + .toSet() + } + } } val kotlinSourceSet = createSourceSetInfo(sourceSet, gradleModule, resolverCtx) ?: continue @@ -439,6 +455,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtensionComp } } + mainModuleNode.kotlinNativeHome = mppModel.kotlinNativeHome mainModuleNode.coroutines = mppModel.extraFeatures.coroutinesState mainModuleNode.isHmpp = mppModel.extraFeatures.isHMPPEnabled //TODO improve passing version of used multiplatform diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt index 3cc09fa368d..ecd6fc295aa 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt @@ -30,9 +30,12 @@ import org.jetbrains.kotlin.idea.inspections.gradle.findAll import org.jetbrains.kotlin.idea.inspections.gradle.findKotlinPluginVersion import org.jetbrains.kotlin.idea.platform.IdePlatformKindTooling import org.jetbrains.kotlin.idea.roots.migrateNonJvmSourceFolders +import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.platform.impl.JvmIdePlatformKind +import org.jetbrains.kotlin.platform.impl.NativeIdePlatformKind import org.jetbrains.kotlin.platform.jvm.JvmPlatforms +import org.jetbrains.kotlin.platform.konan.NativePlatforms import org.jetbrains.plugins.gradle.model.data.BuildScriptClasspathData import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData @@ -102,13 +105,17 @@ class KotlinSourceSetDataService : AbstractProjectDataService + when (platformKind) { is JvmIdePlatformKind -> { - val target = JvmTarget.fromString(moduleData.targetCompatibility ?: "") ?: JvmTarget.DEFAULT - JvmPlatforms.jvmPlatformByTargetVersion(target).componentPlatforms + val jvmTarget = JvmTarget.fromString(moduleData.targetCompatibility ?: "") ?: JvmTarget.DEFAULT + JvmPlatforms.jvmPlatformByTargetVersion(jvmTarget).componentPlatforms } - else -> it.defaultPlatform.componentPlatforms + is NativeIdePlatformKind -> { + val nativeTargets = moduleData.konanTargets.mapNotNull { KonanTarget.predefinedTargets[it] } + NativePlatforms.nativePlatformByTargets(nativeTargets) + } + else -> platformKind.defaultPlatform.componentPlatforms } } .distinct() @@ -174,4 +181,13 @@ class KotlinSourceSetDataService : AbstractProjectDataService + get() { + val value = getProperty(KOTLIN_NATIVE_TARGETS_PROPERTY) ?: return emptySet() + return if (value.isNotEmpty()) value.split(',').toSet() else emptySet() + } + set(value) = setProperty(KOTLIN_NATIVE_TARGETS_PROPERTY, value.takeIf { it.isNotEmpty() }?.joinToString(","))