From f5e83d7b474603d35d36ab1412044c02c6d79172 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Fri, 31 May 2019 17:44:06 +0700 Subject: [PATCH] Explicit package prefix should override implicit #KT-29716 Fixed --- .../src/org/jetbrains/kotlin/idea/core/packageUtils.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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 95c7afbfa41..4e9c452d5ca 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.project.Project import com.intellij.openapi.roots.ModulePackageIndex import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.vfs.VirtualFile @@ -22,6 +23,7 @@ import org.jetbrains.jps.model.module.JpsModuleSourceRootType 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.roots.invalidateProjectRoots import org.jetbrains.kotlin.idea.util.rootManager import org.jetbrains.kotlin.idea.util.sourceRoot @@ -39,13 +41,16 @@ fun PsiFile.getFqNameByDirectory(): FqName { fun PsiDirectory.getFqNameWithImplicitPrefix(): FqName { val packageFqName = getPackage()?.qualifiedName?.let(::FqName) ?: FqName.ROOT - sourceRoot?.let { sourceRoot -> + sourceRoot?.takeIf { !it.hasExplicitPackagePrefix(project) }?.let { sourceRoot -> val implicitPrefix = PerModulePackageCacheService.getInstance(project).getImplicitPackagePrefix(sourceRoot) return FqName.fromSegments((implicitPrefix.pathSegments() + packageFqName.pathSegments()).map { it.asString() }) } return packageFqName } +private fun VirtualFile.hasExplicitPackagePrefix(project: Project): Boolean = + toPsiDirectory(project)?.getPackage()?.qualifiedName?.isNotEmpty() == true + fun KtFile.packageMatchesDirectory(): Boolean = packageFqName == getFqNameByDirectory() fun KtFile.packageMatchesDirectoryOrImplicit() =