FIR: Support nested light classes
This commit is contained in:
committed by
teamcityserver
parent
8ea97758c0
commit
6f55d23bab
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
+6
@@ -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 {
|
||||
|
||||
@@ -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<*> {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Generated
+6
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user