From 2b153d5c10860b536ff466024c5c2d50dcd80e0d Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Tue, 6 Jun 2017 22:08:11 +0300 Subject: [PATCH] Improve search for facade light class by kotlin file LightClassUtil#getWrappingClass works for clashing facade fq names #KT-17855 Fixed --- .../org/jetbrains/kotlin/asJava/LightClassUtil.kt | 15 ++++++++++++--- .../mainInTwoModules/before/A/src/part1A.kt | 8 ++++++++ .../mainInTwoModules/before/A/src/part2A.kt | 9 +++++++++ .../before/A/src/{main.kt => simpleMain.kt} | 2 ++ .../mainInTwoModules/before/B/src/part1B.kt | 8 ++++++++ .../mainInTwoModules/before/B/src/part2B.kt | 8 ++++++++ .../before/B/src/{main.kt => simpleMain.kt} | 2 ++ .../mainInTwoModules/expected.xml | 14 ++++++++++++++ 8 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part1A.kt create mode 100644 idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part2A.kt rename idea/testData/multiFileInspections/mainInTwoModules/before/A/src/{main.kt => simpleMain.kt} (68%) create mode 100644 idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part1B.kt create mode 100644 idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part2B.kt rename idea/testData/multiFileInspections/mainInTwoModules/before/B/src/{main.kt => simpleMain.kt} (68%) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt index 958e9442c7f..7203f792fed 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassUtil.kt @@ -153,9 +153,7 @@ object LightClassUtil { if (parent is KtFile) { // top-level declaration - val fqName = parent.javaFileFacadeFqName - val project = declaration.project - return JavaElementFinder.getInstance(project).findClass(fqName.asString(), GlobalSearchScope.allScope(project)) + return findFileFacade(parent) } else if (parent is KtClassBody) { assert(parent.parent is KtClassOrObject) @@ -165,6 +163,17 @@ object LightClassUtil { return null } + private fun findFileFacade(ktFile: KtFile): PsiClass? { + val fqName = ktFile.javaFileFacadeFqName + val project = ktFile.project + val classesWithMatchingFqName = JavaElementFinder.getInstance(project).findClasses(fqName.asString(), GlobalSearchScope.allScope(project)) + return classesWithMatchingFqName.singleOrNull() ?: + classesWithMatchingFqName.find { + // NOTE: for multipart facades this works via FakeLightClassForFileOfPackage + it.containingFile?.virtualFile == ktFile.virtualFile + } + } + private fun getWrappingClasses(declaration: KtDeclaration): Sequence { val wrapperClass = getWrappingClass(declaration) ?: return emptySequence() val wrapperClassOrigin = (wrapperClass as KtLightClass).kotlinOrigin diff --git a/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part1A.kt b/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part1A.kt new file mode 100644 index 00000000000..35159feaeea --- /dev/null +++ b/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part1A.kt @@ -0,0 +1,8 @@ +@file:JvmName("MultiPart") +@file:JvmMultifileClass + +package test.multiPart + +fun main(args: Array) { + +} diff --git a/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part2A.kt b/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part2A.kt new file mode 100644 index 00000000000..d3cfbae5d03 --- /dev/null +++ b/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/part2A.kt @@ -0,0 +1,9 @@ +@file:JvmName("MultiPart") +@file:JvmMultifileClass + +package test.multiPart + +fun other() { + +} + diff --git a/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/main.kt b/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/simpleMain.kt similarity index 68% rename from idea/testData/multiFileInspections/mainInTwoModules/before/A/src/main.kt rename to idea/testData/multiFileInspections/mainInTwoModules/before/A/src/simpleMain.kt index adb5b33c573..17cf007fcba 100644 --- a/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/main.kt +++ b/idea/testData/multiFileInspections/mainInTwoModules/before/A/src/simpleMain.kt @@ -1,3 +1,5 @@ +package simple + fun main(args: Array) { } \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part1B.kt b/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part1B.kt new file mode 100644 index 00000000000..2d4e9e84e83 --- /dev/null +++ b/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part1B.kt @@ -0,0 +1,8 @@ +@file:JvmName("MultiPart") +@file:JvmMultifileClass + +package test.multiPart + +fun other() { + +} \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part2B.kt b/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part2B.kt new file mode 100644 index 00000000000..4e9eabe857f --- /dev/null +++ b/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/part2B.kt @@ -0,0 +1,8 @@ +@file:JvmName("MultiPart") +@file:JvmMultifileClass + +package test.multiPart + +fun main(args: Array) { + +} \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/main.kt b/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/simpleMain.kt similarity index 68% rename from idea/testData/multiFileInspections/mainInTwoModules/before/B/src/main.kt rename to idea/testData/multiFileInspections/mainInTwoModules/before/B/src/simpleMain.kt index adb5b33c573..17cf007fcba 100644 --- a/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/main.kt +++ b/idea/testData/multiFileInspections/mainInTwoModules/before/B/src/simpleMain.kt @@ -1,3 +1,5 @@ +package simple + fun main(args: Array) { } \ No newline at end of file diff --git a/idea/testData/multiFileInspections/mainInTwoModules/expected.xml b/idea/testData/multiFileInspections/mainInTwoModules/expected.xml index 26f3337ce90..683aa1828fa 100644 --- a/idea/testData/multiFileInspections/mainInTwoModules/expected.xml +++ b/idea/testData/multiFileInspections/mainInTwoModules/expected.xml @@ -1,3 +1,17 @@ + + part2A.kt + 6 + + Unused symbol + Function ''other'' is never used + + + part1B.kt + 6 + + Unused symbol + Function ''other'' is never used + \ No newline at end of file