From 39b2cd10274320e17ca4e823b8c0e565fd0121ae Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 12 Apr 2021 15:54:20 +0200 Subject: [PATCH] FIR: do not provide symbols with different ClassId in JavaSymbolProvider JavaSymbolProvider uses KotlinPsiElementFinderWrapper for finding classes. CliFinder looks for Java classing assuming that class with ClassId=a/b/C lives in directory a/b and do not look into real package name of Java class. This causes that we may find some classes which we should not see from current scope. Also, the IDE implementation works correctly here (it also checks file package) which cause different behaviour of FIR IDE and FIR This change also requires to fix testdata and make Java classes live in directory consistent with file package --- .../diagnostics/testIllegalAnnotationClass.fir.txt | 2 +- .../resolve/diagnostics/testIllegalAnnotationClass.kt | 4 ++-- .../problems/multipleJavaClassesInOneFile.fir.txt | 2 +- .../resolve/problems/multipleJavaClassesInOneFile.kt | 3 ++- .../j+k/IntersectionTypesProblem.fir.txt | 4 ++-- .../resolveWithStdlib/j+k/IntersectionTypesProblem.kt | 6 +++--- .../jetbrains/kotlin/fir/java/JavaSymbolProvider.kt | 11 +++-------- 7 files changed, 14 insertions(+), 18 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt index 7b7af18f200..2308301aeae 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.fir.txt @@ -1,5 +1,5 @@ FILE: KotlinImporterComponent.kt - @R|State|(name = String(AutoImportedSourceRoots)) public final class KotlinImporterComponent : R|kotlin/Any| { + @R|simulation/State|(name = String(AutoImportedSourceRoots)) public final class KotlinImporterComponent : R|kotlin/Any| { public constructor(): R|simulation/KotlinImporterComponent| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.kt index 2c91b6ebf20..e97a57bd160 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/testIllegalAnnotationClass.kt @@ -1,6 +1,6 @@ -// FILE: State.java +// FILE: simulation/State.java -package simulation +package simulation; @Retention(RetentionPolicy.RUNTIME) public @interface State { diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt index 0ce35a2e3ce..fccf24ca5b8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt @@ -1,5 +1,5 @@ FILE: main.kt public final fun test(): R|kotlin/Unit| { - lval some: R|Some| = R|/Some.Some|() + lval some: R|foo/Some| = R|foo/Some.Some|() lval another: R|ERROR CLASS: Unresolved name: Another| = #() } diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.kt b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.kt index 1ba85216a6c..cf7361f6633 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.kt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.kt @@ -1,4 +1,4 @@ -// FILE: Some.java +// FILE: foo/Some.java package foo; @@ -7,6 +7,7 @@ class Some {} class Another {} // FILE: main.kt +package foo fun test() { val some = Some() diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt index 3dabd7ee17c..dd0d35c3280 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.fir.txt @@ -2,6 +2,6 @@ FILE: test.kt public final fun select(x: R|K|, y: R|K|): R|K| { ^select R|/x| } - public final fun test(d1: R|DiagnosticWithParameters1<*, *>|, d2: R|DiagnosticWithParameters2<*, *, *>|): R|kotlin/Unit| { - lval res: R|ft| = R|jvm/select||>(R|/d1|.R|/DiagnosticWithParameters1.a|, R|/d2|.R|/DiagnosticWithParameters2.b|) + public final fun test(d1: R|jvm/DiagnosticWithParameters1<*, *>|, d2: R|jvm/DiagnosticWithParameters2<*, *, *>|): R|kotlin/Unit| { + lval res: R|ft| = R|jvm/select||>(R|/d1|.R|jvm/DiagnosticWithParameters1.a|, R|/d2|.R|jvm/DiagnosticWithParameters2.b|) } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.kt index c8c9797f869..b16c925f5e4 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.kt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/IntersectionTypesProblem.kt @@ -1,10 +1,10 @@ -// FILE: Diagnostic.java +// FILE: jvm/Diagnostic.java package jvm; public interface Diagnostic {} -// FILE: DiagnosticWithParameters1.java +// FILE: jvm/DiagnosticWithParameters1.java package jvm; @@ -12,7 +12,7 @@ public interface DiagnosticWithParameters1 extends Diagnostic { A getA(); } -// FILE: DiagnosticWithParameters2.java +// FILE: jvm/DiagnosticWithParameters2.java package jvm; diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 217d746e28d..5caf08692e8 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -156,7 +156,7 @@ class JavaSymbolProvider( ): Pair { val foundClass = findClass(classId, content) return if (foundClass == null || - foundClass.hasDifferentRelativeClassName(classId) || + foundClass.hasDifferentClassId(classId) || foundClass.hasMetadataAnnotation() ) { null to null @@ -166,13 +166,8 @@ class JavaSymbolProvider( } } - - /** - * We do not check the package because we can look for the class in the same package by class name without package specified. - * In this case, found [JavaClass] may have different `packageFqName`, but not `relativeClassName`. - */ - private fun JavaClass.hasDifferentRelativeClassName(lookupClassId: ClassId): Boolean = - classId?.relativeClassName != lookupClassId.relativeClassName + private fun JavaClass.hasDifferentClassId(lookupClassId: ClassId): Boolean = + classId != lookupClassId private fun JavaClass.hasMetadataAnnotation(): Boolean = annotations.any { it.classId?.asSingleFqName() == JvmAnnotationNames.METADATA_FQ_NAME }