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) {
val isAbstract = symbol.modality == KtCommonSymbolModality.ABSTRACT
val isAbstract = (symbol as? KtNamedClassOrObjectSymbol)?.modality == KtCommonSymbolModality.ABSTRACT
return when (symbol.classKind) {
KtClassKind.CLASS -> if (isAbstract) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS
@@ -36,6 +36,7 @@ internal object KotlinFirIconProvider {
KtClassKind.ANNOTATION_CLASS -> KotlinIcons.ANNOTATION
KtClassKind.OBJECT, KtClassKind.COMPANION_OBJECT -> KotlinIcons.OBJECT
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.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtTypeArgumentList
import org.jetbrains.kotlin.psi.psiUtil.endOffset
@@ -94,7 +95,8 @@ private data class VariableLookupObject(
private class ClassLookupElementFactory {
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)
}
}
@@ -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.refactoring.CHECK_SUPER_METHODS_YES_NO_DIALOG
import org.jetbrains.kotlin.idea.refactoring.formatPsiClass
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
class KotlinFindUsagesSupportFirImpl : KotlinFindUsagesSupport {
@@ -81,7 +82,7 @@ class KotlinFindUsagesSupportFirImpl : KotlinFindUsagesSupport {
val filteredDeclarations =
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())
}
@@ -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.symbols.KtClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.types.KtType
abstract class KtTypeProvider : KtAnalysisSessionComponent() {
@@ -14,7 +15,7 @@ abstract class KtTypeProvider : KtAnalysisSessionComponent() {
abstract fun approximateToSuperPublicDenotableType(type: KtType): KtType?
abstract fun buildSelfClassType(symbol: KtClassOrObjectSymbol): KtType
abstract fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType
}
interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
@@ -30,7 +31,7 @@ interface KtTypeProviderMixIn : KtAnalysisSessionMixIn {
fun KtType.approximateToSuperPublicDenotable(): KtType? =
analysisSession.typeProvider.approximateToSuperPublicDenotableType(this)
fun KtClassOrObjectSymbol.buildSelfClassType(): KtType =
fun KtNamedClassOrObjectSymbol.buildSelfClassType(): KtType =
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.types.KtType
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.SpecialNames
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 override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol>
@@ -21,13 +26,13 @@ abstract class KtTypeParameterSymbol : KtClassifierSymbol(), KtNamedSymbol {
abstract val isReified: Boolean
}
sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtNamedSymbol, KtSymbolWithKind {
sealed class KtClassLikeSymbol : KtClassifierSymbol(), KtSymbolWithKind {
abstract val classIdIfNonLocal: ClassId?
abstract override fun createPointer(): KtSymbolPointer<KtClassLikeSymbol>
}
abstract class KtTypeAliasSymbol : KtClassLikeSymbol() {
abstract class KtTypeAliasSymbol : KtClassLikeSymbol(), KtNamedSymbol {
abstract override val classIdIfNonLocal: ClassId
final override val symbolKind: KtSymbolKind get() = KtSymbolKind.TOP_LEVEL
@@ -35,13 +40,30 @@ abstract class KtTypeAliasSymbol : KtClassLikeSymbol() {
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,
KtSymbolWithModality<KtSymbolModality>,
KtSymbolWithVisibility,
KtAnnotatedSymbol,
KtSymbolWithMembers {
abstract val classKind: KtClassKind
KtNamedSymbol {
abstract val isInner: Boolean
abstract val isData: Boolean
@@ -50,13 +72,11 @@ abstract class KtClassOrObjectSymbol : KtClassLikeSymbol(),
abstract val isExternal: Boolean
abstract val companionObject: KtClassOrObjectSymbol?
abstract val companionObject: KtNamedClassOrObjectSymbol?
abstract val superTypes: List<KtTypeAndAnnotations>
abstract override fun createPointer(): KtSymbolPointer<KtClassOrObjectSymbol>
abstract override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol>
}
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 getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol
abstract fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol
abstract fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol
abstract fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol
abstract fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol?
@@ -86,6 +87,9 @@ interface KtSymbolProviderMixIn : KtAnalysisSessionMixIn {
fun KtClassOrObject.getClassOrObjectSymbol(): KtClassOrObjectSymbol =
analysisSession.symbolProvider.getClassOrObjectSymbol(this)
fun KtClassOrObject.getNamedClassOrObjectSymbol(): KtNamedClassOrObjectSymbol =
analysisSession.symbolProvider.getNamedClassOrObjectSymbol(this)
fun KtPropertyAccessor.getPropertyAccessorSymbol(): KtPropertyAccessorSymbol =
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.name.Name
interface KtNamedSymbol : KtSymbol {
val name: Name
interface KtPossiblyNamedSymbol : KtSymbol {
val name: Name?
}
interface KtNamedSymbol : KtPossiblyNamedSymbol {
abstract override val name: Name
}
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.frontend.api.fir.analyzeWithSymbolAsContext
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.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.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.isPrivateOrPrivateToThis
internal class FirLightAnnotationClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager
) : FirLightInterfaceOrAnnotationClassSymbol(classOrObjectSymbol, manager) {
@@ -31,7 +31,7 @@ import org.jetbrains.kotlin.psi.debugText.getDebugText
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
internal abstract class FirLightClassForClassOrObjectSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager
) : FirLightClassBase(manager),
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
internal class FirLightClassForSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager
) : 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.KtClassOrObjectSymbol
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
internal class FirLightInterfaceClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager
) : 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.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.KtSymbolKind
internal abstract class FirLightInterfaceOrAnnotationClassSymbol(
private val classOrObjectSymbol: KtClassOrObjectSymbol,
private val classOrObjectSymbol: KtNamedClassOrObjectSymbol,
manager: PsiManager
) : FirLightClassForClassOrObjectSymbol(classOrObjectSymbol, manager) {
@@ -68,11 +68,13 @@ fun createFirLightClassNoCache(classOrObject: KtClassOrObject): KtLightClass? =
else -> {
analyze(classOrObject) {
val symbol = classOrObject.getClassOrObjectSymbol()
when (symbol.classKind) {
KtClassKind.INTERFACE -> FirLightInterfaceClassSymbol(symbol, classOrObject.manager)
KtClassKind.ANNOTATION_CLASS -> FirLightAnnotationClassSymbol(symbol, classOrObject.manager)
else -> FirLightClassForSymbol(symbol, classOrObject.manager)
when (val symbol = classOrObject.getClassOrObjectSymbol()) {
is KtAnonymousObjectSymbol -> FirLightAnonymousClassForSymbol(symbol, classOrObject.manager)
is KtNamedClassOrObjectSymbol -> when (symbol.classKind) {
KtClassKind.INTERFACE -> FirLightInterfaceClassSymbol(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
analyzeWithSymbolAsContext(this) {
getDeclaredMemberScope().getAllSymbols().filterIsInstance<KtClassOrObjectSymbol>().mapTo(result) {
getDeclaredMemberScope().getAllSymbols().filterIsInstance<KtNamedClassOrObjectSymbol>().mapTo(result) {
FirLightClassForSymbol(it, manager)
}
}
@@ -332,8 +334,8 @@ internal fun KtSymbolWithMembers.createInnerClasses(manager: PsiManager): List<F
@OptIn(HackToForceAllowRunningAnalyzeOnEDT::class)
internal fun KtClassOrObject.checkIsInheritor(baseClassOrigin: KtClassOrObject, checkDeep: Boolean): Boolean {
return analyze(this) {
val thisSymbol = this@checkIsInheritor.getClassOrObjectSymbol()
val baseSymbol = baseClassOrigin.getClassOrObjectSymbol()
val thisSymbol = this@checkIsInheritor.getNamedClassOrObjectSymbol()
val baseSymbol = baseClassOrigin.getNamedClassOrObjectSymbol()
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.elements.FirLightIdentifier
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
internal class FirLightFieldForObjectSymbol(
private val objectSymbol: KtClassOrObjectSymbol,
private val objectSymbol: KtNamedClassOrObjectSymbol,
containingClass: KtLightClass,
private val name: String,
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.withFirDeclaration
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.types.KtFirType
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)
}
internal fun KtClassOrObjectSymbol.typeForClassSymbol(psiElement: PsiElement): PsiType {
require(this is KtFirClassOrObjectSymbol)
internal fun KtNamedClassOrObjectSymbol.typeForClassSymbol(psiElement: PsiElement): PsiType {
require(this is KtFirSymbol<*>)
val types = analyzeWithSymbolAsContext(this) {
this@typeForClassSymbol.buildSelfClassType()
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir
import com.google.common.collect.MapMaker
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
@@ -82,33 +83,50 @@ internal class KtSymbolByFirBuilder private constructor(
}
fun buildSymbol(fir: FirDeclaration): KtSymbol = symbolsCache.cache(fir) {
when (fir) {
is FirRegularClass -> buildClassSymbol(fir)
fun buildSymbol(fir: FirDeclaration): KtSymbol {
return when (fir) {
is FirClassLikeDeclaration<*> -> buildClassLikeSymbol(fir)
is FirSimpleFunction -> buildFunctionSymbol(fir)
is FirProperty -> buildVariableSymbol(fir)
is FirValueParameter -> buildParameterSymbol(fir)
is FirConstructor -> buildConstructorSymbol(fir)
is FirTypeParameter -> buildTypeParameterSymbol(fir)
is FirTypeAlias -> buildTypeAliasSymbol(fir)
is FirEnumEntry -> buildEnumEntrySymbol(fir)
is FirField -> buildFieldSymbol(fir)
is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir)
is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir)
is FirAnonymousObject -> buildAnonymousObjectSymbol(fir)
else ->
TODO(fir::class.toString())
}
}
// TODO Handle all relevant cases
fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol = buildSymbol(fir) as KtCallableSymbol
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol = when (fir) {
is FirRegularClass -> buildClassSymbol(fir)
is FirTypeAlias -> buildTypeAliasSymbol(fir)
else ->
TODO(fir::class.toString())
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol {
return when (fir) {
is FirClass<*> -> buildClassOrObjectSymbol(fir)
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) {
@@ -118,10 +136,6 @@ internal class KtSymbolByFirBuilder private constructor(
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
// 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.KtSymbolByFirBuilder
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.KtFirClassOrObjectSymbol
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.KtFirNamedClassOrObjectSymbol
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.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.KtPackageSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithDeclarations
@@ -59,7 +61,7 @@ internal class KtFirScopeProvider(
private val packageMemberScopeCache = IdentityHashMap<KtPackageSymbol, KtPackageScope>()
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 KtFirEnumEntrySymbol -> firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
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.components.KtSymbolDeclarationOverridesProvider
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.symbols.*
import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind
@@ -92,13 +92,13 @@ internal class KtFirSymbolDeclarationOverridesProvider(
val containingDeclaration = with(analysisSession) {
(callableSymbol as? KtSymbolWithKind)?.getContainingSymbol() as? KtClassOrObjectSymbol
} ?: return
check(containingDeclaration is KtFirClassOrObjectSymbol)
check(containingDeclaration is KtFirNamedClassOrObjectSymbol)
processOverrides(containingDeclaration, callableSymbol, process)
}
private inline fun processOverrides(
containingDeclaration: KtFirClassOrObjectSymbol,
containingDeclaration: KtFirNamedClassOrObjectSymbol,
callableSymbol: KtFirSymbol<*>,
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.KtTypeProvider
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.PublicTypeApproximator
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.types.TypeApproximatorConfiguration
@@ -40,8 +41,8 @@ internal class KtFirTypeProvider(
}
override fun buildSelfClassType(symbol: KtClassOrObjectSymbol): KtType {
require(symbol is KtFirClassOrObjectSymbol)
override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType {
require(symbol is KtFirNamedClassOrObjectSymbol)
val type = symbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { firClass ->
ConeClassLikeTypeImpl(
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.KtSymbolPointer
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
internal class KtFirAnonymousObjectSymbol(
fir: FirAnonymousObject,
@@ -34,7 +35,6 @@ internal class KtFirAnonymousObjectSymbol(
) : KtAnonymousObjectSymbol(), KtFirSymbol<FirAnonymousObject> {
private val builder by weakRef(_builder)
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 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.getAnnotationClassIds
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.firRef
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.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.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
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.Name
internal class KtFirClassOrObjectSymbol(
internal class KtFirNamedClassOrObjectSymbol(
fir: FirRegularClass,
resolveState: FirModuleResolveState,
override val token: ValidityToken,
_builder: KtSymbolByFirBuilder
) : KtClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> {
) : KtNamedClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> {
private val builder by weakRef(_builder)
override val firRef = firRef(fir, resolveState)
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?
get() = firRef.withFir { fir ->
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 companionObject: KtClassOrObjectSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { fir ->
fir.companionObject?.let { builder.buildClassSymbol(it) }
override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir ->
fir.companionObject?.let { builder.buildNamedClassOrObjectSymbol(it) }
}
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 }
if (symbolKind == KtSymbolKind.LOCAL) {
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 {
check(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression)
psi.withFirDeclarationOfType<FirRegularClass, KtClassOrObjectSymbol>(resolveState) {
firSymbolBuilder.buildClassSymbol(it)
psi.withFirDeclarationOfType<FirClass<*>, KtClassOrObjectSymbol>(resolveState) {
firSymbolBuilder.buildClassOrObjectSymbol(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 {
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> {
@@ -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.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.KtNamedClassOrObjectSymbol
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.name.ClassId
class KtFirClassOrObjectInLibrarySymbol(private val classId: ClassId) : KtSymbolPointer<KtClassOrObjectSymbol>() {
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtClassOrObjectSymbol? {
class KtFirClassOrObjectInLibrarySymbolPointer(private val classId: ClassId) : KtSymbolPointer<KtNamedClassOrObjectSymbol>() {
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtNamedClassOrObjectSymbol? {
require(analysisSession is KtFirAnalysisSession)
val firClass = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId(
classId
) ?: return null
return analysisSession.firSymbolBuilder.buildClassSymbol(firClass)
val firClass = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId(classId) ?: return null
return analysisSession.firSymbolBuilder.buildNamedClassOrObjectSymbol(firClass)
}
}
@@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.references
import com.intellij.psi.PsiElement
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.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.KtSymbol
import org.jetbrains.kotlin.name.FqName
@@ -30,7 +30,7 @@ internal class KtFirSimpleNameReference(
if (resultsToFix.isEmpty() || !isAnnotationCall) return resultsToFix
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
} else targetSymbol
}
@@ -57,7 +57,7 @@ CLASSIFIER NAMES:
[C, I]
CLASSIFIER SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: C
@@ -76,7 +76,7 @@ KtFirClassOrObjectSymbol:
typeParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: I
@@ -1282,7 +1282,7 @@ KtFirFunctionSymbol:
valueParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: kotlin/Int.Companion
@@ -1231,7 +1231,7 @@ KtFirFunctionSymbol:
valueParameters: [KtFirFunctionValueParameterSymbol(index)]
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: java/lang/String.CaseInsensitiveComparator
@@ -3,7 +3,7 @@
class: kotlin/Lazy
// SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: kotlin/Lazy
@@ -3,7 +3,7 @@
class: java/lang/String
// SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: java/lang/String
@@ -1,7 +1,7 @@
class: kotlin/collections/MutableMap.MutableEntry
// SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: kotlin/collections/MutableMap.MutableEntry
+1 -1
View File
@@ -2,7 +2,7 @@ class A {
}
// SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
@@ -15,7 +15,7 @@ KtFirConstructorSymbol:
valueParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
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
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
+1 -1
View File
@@ -17,7 +17,7 @@ KtFirEnumEntrySymbol:
origin: SOURCE
symbolKind: MEMBER
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: X
@@ -46,7 +46,7 @@ KtFirFunctionSymbol:
valueParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
@@ -66,7 +66,7 @@ KtFirKotlinPropertySymbol:
symbolKind: MEMBER
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
@@ -1,7 +1,7 @@
class: kotlin/collections/Iterator
// SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: kotlin/collections/Iterator
+1 -1
View File
@@ -1,7 +1,7 @@
class: kotlin/io/FileWalkDirection
// SYMBOLS:
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
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
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: Anno
@@ -84,7 +84,7 @@ KtFirFunctionSymbol:
valueParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: [Anno]
annotations: [Anno(param1 = param, param2 = 2)]
classIdIfNonLocal: X
@@ -57,6 +57,9 @@ KtFirKotlinPropertySymbol:
KtFirAnonymousObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: null
classKind: ANONYMOUS_OBJECT
name: null
origin: SOURCE
superTypes: [[] java/lang/Runnable]
symbolKind: LOCAL
@@ -85,7 +88,7 @@ KtFirKotlinPropertySymbol:
symbolKind: MEMBER
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: AnonymousContainer
+1 -1
View File
@@ -3,7 +3,7 @@ class A {
// SYMBOLS:
/*
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
@@ -50,7 +50,7 @@ KtFirFunctionSymbol:
valueParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
@@ -17,7 +17,7 @@ KtFirTypeParameterSymbol:
upperBounds: [kotlin/Any?]
variance: INVARIANT
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: A
@@ -35,7 +35,7 @@ KtFirFunctionSymbol:
valueParameters: []
visibility: LOCAL
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: null
@@ -17,7 +17,7 @@ class X : @Anno1 I {
// SYMBOLS:
/*
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno1
@@ -36,7 +36,7 @@ KtFirClassOrObjectSymbol:
typeParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno2
@@ -55,7 +55,7 @@ KtFirClassOrObjectSymbol:
typeParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno3
@@ -74,7 +74,7 @@ KtFirClassOrObjectSymbol:
typeParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: [kotlin/annotation/Target]
annotations: [kotlin/annotation/Target(allowedTargets = KtUnsupportedConstantValue)]
classIdIfNonLocal: Anno4
@@ -93,7 +93,7 @@ KtFirClassOrObjectSymbol:
typeParameters: []
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: I
@@ -167,7 +167,7 @@ KtFirKotlinPropertySymbol:
symbolKind: MEMBER
visibility: PUBLIC
KtFirClassOrObjectSymbol:
KtFirNamedClassOrObjectSymbol:
annotationClassIds: []
annotations: []
classIdIfNonLocal: X