FIR IDE: make KtAnonymousObject symbol to extend KtClassObjectSymbol

This commit is contained in:
Ilya Kirillov
2021-03-12 15:14:35 +01:00
parent 08433b9ac9
commit cf30be5957
46 changed files with 172 additions and 132 deletions
@@ -28,7 +28,7 @@ internal object KotlinFirIconProvider {
} }
if (symbol is KtClassOrObjectSymbol) { if (symbol is KtClassOrObjectSymbol) {
val isAbstract = symbol.modality == KtCommonSymbolModality.ABSTRACT val isAbstract = (symbol as? KtNamedClassOrObjectSymbol)?.modality == KtCommonSymbolModality.ABSTRACT
return when (symbol.classKind) { return when (symbol.classKind) {
KtClassKind.CLASS -> if (isAbstract) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS KtClassKind.CLASS -> if (isAbstract) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS
@@ -36,6 +36,7 @@ internal object KotlinFirIconProvider {
KtClassKind.ANNOTATION_CLASS -> KotlinIcons.ANNOTATION KtClassKind.ANNOTATION_CLASS -> KotlinIcons.ANNOTATION
KtClassKind.OBJECT, KtClassKind.COMPANION_OBJECT -> KotlinIcons.OBJECT KtClassKind.OBJECT, KtClassKind.COMPANION_OBJECT -> KotlinIcons.OBJECT
KtClassKind.INTERFACE -> KotlinIcons.INTERFACE KtClassKind.INTERFACE -> KotlinIcons.INTERFACE
KtClassKind.ANONYMOUS_OBJECT -> KotlinIcons.OBJECT
} }
} }
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtTypeArgumentList import org.jetbrains.kotlin.psi.KtTypeArgumentList
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
@@ -94,7 +95,8 @@ private data class VariableLookupObject(
private class ClassLookupElementFactory { private class ClassLookupElementFactory {
fun createLookup(symbol: KtClassLikeSymbol): LookupElementBuilder { fun createLookup(symbol: KtClassLikeSymbol): LookupElementBuilder {
return LookupElementBuilder.create(ClassifierLookupObject(symbol.name, symbol.classIdIfNonLocal), symbol.name.asString()) val name = symbol.nameOrAnonymous
return LookupElementBuilder.create(ClassifierLookupObject(name, symbol.classIdIfNonLocal), name.asString())
.withInsertHandler(ClassifierInsertionHandler) .withInsertHandler(ClassifierInsertionHandler)
} }
} }
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtNamedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind
import org.jetbrains.kotlin.idea.refactoring.CHECK_SUPER_METHODS_YES_NO_DIALOG import org.jetbrains.kotlin.idea.refactoring.CHECK_SUPER_METHODS_YES_NO_DIALOG
import org.jetbrains.kotlin.idea.refactoring.formatPsiClass import org.jetbrains.kotlin.idea.refactoring.formatPsiClass
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
class KotlinFindUsagesSupportFirImpl : KotlinFindUsagesSupport { class KotlinFindUsagesSupportFirImpl : KotlinFindUsagesSupport {
@@ -81,7 +82,7 @@ class KotlinFindUsagesSupportFirImpl : KotlinFindUsagesSupport {
val filteredDeclarations = val filteredDeclarations =
if (ignore != null) renderToPsi.filter { ignore.contains(it.first) } else renderToPsi if (ignore != null) renderToPsi.filter { ignore.contains(it.first) } else renderToPsi
val renderedClass = containingClass.name.asString() //TODO render class val renderedClass = containingClass.name?.asString() ?: SpecialNames.ANONYMOUS //TODO render class
AnalyzedModel(renderedClass, filteredDeclarations.toMap()) AnalyzedModel(renderedClass, filteredDeclarations.toMap())
} }
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.components
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
abstract class KtTypeProvider : KtAnalysisSessionComponent() { abstract class KtTypeProvider : KtAnalysisSessionComponent() {
@@ -14,7 +15,7 @@ abstract class KtTypeProvider : KtAnalysisSessionComponent() {
abstract fun approximateToSuperPublicDenotableType(type: KtType): KtType? abstract fun approximateToSuperPublicDenotableType(type: KtType): KtType?
abstract fun buildSelfClassType(symbol: KtClassOrObjectSymbol): KtType abstract fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType
} }
interface KtTypeProviderMixIn : KtAnalysisSessionMixIn { interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
@@ -30,7 +31,7 @@ interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
fun KtType.approximateToSuperPublicDenotable(): KtType? = fun KtType.approximateToSuperPublicDenotable(): KtType? =
analysisSession.typeProvider.approximateToSuperPublicDenotableType(this) analysisSession.typeProvider.approximateToSuperPublicDenotableType(this)
fun KtClassOrObjectSymbol.buildSelfClassType(): KtType = fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType =
analysisSession.typeProvider.buildSelfClassType(this) analysisSession.typeProvider.buildSelfClassType(this)
} }
@@ -1,19 +0,0 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.frontend.api.symbols
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtAnnotatedSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithMembers
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
abstract class KtAnonymousObjectSymbol : KtSymbolWithKind, KtAnnotatedSymbol, KtSymbolWithMembers {
abstract val superTypes: List<KtTypeAndAnnotations>
abstract override fun createPointer(): KtSymbolPointer<KtAnonymousObjectSymbol>
}
@@ -9,9 +9,14 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
sealed class KtClassifierSymbol : KtSymbol, KtNamedSymbol sealed class KtClassifierSymbol : KtSymbol, KtPossiblyNamedSymbol
val KtClassifierSymbol.nameOrAnonymous: Name
get() = name ?: SpecialNames.ANONYMOUS_FUNCTION
abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbol { abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbol {
abstract override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> abstract override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol>
@@ -21,13 +26,13 @@ abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbol {
abstract val isReified: Boolean abstract val isReified: Boolean
} }
sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtNamedSymbol, KtSymbolWithKind { sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtSymbolWithKind {
abstract val classIdIfNonLocal: ClassId? abstract val classIdIfNonLocal: ClassId?
abstract override fun createPointer(): KtSymbolPointer<KtClassLikeSymbol> abstract override fun createPointer(): KtSymbolPointer<KtClassLikeSymbol>
} }
abstract class KtTypeAliasSymbol : KtClassLikeSymbol() { abstract class KtTypeAliasSymbol : KtClassLikeSymbol(), KtNamedSymbol {
abstract override val classIdIfNonLocal: ClassId abstract override val classIdIfNonLocal: ClassId
final override val symbolKind: KtSymbolKind get() = KtSymbolKind.TOP_LEVEL final override val symbolKind: KtSymbolKind get() = KtSymbolKind.TOP_LEVEL
@@ -35,13 +40,30 @@ abstract class KtTypeAliasSymbol : KtClassLikeSymbol() {
abstract override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> abstract override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol>
} }
abstract class KtClassOrObjectSymbol : KtClassLikeSymbol(), sealed class KtClassOrObjectSymbol : KtClassLikeSymbol(),
KtAnnotatedSymbol,
KtSymbolWithMembers {
abstract val classKind: KtClassKind
abstract val superTypes: List<KtTypeAndAnnotations>
abstract override fun createPointer(): KtSymbolPointer<KtClassOrObjectSymbol>
}
abstract class KtAnonymousObjectSymbol : KtClassOrObjectSymbol() {
final override val classKind: KtClassKind get() = KtClassKind.ANONYMOUS_OBJECT
final override val classIdIfNonLocal: ClassId? get() = null
final override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL
final override val name: Name? get() = null
abstract override fun createPointer(): KtSymbolPointer<KtAnonymousObjectSymbol>
}
abstract class KtNamedClassOrObjectSymbol : KtClassOrObjectSymbol(),
KtSymbolWithTypeParameters, KtSymbolWithTypeParameters,
KtSymbolWithModality<KtSymbolModality>, KtSymbolWithModality<KtSymbolModality>,
KtSymbolWithVisibility, KtSymbolWithVisibility,
KtAnnotatedSymbol, KtNamedSymbol {
KtSymbolWithMembers {
abstract val classKind: KtClassKind
abstract val isInner: Boolean abstract val isInner: Boolean
abstract val isData: Boolean abstract val isData: Boolean
@@ -50,13 +72,11 @@ abstract class KtClassOrObjectSymbol : KtClassLikeSymbol(),
abstract val isExternal: Boolean abstract val isExternal: Boolean
abstract val companionObject: KtClassOrObjectSymbol? abstract val companionObject: KtNamedClassOrObjectSymbol?
abstract val superTypes: List<KtTypeAndAnnotations> abstract override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol>
abstract override fun createPointer(): KtSymbolPointer<KtClassOrObjectSymbol>
} }
enum class KtClassKind { enum class KtClassKind {
CLASS, ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, OBJECT, COMPANION_OBJECT, INTERFACE CLASS, ENUM_CLASS, ENUM_ENTRY, ANNOTATION_CLASS, OBJECT, COMPANION_OBJECT, INTERFACE, ANONYMOUS_OBJECT
} }
@@ -42,6 +42,7 @@ abstract class KtSymbolProvider : KtAnalysisSessionComponent() {
abstract fun getVariableSymbol(psi: KtProperty): KtVariableSymbol abstract fun getVariableSymbol(psi: KtProperty): KtVariableSymbol
abstract fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol abstract fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol
abstract fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol abstract fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol
abstract fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol
abstract fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol abstract fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol
abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol?
@@ -86,6 +87,9 @@ interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn {
fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol = fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol =
analysisSession.symbolProvider.getClassOrObjectSymbol(this) analysisSession.symbolProvider.getClassOrObjectSymbol(this)
fun KtClassOrObject.getNamedClassOrObjectSymbol(): KtNamedClassOrObjectSymbol =
analysisSession.symbolProvider.getNamedClassOrObjectSymbol(this)
fun KtPropertyAccessor.getPropertyAccessorSymbol(): KtPropertyAccessorSymbol = fun KtPropertyAccessor.getPropertyAccessorSymbol(): KtPropertyAccessorSymbol =
analysisSession.symbolProvider.getPropertyAccessorSymbol(this) analysisSession.symbolProvider.getPropertyAccessorSymbol(this)
@@ -10,8 +10,12 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.KtTypeParameterSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface KtNamedSymbol : KtSymbol { interface KtPossiblyNamedSymbol : KtSymbol {
val name: Name val name: Name?
}
interface KtNamedSymbol : KtPossiblyNamedSymbol {
abstract override val name: Name
} }
interface KtTypedSymbol : KtSymbol { interface KtTypedSymbol : KtSymbol {
@@ -14,14 +14,11 @@ import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.idea.asJava.FirLightClassForClassOrObjectSymbol import org.jetbrains.kotlin.idea.asJava.FirLightClassForClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.isValid
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtConstructorSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightAnnotationClassSymbol( internal class FirLightAnnotationClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager manager: PsiManager
) : FirLightInterfaceOrAnnotationClassSymbol(classOrObjectSymbol, manager) { ) : FirLightInterfaceOrAnnotationClassSymbol(classOrObjectSymbol, manager) {
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.psi.debugText.getDebugText
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
internal abstract class FirLightClassForClassOrObjectSymbol( internal abstract class FirLightClassForClassOrObjectSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager manager: PsiManager
) : FirLightClassBase(manager), ) : FirLightClassBase(manager),
StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> { StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
@@ -19,7 +19,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithVisibi
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
internal class FirLightClassForSymbol( internal class FirLightClassForSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager manager: PsiManager
) : FirLightClassForClassOrObjectSymbol(classOrObjectSymbol, manager) { ) : FirLightClassForClassOrObjectSymbol(classOrObjectSymbol, manager) {
@@ -17,10 +17,11 @@ import org.jetbrains.kotlin.idea.frontend.api.isValid
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFunctionSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightInterfaceClassSymbol( internal class FirLightInterfaceClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager manager: PsiManager
) : FirLightInterfaceOrAnnotationClassSymbol(classOrObjectSymbol, manager) { ) : FirLightInterfaceOrAnnotationClassSymbol(classOrObjectSymbol, manager) {
@@ -11,10 +11,11 @@ import org.jetbrains.kotlin.idea.asJava.*
import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.isValid
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind
internal abstract class FirLightInterfaceOrAnnotationClassSymbol( internal abstract class FirLightInterfaceOrAnnotationClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol, private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager manager: PsiManager
) : FirLightClassForClassOrObjectSymbol(classOrObjectSymbol, manager) { ) : FirLightClassForClassOrObjectSymbol(classOrObjectSymbol, manager) {
@@ -68,11 +68,13 @@ fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? =
else -> { else -> {
analyze(classOrObject) { analyze(classOrObject) {
val symbol = classOrObject.getClassOrObjectSymbol() when (val symbol = classOrObject.getClassOrObjectSymbol()) {
when (symbol.classKind) { is KtAnonymousObjectSymbol -> FirLightAnonymousClassForSymbol(symbol, classOrObject.manager)
KtClassKind.INTERFACE -> FirLightInterfaceClassSymbol(symbol, classOrObject.manager) is KtNamedClassOrObjectSymbol -> when (symbol.classKind) {
KtClassKind.ANNOTATION_CLASS -> FirLightAnnotationClassSymbol(symbol, classOrObject.manager) KtClassKind.INTERFACE -> FirLightInterfaceClassSymbol(symbol, classOrObject.manager)
else -> FirLightClassForSymbol(symbol, classOrObject.manager) KtClassKind.ANNOTATION_CLASS -> FirLightAnnotationClassSymbol(symbol, classOrObject.manager)
else -> FirLightClassForSymbol(symbol, classOrObject.manager)
}
} }
} }
} }
@@ -317,7 +319,7 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<F
// we can't prohibit creating light classes with null names either since they can contain members // we can't prohibit creating light classes with null names either since they can contain members
analyzeWithSymbolAsContext(this) { analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getAllSymbols().filterIsInstance<KtClassOrObjectSymbol>().mapTo(result) { getDeclaredMemberScope().getAllSymbols().filterIsInstance<KtNamedClassOrObjectSymbol>().mapTo(result) {
FirLightClassForSymbol(it, manager) FirLightClassForSymbol(it, manager)
} }
} }
@@ -332,8 +334,8 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<F
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class) @OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean { internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean {
return analyze(this) { return analyze(this) {
val thisSymbol = this@checkIsInheritor.getClassOrObjectSymbol() val thisSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol()
val baseSymbol = baseClassOrigin.getClassOrObjectSymbol() val baseSymbol = baseClassOrigin.getNamedClassOrObjectSymbol()
if (thisSymbol == baseSymbol) return@analyze false if (thisSymbol == baseSymbol) return@analyze false
@@ -11,11 +11,11 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClass
import org.jetbrains.kotlin.asJava.classes.lazyPub import org.jetbrains.kotlin.asJava.classes.lazyPub
import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier import org.jetbrains.kotlin.asJava.elements.FirLightIdentifier
import org.jetbrains.kotlin.idea.frontend.api.isValid import org.jetbrains.kotlin.idea.frontend.api.isValid
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
internal class FirLightFieldForObjectSymbol( internal class FirLightFieldForObjectSymbol(
private val objectSymbol: KtClassOrObjectSymbol, private val objectSymbol: KtNamedClassOrObjectSymbol,
containingClass: KtLightClass, containingClass: KtLightClass,
private val name: String, private val name: String,
lightMemberOrigin: LightMemberOrigin?, lightMemberOrigin: LightMemberOrigin?,
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration
import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext import org.jetbrains.kotlin.idea.frontend.api.fir.analyzeWithSymbolAsContext
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
@@ -61,8 +60,8 @@ internal fun KtTypeAndAnnotations.asPsiType(
return type.coneType.asPsiType(session, context.firRef.resolveState, TypeMappingMode.DEFAULT, parent) return type.coneType.asPsiType(session, context.firRef.resolveState, TypeMappingMode.DEFAULT, parent)
} }
internal fun KtClassOrObjectSymbol.typeForClassSymbol(psiElement: PsiElement): PsiType { internal fun KtNamedClassOrObjectSymbol.typeForClassSymbol(psiElement: PsiElement): PsiType {
require(this is KtFirClassOrObjectSymbol) require(this is KtFirSymbol<*>)
val types = analyzeWithSymbolAsContext(this) { val types = analyzeWithSymbolAsContext(this) {
this@typeForClassSymbol.buildSelfClassType() this@typeForClassSymbol.buildSelfClassType()
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir
import com.google.common.collect.MapMaker import com.google.common.collect.MapMaker
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
@@ -82,33 +83,50 @@ internal class KtSymbolByFirBuilder private constructor(
} }
fun buildSymbol(fir: FirDeclaration): KtSymbol = symbolsCache.cache(fir) { fun buildSymbol(fir: FirDeclaration): KtSymbol {
when (fir) { return when (fir) {
is FirRegularClass -> buildClassSymbol(fir) is FirClassLikeDeclaration<*> -> buildClassLikeSymbol(fir)
is FirSimpleFunction -> buildFunctionSymbol(fir) is FirSimpleFunction -> buildFunctionSymbol(fir)
is FirProperty -> buildVariableSymbol(fir) is FirProperty -> buildVariableSymbol(fir)
is FirValueParameter -> buildParameterSymbol(fir) is FirValueParameter -> buildParameterSymbol(fir)
is FirConstructor -> buildConstructorSymbol(fir) is FirConstructor -> buildConstructorSymbol(fir)
is FirTypeParameter -> buildTypeParameterSymbol(fir) is FirTypeParameter -> buildTypeParameterSymbol(fir)
is FirTypeAlias -> buildTypeAliasSymbol(fir)
is FirEnumEntry -> buildEnumEntrySymbol(fir) is FirEnumEntry -> buildEnumEntrySymbol(fir)
is FirField -> buildFieldSymbol(fir) is FirField -> buildFieldSymbol(fir)
is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir) is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir)
is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir) is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir)
is FirAnonymousObject -> buildAnonymousObjectSymbol(fir)
else -> else ->
TODO(fir::class.toString()) TODO(fir::class.toString())
} }
} }
// TODO Handle all relevant cases // TODO Handle all relevant cases
fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol = buildSymbol(fir) as KtCallableSymbol fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol = buildSymbol(fir) as KtCallableSymbol
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol = when (fir) {
is FirRegularClass -> buildClassSymbol(fir) fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol {
is FirTypeAlias -> buildTypeAliasSymbol(fir) return when (fir) {
else -> is FirClass<*> -> buildClassOrObjectSymbol(fir)
TODO(fir::class.toString()) is FirTypeAlias -> buildTypeAliasSymbol(fir)
else -> error("Unexpected ${fir::class.simpleName}")
}
}
fun buildClassOrObjectSymbol(fir: FirClass<*>): KtClassOrObjectSymbol {
return when (fir) {
is FirAnonymousObject -> buildAnonymousObjectSymbol(fir)
is FirRegularClass -> buildNamedClassOrObjectSymbol(fir)
else -> error("Unexpected ${fir::class.simpleName}")
}
}
fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol {
return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this) }
}
fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol {
return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this) }
} }
fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol = when (val fir = firSymbol.fir) { fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol = when (val fir = firSymbol.fir) {
@@ -118,10 +136,6 @@ internal class KtSymbolByFirBuilder private constructor(
TODO(fir::class.toString()) TODO(fir::class.toString())
} }
fun buildClassSymbol(fir: FirRegularClass) = symbolsCache.cache(fir) { KtFirClassOrObjectSymbol(fir, resolveState, token, this) }
fun buildAnonymousObjectSymbol(fir: FirAnonymousObject) =
symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this) }
// TODO it can be a constructor parameter, which may be split into parameter & property // TODO it can be a constructor parameter, which may be split into parameter & property
// we should handle them both // we should handle them both
@@ -24,13 +24,15 @@ import org.jetbrains.kotlin.idea.frontend.api.components.KtScopeProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.scopes.* import org.jetbrains.kotlin.idea.frontend.api.fir.scopes.*
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirAnonymousObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirAnonymousObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirEnumEntrySymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirEnumEntrySymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFileSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFileSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.scopes.* import org.jetbrains.kotlin.idea.frontend.api.scopes.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFileSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtFileSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtPackageSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations
@@ -59,7 +61,7 @@ internal class KtFirScopeProvider(
private val packageMemberScopeCache = IdentityHashMap<KtPackageSymbol, KtPackageScope>() private val packageMemberScopeCache = IdentityHashMap<KtPackageSymbol, KtPackageScope>()
private inline fun <T> KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass<*>) -> T): T? = when (this) { private inline fun <T> KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass<*>) -> T): T? = when (this) {
is KtFirClassOrObjectSymbol -> firRef.withFir(FirResolvePhase.SUPER_TYPES, body) is KtFirNamedClassOrObjectSymbol -> firRef.withFir(FirResolvePhase.SUPER_TYPES, body)
is KtFirAnonymousObjectSymbol -> firRef.withFir(FirResolvePhase.SUPER_TYPES, body) is KtFirAnonymousObjectSymbol -> firRef.withFir(FirResolvePhase.SUPER_TYPES, body)
is KtFirEnumEntrySymbol -> firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { is KtFirEnumEntrySymbol -> firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
val initializer = it.initializer val initializer = it.initializer
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverridePropertySymb
import org.jetbrains.kotlin.idea.frontend.api.ValidityToken import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtSymbolDeclarationOverridesProvider import org.jetbrains.kotlin.idea.frontend.api.components.KtSymbolDeclarationOverridesProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.* import org.jetbrains.kotlin.idea.frontend.api.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind
@@ -92,13 +92,13 @@ internal class KtFirSymbolDeclarationOverridesProvider(
val containingDeclaration = with(analysisSession) { val containingDeclaration = with(analysisSession) {
(callableSymbol as? KtSymbolWithKind)?.getContainingSymbol() as? KtClassOrObjectSymbol (callableSymbol as? KtSymbolWithKind)?.getContainingSymbol() as? KtClassOrObjectSymbol
} ?: return } ?: return
check(containingDeclaration is KtFirClassOrObjectSymbol) check(containingDeclaration is KtFirNamedClassOrObjectSymbol)
processOverrides(containingDeclaration, callableSymbol, process) processOverrides(containingDeclaration, callableSymbol, process)
} }
private inline fun processOverrides( private inline fun processOverrides(
containingDeclaration: KtFirClassOrObjectSymbol, containingDeclaration: KtFirNamedClassOrObjectSymbol,
callableSymbol: KtFirSymbol<*>, callableSymbol: KtFirSymbol<*>,
crossinline process: (FirTypeScope, FirDeclaration) -> Unit crossinline process: (FirTypeScope, FirDeclaration) -> Unit
) { ) {
@@ -14,10 +14,11 @@ import org.jetbrains.kotlin.idea.frontend.api.ValidityToken
import org.jetbrains.kotlin.idea.frontend.api.components.KtBuiltinTypes import org.jetbrains.kotlin.idea.frontend.api.components.KtBuiltinTypes
import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider import org.jetbrains.kotlin.idea.frontend.api.components.KtTypeProvider
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType import org.jetbrains.kotlin.idea.frontend.api.fir.types.KtFirType
import org.jetbrains.kotlin.idea.frontend.api.fir.types.PublicTypeApproximator import org.jetbrains.kotlin.idea.frontend.api.fir.types.PublicTypeApproximator
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.idea.frontend.api.types.KtType
import org.jetbrains.kotlin.types.TypeApproximatorConfiguration import org.jetbrains.kotlin.types.TypeApproximatorConfiguration
@@ -40,8 +41,8 @@ internal class KtFirTypeProvider(
} }
override fun buildSelfClassType(symbol: KtClassOrObjectSymbol): KtType { override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType {
require(symbol is KtFirClassOrObjectSymbol) require(symbol is KtFirNamedClassOrObjectSymbol)
val type = symbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { firClass -> val type = symbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { firClass ->
ConeClassLikeTypeImpl( ConeClassLikeTypeImpl(
firClass.symbol.toLookupTag(), firClass.symbol.toLookupTag(),
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbo
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
internal class KtFirAnonymousObjectSymbol( internal class KtFirAnonymousObjectSymbol(
fir: FirAnonymousObject, fir: FirAnonymousObject,
@@ -34,7 +35,6 @@ internal class KtFirAnonymousObjectSymbol(
) : KtAnonymousObjectSymbol(), KtFirSymbol<FirAnonymousObject> { ) : KtAnonymousObjectSymbol(), KtFirSymbol<FirAnonymousObject> {
private val builder by weakRef(_builder) private val builder by weakRef(_builder)
override val firRef = firRef(fir, resolveState) override val firRef = firRef(fir, resolveState)
override val symbolKind: KtSymbolKind = KtSymbolKind.LOCAL
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) }
override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() } override val annotations: List<KtAnnotationCall> by cached { firRef.toAnnotationsList() }
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.containsAnnotation import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.containsAnnotation
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.getAnnotationClassIds import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.getAnnotationClassIds
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.toAnnotationsList import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.annotations.toAnnotationsList
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirClassOrObjectInLibrarySymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers.KtFirClassOrObjectInLibrarySymbolPointer
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached import org.jetbrains.kotlin.idea.frontend.api.fir.utils.cached
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.firRef
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef import org.jetbrains.kotlin.idea.frontend.api.fir.utils.weakRef
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.* import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtPsiBasedSymbolPointer
@@ -28,16 +28,16 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
internal class KtFirClassOrObjectSymbol( internal class KtFirNamedClassOrObjectSymbol(
fir: FirRegularClass, fir: FirRegularClass,
resolveState: FirModuleResolveState, resolveState: FirModuleResolveState,
override val token: ValidityToken, override val token: ValidityToken,
_builder: KtSymbolByFirBuilder _builder: KtSymbolByFirBuilder
) : KtClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> { ) : KtNamedClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> {
private val builder by weakRef(_builder) private val builder by weakRef(_builder)
override val firRef = firRef(fir, resolveState) override val firRef = firRef(fir, resolveState)
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) } override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.session) }
override val name: Name get() = firRef.withFir { it.symbol.classId.shortClassName } override val name: Name get() = firRef.withFir { it.name }
override val classIdIfNonLocal: ClassId? override val classIdIfNonLocal: ClassId?
get() = firRef.withFir { fir -> get() = firRef.withFir { fir ->
fir.symbol.classId.takeUnless { it.isLocal } fir.symbol.classId.takeUnless { it.isLocal }
@@ -58,8 +58,8 @@ internal class KtFirClassOrObjectSymbol(
override val isExternal: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isExternal } override val isExternal: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isExternal }
override val companionObject: KtClassOrObjectSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { fir -> override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir ->
fir.companionObject?.let { builder.buildClassSymbol(it) } fir.companionObject?.let { builder.buildNamedClassOrObjectSymbol(it) }
} }
override val superTypes: List<KtTypeAndAnnotations> by cached { override val superTypes: List<KtTypeAndAnnotations> by cached {
@@ -92,11 +92,11 @@ internal class KtFirClassOrObjectSymbol(
} }
} }
override fun createPointer(): KtSymbolPointer<KtClassOrObjectSymbol> { override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> {
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it } KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
if (symbolKind == KtSymbolKind.LOCAL) { if (symbolKind == KtSymbolKind.LOCAL) {
throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(classIdIfNonLocal?.asString().orEmpty()) throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(classIdIfNonLocal?.asString().orEmpty())
} }
return KtFirClassOrObjectInLibrarySymbol(classIdIfNonLocal!!) return KtFirClassOrObjectInLibrarySymbolPointer(classIdIfNonLocal!!)
} }
} }
@@ -99,9 +99,15 @@ internal class KtFirSymbolProvider(
} }
override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion { override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion {
check(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression) psi.withFirDeclarationOfType<FirClass<*>, KtClassOrObjectSymbol>(resolveState) {
psi.withFirDeclarationOfType<FirRegularClass, KtClassOrObjectSymbol>(resolveState) { firSymbolBuilder.buildClassOrObjectSymbol(it)
firSymbolBuilder.buildClassSymbol(it) }
}
override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol = withValidityAssertion {
require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression)
psi.withFirDeclarationOfType<FirRegularClass, KtNamedClassOrObjectSymbol>(resolveState) {
firSymbolBuilder.buildNamedClassOrObjectSymbol(it)
} }
} }
@@ -113,7 +119,7 @@ internal class KtFirSymbolProvider(
override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion { override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion {
val symbol = firSymbolProvider.getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return null val symbol = firSymbolProvider.getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return null
firSymbolBuilder.buildClassSymbol(symbol.fir) firSymbolBuilder.buildNamedClassOrObjectSymbol(symbol.fir)
} }
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> { override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> {
@@ -7,16 +7,16 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
class KtFirClassOrObjectInLibrarySymbol(private val classId: ClassId) : KtSymbolPointer<KtClassOrObjectSymbol>() { class KtFirClassOrObjectInLibrarySymbolPointer(private val classId: ClassId) : KtSymbolPointer<KtNamedClassOrObjectSymbol>() {
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtClassOrObjectSymbol? { override fun restoreSymbol(analysisSession: KtAnalysisSession): KtNamedClassOrObjectSymbol? {
require(analysisSession is KtFirAnalysisSession) require(analysisSession is KtFirAnalysisSession)
val firClass = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId( val firClass = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId(classId) ?: return null
classId return analysisSession.firSymbolBuilder.buildNamedClassOrObjectSymbol(firClass)
) ?: return null
return analysisSession.firSymbolBuilder.buildClassSymbol(firClass)
} }
} }
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirClassOrObjectSymbol import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassKind
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
@@ -30,7 +30,7 @@ internal class KtFirSimpleNameReference(
if (resultsToFix.isEmpty() || !isAnnotationCall) return resultsToFix if (resultsToFix.isEmpty() || !isAnnotationCall) return resultsToFix
return resultsToFix.map { targetSymbol -> return resultsToFix.map { targetSymbol ->
if (targetSymbol is KtFirClassOrObjectSymbol && targetSymbol.classKind == KtClassKind.ANNOTATION_CLASS) { if (targetSymbol is KtFirNamedClassOrObjectSymbol && targetSymbol.classKind == KtClassKind.ANNOTATION_CLASS) {
targetSymbol.getMemberScope().getConstructors().firstOrNull() ?: targetSymbol targetSymbol.getMemberScope().getConstructors().firstOrNull() ?: targetSymbol
} else targetSymbol } else targetSymbol
} }
@@ -57,7 +57,7 @@ CLASSIFIER NAMES:
[C, I] [C, I]
CLASSIFIER SYMBOLS: CLASSIFIER SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: C classIdIfNonLocal: C
@@ -76,7 +76,7 @@ KtFirClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: I classIdIfNonLocal: I
@@ -1282,7 +1282,7 @@ KtFirFunctionSymbol:
valueParameters: [] valueParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: kotlin/Int.Companion classIdIfNonLocal: kotlin/Int.Companion
@@ -1231,7 +1231,7 @@ KtFirFunctionSymbol:
valueParameters: [KtFirFunctionValueParameterSymbol(index)] valueParameters: [KtFirFunctionValueParameterSymbol(index)]
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: java/lang/String.CaseInsensitiveComparator classIdIfNonLocal: java/lang/String.CaseInsensitiveComparator
@@ -3,7 +3,7 @@
class: kotlin/Lazy class: kotlin/Lazy
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: kotlin/Lazy classIdIfNonLocal: kotlin/Lazy
@@ -3,7 +3,7 @@
class: java/lang/String class: java/lang/String
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: java/lang/String classIdIfNonLocal: java/lang/String
@@ -1,7 +1,7 @@
class: kotlin/collections/MutableMap.MutableEntry class: kotlin/collections/MutableMap.MutableEntry
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: kotlin/collections/MutableMap.MutableEntry classIdIfNonLocal: kotlin/collections/MutableMap.MutableEntry
+1 -1
View File
@@ -2,7 +2,7 @@ class A {
} }
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -15,7 +15,7 @@ KtFirConstructorSymbol:
valueParameters: [] valueParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -73,7 +73,7 @@ KtFirConstructorSymbol:
valueParameters: Could not render due to java.lang.ClassCastException: org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFunctionValueParameterSymbol cannot be cast to org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirConstructorValueParameterSymbol valueParameters: Could not render due to java.lang.ClassCastException: org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFunctionValueParameterSymbol cannot be cast to org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirConstructorValueParameterSymbol
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
+1 -1
View File
@@ -17,7 +17,7 @@ KtFirEnumEntrySymbol:
origin: SOURCE origin: SOURCE
symbolKind: MEMBER symbolKind: MEMBER
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: X classIdIfNonLocal: X
@@ -46,7 +46,7 @@ KtFirFunctionSymbol:
valueParameters: [] valueParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -66,7 +66,7 @@ KtFirKotlinPropertySymbol:
symbolKind: MEMBER symbolKind: MEMBER
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -1,7 +1,7 @@
class: kotlin/collections/Iterator class: kotlin/collections/Iterator
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: kotlin/collections/Iterator classIdIfNonLocal: kotlin/collections/Iterator
+1 -1
View File
@@ -1,7 +1,7 @@
class: kotlin/io/FileWalkDirection class: kotlin/io/FileWalkDirection
// SYMBOLS: // SYMBOLS:
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: kotlin/io/FileWalkDirection classIdIfNonLocal: kotlin/io/FileWalkDirection
@@ -44,7 +44,7 @@ KtFirConstructorSymbol:
valueParameters: Could not render due to java.lang.ClassCastException: org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFunctionValueParameterSymbol cannot be cast to org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirConstructorValueParameterSymbol valueParameters: Could not render due to java.lang.ClassCastException: org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirFunctionValueParameterSymbol cannot be cast to org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirConstructorValueParameterSymbol
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: Anno classIdIfNonLocal: Anno
@@ -84,7 +84,7 @@ KtFirFunctionSymbol:
valueParameters: [] valueParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [Anno] annotationClassIds: [Anno]
annotations: [Anno(param1 = param, param2 = 2)] annotations: [Anno(param1 = param, param2 = 2)]
classIdIfNonLocal: X classIdIfNonLocal: X
@@ -57,6 +57,9 @@ KtFirKotlinPropertySymbol:
KtFirAnonymousObjectSymbol: KtFirAnonymousObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: null
classKind: ANONYMOUS_OBJECT
name: null
origin: SOURCE origin: SOURCE
superTypes: [[] java/lang/Runnable] superTypes: [[] java/lang/Runnable]
symbolKind: LOCAL symbolKind: LOCAL
@@ -85,7 +88,7 @@ KtFirKotlinPropertySymbol:
symbolKind: MEMBER symbolKind: MEMBER
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: AnonymousContainer classIdIfNonLocal: AnonymousContainer
+1 -1
View File
@@ -3,7 +3,7 @@ class A {
// SYMBOLS: // SYMBOLS:
/* /*
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -50,7 +50,7 @@ KtFirFunctionSymbol:
valueParameters: [] valueParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -17,7 +17,7 @@ KtFirTypeParameterSymbol:
upperBounds: [kotlin/Any?] upperBounds: [kotlin/Any?]
variance: INVARIANT variance: INVARIANT
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: A classIdIfNonLocal: A
@@ -35,7 +35,7 @@ KtFirFunctionSymbol:
valueParameters: [] valueParameters: []
visibility: LOCAL visibility: LOCAL
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: null classIdIfNonLocal: null
@@ -17,7 +17,7 @@ class X : @Anno1 I {
// SYMBOLS: // SYMBOLS:
/* /*
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target] annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)] annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno1 classIdIfNonLocal: Anno1
@@ -36,7 +36,7 @@ KtFirClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target] annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)] annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno2 classIdIfNonLocal: Anno2
@@ -55,7 +55,7 @@ KtFirClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target] annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)] annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno3 classIdIfNonLocal: Anno3
@@ -74,7 +74,7 @@ KtFirClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target] annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)] annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno4 classIdIfNonLocal: Anno4
@@ -93,7 +93,7 @@ KtFirClassOrObjectSymbol:
typeParameters: [] typeParameters: []
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: I classIdIfNonLocal: I
@@ -167,7 +167,7 @@ KtFirKotlinPropertySymbol:
symbolKind: MEMBER symbolKind: MEMBER
visibility: PUBLIC visibility: PUBLIC
KtFirClassOrObjectSymbol: KtFirNamedClassOrObjectSymbol:
annotationClassIds: [] annotationClassIds: []
annotations: [] annotations: []
classIdIfNonLocal: X classIdIfNonLocal: X