FIR: Support nested light classes

This commit is contained in:
Denis.Zharkov
2021-11-09 18:50:20 +03:00
committed by teamcityserver
parent 8ea97758c0
commit 6f55d23bab
6 changed files with 64 additions and 7 deletions
@@ -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<*> {