From 6f55d23bab52c1dd444fdaa3a44cc69c7b6931d5 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Tue, 9 Nov 2021 18:50:20 +0300 Subject: [PATCH] FIR: Support nested light classes --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++++ ...irOldFrontendDiagnosticsTestGenerated.java | 6 +++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++++ .../kotlin/fir/java/FirJavaElementFinder.kt | 24 +++++++++++++------ .../diagnostics/tests/j+k/innerLightClass.kt | 23 ++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 6 files changed, 64 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/innerLightClass.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index c5480109560..2e0aa3b0131 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -17159,6 +17159,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/j+k/InnerClassFromJava.kt"); } + @Test + @TestMetadata("innerLightClass.kt") + public void testInnerLightClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/innerLightClass.kt"); + } + @Test @TestMetadata("innerNestedClassFromJava.kt") public void testInnerNestedClassFromJava() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index d02ba01cf22..b9ccfe18a03 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -17159,6 +17159,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/j+k/InnerClassFromJava.kt"); } + @Test + @TestMetadata("innerLightClass.kt") + public void testInnerLightClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/innerLightClass.kt"); + } + @Test @TestMetadata("innerNestedClassFromJava.kt") public void testInnerNestedClassFromJava() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 6c95a6b67ab..d25ee4569a5 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -17159,6 +17159,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/j+k/InnerClassFromJava.kt"); } + @Test + @TestMetadata("innerLightClass.kt") + public void testInnerLightClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/innerLightClass.kt"); + } + @Test @TestMetadata("innerNestedClassFromJava.kt") public void testInnerNestedClassFromJava() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt index cb5d7747d22..9a022d181d0 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaElementFinder.kt @@ -37,9 +37,7 @@ import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.transformers.resolveSupertypesInTheAir import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.name.ClassId -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.StandardClassIds +import org.jetbrains.kotlin.name.* import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import org.jetbrains.kotlin.resolve.jvm.KotlinFinderMarker @@ -73,13 +71,25 @@ class FirJavaElementFinder( override fun findClass(qualifiedName: String, scope: GlobalSearchScope): PsiClass? { if (qualifiedName.endsWith(".")) return null - val classId = ClassId.topLevel(FqName(qualifiedName)) - val firClass = firProviders.firstNotNullOfOrNull { it.getFirClassifierByFqName(classId) as? FirRegularClass } ?: return null + val fqName = FqName(qualifiedName) - val fileStub = createJavaFileStub(classId.packageFqName, psiManager) + for (topLevelClass in generateSequence(fqName) { it.parentOrNull() }) { + if (topLevelClass.isRoot) break + val classId = ClassId.topLevel(topLevelClass) - return buildStub(firClass, fileStub).psi + val firClass = firProviders.firstNotNullOfOrNull { it.getFirClassifierByFqName(classId) as? FirRegularClass } ?: continue + + val fileStub = createJavaFileStub(classId.packageFqName, psiManager) + val topLevelResult = buildStub(firClass, fileStub).psi + val tail = fqName.tail(topLevelClass).pathSegments() + + return tail.fold(topLevelResult) { psiClass, segment -> + psiClass.findInnerClassByName(segment.identifier, false) ?: return null + } + } + + return null } private fun buildStub(firClass: FirRegularClass, parent: StubElement<*>): PsiClassStub<*> { diff --git a/compiler/testData/diagnostics/tests/j+k/innerLightClass.kt b/compiler/testData/diagnostics/tests/j+k/innerLightClass.kt new file mode 100644 index 00000000000..e5ed9c3eb86 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/innerLightClass.kt @@ -0,0 +1,23 @@ +// SKIP_TXT +// FIR_IDENTICAL +// FILE: A.java +import Outer.Middle; + +public class A { + public static void foo(Middle x) {} + public static void bar(Middle.Innermost x) {} + public static void baz(Outer x) {} +} + +// FILE: main.kt + +class Outer { + class Middle { + class Innermost + fun main(r: Middle, i: Innermost, o: Outer) { + A.foo(r) + A.bar(i) + A.baz(o) + } + } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 780a271c32c..1a1e6d4e406 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -17165,6 +17165,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/InnerClassFromJava.kt"); } + @Test + @TestMetadata("innerLightClass.kt") + public void testInnerLightClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/innerLightClass.kt"); + } + @Test @TestMetadata("innerNestedClassFromJava.kt") public void testInnerNestedClassFromJava() throws Exception {