From f4900851426771ac8e8bfd59c8fc7ae22e262dc8 Mon Sep 17 00:00:00 2001 From: Yaroslav Chernyshev Date: Fri, 3 Jul 2020 16:40:25 +0300 Subject: [PATCH] Support `pureKotlinSourceFolders` for MPP projects #KT-34271 Fixed #KT-32963 Fixed --- .../org/jetbrains/kotlin/idea/core/packageUtils.kt | 11 ++++++++++- .../KotlinGradleProjectResolverExtension.kt | 8 +++++++- .../configuration/KotlinMPPGradleProjectResolver.kt | 10 ++++++++++ .../src/KotlinGradleModelBuilder.kt | 2 +- .../src/KotlinMPPGradleModelBuilder.kt | 6 ++++-- .../src/KotlinTasksPropertyUtils.kt | 12 ++++++------ 6 files changed, 38 insertions(+), 11 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/packageUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/packageUtils.kt index 7d51bbb24f5..12a574459bf 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/packageUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/packageUtils.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.config.SourceKotlinRootType import org.jetbrains.kotlin.config.TestSourceKotlinRootType import org.jetbrains.kotlin.idea.caches.PerModulePackageCacheService import org.jetbrains.kotlin.idea.core.util.toPsiDirectory +import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.roots.invalidateProjectRoots import org.jetbrains.kotlin.idea.util.rootManager import org.jetbrains.kotlin.idea.util.sourceRoot @@ -95,6 +96,8 @@ private val kotlinSourceRootTypes: Set { val result = mutableListOf() + val facetSettings = KotlinFacet.get(this)?.configuration?.settings + val rootManager = ModuleRootManager.getInstance(this) for (contentEntry in rootManager.contentEntries) { val sourceFolders = contentEntry.getSourceFolders(kotlinSourceRootTypes) @@ -102,7 +105,13 @@ private fun Module.getNonGeneratedKotlinSourceRoots(): List { if (sourceFolder.jpsElement.getProperties(kotlinSourceRootTypes)?.isForGeneratedSources == true) { continue } - result.addIfNotNull(sourceFolder.file) + facetSettings?.pureKotlinSourceFolders?.also { pureKotlin -> + sourceFolder.file?.also { + if (it.path in pureKotlin) { + result += it + } + } + } ?: result.addIfNotNull(sourceFolder.file) } } return result diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt index 1256994d631..5c747d7d3b5 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt @@ -296,8 +296,14 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() val moduleNamePrefix = GradleProjectResolverUtil.getModuleId(resolverCtx, gradleModule) resolverCtx.getExtraProject(gradleModule, KotlinGradleModel::class.java)?.let { gradleModel -> KotlinGradleFUSLogger.populateGradleUserDir(gradleModel.gradleUserHome) - ideModule.pureKotlinSourceFolders = + val gradleModelPureKotlinSourceFolders = gradleModel.kotlinTaskProperties.flatMap { it.value.pureKotlinSourceFolders ?: emptyList() }.map { it.absolutePath } + ideModule.pureKotlinSourceFolders = + if (ideModule.pureKotlinSourceFolders.isEmpty()) + gradleModelPureKotlinSourceFolders + else + gradleModelPureKotlinSourceFolders + ideModule.pureKotlinSourceFolders + val gradleSourceSets = ideModule.children.filter { it.data is GradleSourceSetData } as Collection> for (gradleSourceSetNode in gradleSourceSets) { val propertiesForSourceSet = 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 0d247b3ff91..e2b778c6164 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 @@ -544,6 +544,16 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtensionComp } ideModule.createChild(ProjectKeys.CONTENT_ROOT, ideContentRoot) } + + val mppModelPureKotlinSourceFolders = mppModel.targets.flatMap { it.compilations } + .flatMap { it.kotlinTaskProperties.pureKotlinSourceFolders ?: emptyList() } + .map { it.absolutePath } + + ideModule.pureKotlinSourceFolders = + if (ideModule.pureKotlinSourceFolders.isEmpty()) + mppModelPureKotlinSourceFolders + else + mppModelPureKotlinSourceFolders + ideModule.pureKotlinSourceFolders } private data class CompilationWithDependencies( diff --git a/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt index 84a7f303c79..49e08639c04 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinGradleModelBuilder.kt @@ -178,7 +178,7 @@ class KotlinGradleModelBuilder : AbstractKotlinGradleModelBuilder() { val defaultArguments = compileTask.getCompilerArguments("getDefaultSerializedCompilerArguments").orEmpty() val dependencyClasspath = compileTask.getDependencyClasspath() compilerArgumentsBySourceSet[sourceSetName] = ArgsInfoImpl(currentArguments, defaultArguments, dependencyClasspath) - extraProperties.acknowledgeTask(compileTask) + extraProperties.acknowledgeTask(compileTask, null) } val platform = platformPluginId ?: pluginToPlatform.entries.singleOrNull { project.plugins.findPlugin(it.key) != null }?.value diff --git a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt index 19c8f6aed8e..9465fd80f3f 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinMPPGradleModelBuilder.kt @@ -84,7 +84,9 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { null }?.toString()?.toBoolean() ?: DEFAULT_IMPORT_ORPHAN_SOURCE_SETS ) return sourceSets - val compiledSourceSets: Collection = targets.flatMap { it.compilations }.flatMap { it.sourceSets }.flatMap { it.dependsOnSourceSets.union(listOf(it.name)) }.distinct() + val compiledSourceSets: Collection = + targets.flatMap { it.compilations }.flatMap { it.sourceSets }.flatMap { it.dependsOnSourceSets.union(listOf(it.name)) } + .distinct() sourceSets.filter { !compiledSourceSets.contains(it.key) }.forEach { logger.warn("[sync warning] Source set \"${it.key}\" is not compiled with any compilation. This source set is not imported in the IDE.") } @@ -565,7 +567,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService { val dependencyClasspath = buildDependencyClasspath(compileKotlinTask) val dependencies = buildCompilationDependencies(gradleCompilation, classifier, sourceSetMap, dependencyResolver, project, dependencyMapper) - val kotlinTaskProperties = getKotlinTaskProperties(compileKotlinTask) + val kotlinTaskProperties = getKotlinTaskProperties(compileKotlinTask, classifier) // Get konanTarget (for native compilations only). val konanTarget = compilationClass.getMethodOrNull("getKonanTarget")?.let { getKonanTarget -> diff --git a/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt b/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt index 75c0518ead7..c6eb798a3a2 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt @@ -60,12 +60,12 @@ private fun Task.getIsIncremental(): Boolean? { return null } -private fun Task.getPureKotlinSourceRoots(sourceSet: String): List? { +private fun Task.getPureKotlinSourceRoots(sourceSet: String, classifier: String? = null): List? { try { val kotlinExtensionClass = project.extensions.findByType(javaClass.classLoader.loadClass(kotlinProjectExtensionClass)) val getKotlinMethod = javaClass.classLoader.loadClass(kotlinSourceSetClass).getMethod("getKotlin") val kotlinSourceSet = (kotlinExtensionClass?.javaClass?.getMethod("getSourceSets")?.invoke(kotlinExtensionClass) - as? FactoryNamedDomainObjectContainer)?.asMap?.get(sourceSet) ?: return null + as? FactoryNamedDomainObjectContainer)?.asMap?.get(compilationFullName(sourceSet, classifier)) ?: return null val javaSourceSet = (project.convention.getPlugin(JavaPluginConvention::class.java) as JavaPluginConvention).sourceSets.asMap[sourceSet] val pureJava = javaSourceSet?.java?.srcDirs @@ -89,16 +89,16 @@ private fun Task.getKotlinPluginVersion(): String? { return null } -fun KotlinTaskPropertiesBySourceSet.acknowledgeTask(compileTask: Task) { +fun KotlinTaskPropertiesBySourceSet.acknowledgeTask(compileTask: Task, classifier: String?) { this[compileTask.getSourceSetName()] = - getKotlinTaskProperties(compileTask) + getKotlinTaskProperties(compileTask, classifier) } -fun getKotlinTaskProperties(compileTask: Task): KotlinTaskPropertiesImpl { +fun getKotlinTaskProperties(compileTask: Task, classifier: String?): KotlinTaskPropertiesImpl { return KotlinTaskPropertiesImpl( compileTask.getIsIncremental(), compileTask.getPackagePrefix(), - compileTask.getPureKotlinSourceRoots(compileTask.getSourceSetName()), + compileTask.getPureKotlinSourceRoots(compileTask.getSourceSetName(), classifier), compileTask.getKotlinPluginVersion() ) }