Support pureKotlinSourceFolders for MPP projects
#KT-34271 Fixed #KT-32963 Fixed
This commit is contained in:
@@ -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<JpsModuleSourceRootType<JavaSourceRootPro
|
||||
|
||||
private fun Module.getNonGeneratedKotlinSourceRoots(): List<VirtualFile> {
|
||||
val result = mutableListOf<VirtualFile>()
|
||||
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<VirtualFile> {
|
||||
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
|
||||
|
||||
+7
-1
@@ -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<DataNode<GradleSourceSetData>>
|
||||
for (gradleSourceSetNode in gradleSourceSets) {
|
||||
val propertiesForSourceSet =
|
||||
|
||||
+10
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -84,7 +84,9 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
|
||||
null
|
||||
}?.toString()?.toBoolean() ?: DEFAULT_IMPORT_ORPHAN_SOURCE_SETS
|
||||
) return sourceSets
|
||||
val compiledSourceSets: Collection<String> = targets.flatMap { it.compilations }.flatMap { it.sourceSets }.flatMap { it.dependsOnSourceSets.union(listOf(it.name)) }.distinct()
|
||||
val compiledSourceSets: Collection<String> =
|
||||
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 ->
|
||||
|
||||
@@ -60,12 +60,12 @@ private fun Task.getIsIncremental(): Boolean? {
|
||||
return null
|
||||
}
|
||||
|
||||
private fun Task.getPureKotlinSourceRoots(sourceSet: String): List<File>? {
|
||||
private fun Task.getPureKotlinSourceRoots(sourceSet: String, classifier: String? = null): List<File>? {
|
||||
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<Any>)?.asMap?.get(sourceSet) ?: return null
|
||||
as? FactoryNamedDomainObjectContainer<Any>)?.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()
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user