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");
|
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
|
@Test
|
||||||
@TestMetadata("innerNestedClassFromJava.kt")
|
@TestMetadata("innerNestedClassFromJava.kt")
|
||||||
public void testInnerNestedClassFromJava() throws Exception {
|
public void testInnerNestedClassFromJava() throws Exception {
|
||||||
|
|||||||
+6
@@ -17159,6 +17159,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
|
|||||||
runTest("compiler/testData/diagnostics/tests/j+k/InnerClassFromJava.kt");
|
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
|
@Test
|
||||||
@TestMetadata("innerNestedClassFromJava.kt")
|
@TestMetadata("innerNestedClassFromJava.kt")
|
||||||
public void testInnerNestedClassFromJava() throws Exception {
|
public void testInnerNestedClassFromJava() throws Exception {
|
||||||
|
|||||||
+6
@@ -17159,6 +17159,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
|
|||||||
runTest("compiler/testData/diagnostics/tests/j+k/InnerClassFromJava.kt");
|
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
|
@Test
|
||||||
@TestMetadata("innerNestedClassFromJava.kt")
|
@TestMetadata("innerNestedClassFromJava.kt")
|
||||||
public void testInnerNestedClassFromJava() throws Exception {
|
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.resolve.transformers.resolveSupertypesInTheAir
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType
|
||||||
import org.jetbrains.kotlin.resolve.jvm.KotlinFinderMarker
|
import org.jetbrains.kotlin.resolve.jvm.KotlinFinderMarker
|
||||||
|
|
||||||
@@ -73,13 +71,25 @@ class FirJavaElementFinder(
|
|||||||
|
|
||||||
override fun findClass(qualifiedName: String, scope: GlobalSearchScope): PsiClass? {
|
override fun findClass(qualifiedName: String, scope: GlobalSearchScope): PsiClass? {
|
||||||
if (qualifiedName.endsWith(".")) return null
|
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<*> {
|
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");
|
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
|
@Test
|
||||||
@TestMetadata("innerNestedClassFromJava.kt")
|
@TestMetadata("innerNestedClassFromJava.kt")
|
||||||
public void testInnerNestedClassFromJava() throws Exception {
|
public void testInnerNestedClassFromJava() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user