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 bab2d27203b..8a87a168913 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 @@ -10,6 +10,7 @@ import com.intellij.openapi.application.WriteAction import com.intellij.openapi.application.runWriteAction import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleUtil +import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ModulePackageIndex import com.intellij.openapi.roots.ModuleRootManager @@ -32,7 +33,6 @@ import org.jetbrains.kotlin.idea.util.rootManager import org.jetbrains.kotlin.idea.util.sourceRoot import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.utils.addIfNotNull import java.io.File import java.net.URI import java.nio.file.Paths @@ -81,7 +81,12 @@ private fun findLongestExistingPackage(module: Module, packageName: String): Psi while (true) { val vFiles = ModulePackageIndex.getInstance(module).getDirsByPackageName(nameToMatch, false) val directory = getWritableModuleDirectory(vFiles, module, manager) - if (directory != null) return directory.getPackage() + if (directory != null + && module.pureKotlinSourceFolders?.any { + directory.virtualFile.path.startsWith(it, true) + } == true + ) + return directory.getPackage() val lastDotIndex = nameToMatch.lastIndexOf('.') if (lastDotIndex < 0) { @@ -99,7 +104,7 @@ private val Module.pureKotlinSourceFolders: List? private fun Module.getNonGeneratedKotlinSourceRoots(): List { val result = mutableListOf() - val pureKotlinSourceFolders = this.pureKotlinSourceFolders + val modulesToPureKotlinSourceFolders = mutableMapOf(this to pureKotlinSourceFolders) val rootManager = ModuleRootManager.getInstance(this) for (contentEntry in rootManager.contentEntries) { @@ -109,13 +114,16 @@ private fun Module.getNonGeneratedKotlinSourceRoots(): List { continue } - pureKotlinSourceFolders?.also { pureKotlin -> - sourceFolder.file?.also { - if (it.path in pureKotlin) { - result += it - } + sourceFolder.file?.let { + val moduleForFile = ModuleUtilCore.findModuleForFile(it, project) + if (moduleForFile == null) return@let + + val modulePureKotlinSourceFolders = + modulesToPureKotlinSourceFolders.getOrPut(moduleForFile, moduleForFile::pureKotlinSourceFolders) + if (modulePureKotlinSourceFolders?.any { pure -> it.path.startsWith(pure, true) } == true) { + result += it } - } ?: result.addIfNotNull(sourceFolder.file) + } } } return result @@ -159,14 +167,23 @@ fun findOrCreateDirectoryForPackage(module: Module, packageName: String): PsiDir if (subPackageName.isNotEmpty()) { postfixToShow = File.separatorChar + postfixToShow } - val pureKotlinSourceFolders = module.pureKotlinSourceFolders + val modulesToPureKotlinSourceFolders = mutableMapOf(module to module.pureKotlinSourceFolders) val moduleDirectories = getPackageDirectoriesInModule(rootPackage, module) - .filter { directory -> - pureKotlinSourceFolders?.any { directory.virtualFile.path.startsWith(it, true) } ?: true - }.toTypedArray() + val result = mutableListOf() + moduleDirectories.forEach { directory -> + val directoryModule = ModuleUtilCore.findModuleForFile(directory.virtualFile, module.project) + if (directoryModule != null) { + val modulePureKotlinSourceFolders = + modulesToPureKotlinSourceFolders.getOrPut(directoryModule, directoryModule::pureKotlinSourceFolders) + + if (modulePureKotlinSourceFolders?.any { directory.virtualFile.path.startsWith(it, true) } == true) { + result += directory + } + } + } existingDirectoryByPackage = - DirectoryChooserUtil.selectDirectory(project, moduleDirectories, null, postfixToShow) ?: return null + DirectoryChooserUtil.selectDirectory(project, result.toTypedArray(), null, postfixToShow) ?: return null restOfName = subPackageName } } diff --git a/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt b/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt index 3cad2c2031a..6ad6e9aa12b 100644 --- a/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt +++ b/idea/kotlin-gradle-tooling/src/KotlinTasksPropertyUtils.kt @@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder.Companion.ko import org.jetbrains.kotlin.gradle.AbstractKotlinGradleModelBuilder.Companion.kotlinSourceSetClass import java.io.File import java.io.Serializable -import java.lang.Exception interface KotlinTaskProperties : Serializable { val incremental: Boolean? @@ -64,8 +63,9 @@ private fun Task.getPureKotlinSourceRoots(sourceSet: String, disambiguationClass try { val kotlinExtensionClass = project.extensions.findByType(javaClass.classLoader.loadClass(kotlinProjectExtensionClass)) val getKotlinMethod = javaClass.classLoader.loadClass(kotlinSourceSetClass).getMethod("getKotlin") + val classifier = if (disambiguationClassifier == "metadata") "common" else disambiguationClassifier val kotlinSourceSet = (kotlinExtensionClass?.javaClass?.getMethod("getSourceSets")?.invoke(kotlinExtensionClass) - as? FactoryNamedDomainObjectContainer)?.asMap?.get(compilationFullName(sourceSet, disambiguationClassifier)) ?: 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