[Symbol LC] add parents for the local classes

This commit is contained in:
Ilya Kirillov
2022-07-09 17:57:12 +02:00
parent c55a6c1453
commit 95744062c1
3 changed files with 14 additions and 2 deletions
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
import org.jetbrains.kotlin.asJava.classes.getParentForLocalDeclaration
import org.jetbrains.kotlin.light.classes.symbol.classes.* import org.jetbrains.kotlin.light.classes.symbol.classes.*
import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -89,6 +90,9 @@ internal class FirLightAnonymousClassForSymbol(
override fun getOwnInnerClasses(): List<PsiClass> = _ownInnerClasses override fun getOwnInnerClasses(): List<PsiClass> = _ownInnerClasses
override fun getParent(): PsiElement? =
kotlinOrigin?.let(::getParentForLocalDeclaration)
override fun getScope(): PsiElement? = parent override fun getScope(): PsiElement? = parent
override fun getInterfaces(): Array<PsiClass> = PsiClassImplUtil.getInterfaces(this) override fun getInterfaces(): Array<PsiClass> = PsiClassImplUtil.getInterfaces(this)
override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this) override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this)
@@ -15,7 +15,9 @@ import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.*
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject
import org.jetbrains.kotlin.asJava.classes.getParentForLocalDeclaration
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.KtLightField import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod import org.jetbrains.kotlin.asJava.elements.KtLightMethod
@@ -31,6 +33,7 @@ import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
import org.jetbrains.kotlin.utils.addToStdlib.applyIf import org.jetbrains.kotlin.utils.addToStdlib.applyIf
import org.jetbrains.kotlin.utils.addToStdlib.ifFalse import org.jetbrains.kotlin.utils.addToStdlib.ifFalse
import org.jetbrains.kotlin.utils.addToStdlib.ifTrue import org.jetbrains.kotlin.utils.addToStdlib.ifTrue
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
context(KtAnalysisSession) context(KtAnalysisSession)
internal abstract class FirLightClassForClassOrObjectSymbol( internal abstract class FirLightClassForClassOrObjectSymbol(
@@ -204,7 +207,12 @@ internal abstract class FirLightClassForClassOrObjectSymbol(
return null return null
} }
override fun getParent(): PsiElement? = containingClass ?: containingFile override fun getParent(): PsiElement? {
if (classOrObjectSymbol.safeAs<KtSymbolWithKind>()?.symbolKind == KtSymbolKind.LOCAL) {
return kotlinOrigin?.let(::getParentForLocalDeclaration)
}
return containingClass ?: containingFile
}
override fun getScope(): PsiElement? = parent override fun getScope(): PsiElement? = parent
@@ -30,7 +30,7 @@ open class KtUltraLightClassForLocalDeclaration(
override fun getParent() = _parent override fun getParent() = _parent
} }
private fun getParentForLocalDeclaration(classOrObject: KtClassOrObject): PsiElement? { fun getParentForLocalDeclaration(classOrObject: KtClassOrObject): PsiElement? {
fun getParentByPsiMethod(method: PsiMethod?, name: String?, forceMethodWrapping: Boolean): PsiElement? { fun getParentByPsiMethod(method: PsiMethod?, name: String?, forceMethodWrapping: Boolean): PsiElement? {
if (method == null || name == null) return null if (method == null || name == null) return null