diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt index 273e66001f0..28f4975fbfd 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/FirBasedSymbol.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.fir.symbols +import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.declarations.FirDeclaration +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin abstract class FirBasedSymbol { private var _fir: E? = null @@ -17,4 +20,13 @@ abstract class FirBasedSymbol { fun bind(e: E) { _fir = e } + + val origin: FirDeclarationOrigin + get() = fir.origin + + val source: FirSourceElement? + get() = fir.source + + val moduleData: FirModuleData + get() = fir.moduleData } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt index 0778d688ad3..7767e582c79 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirCallableSymbol.kt @@ -5,16 +5,59 @@ package org.jetbrains.kotlin.fir.symbols.impl -import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration -import org.jetbrains.kotlin.fir.declarations.FirFunction -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.name.Name abstract class FirCallableSymbol : FirBasedSymbol() { abstract val callableId: CallableId + val resolvedReturnTypeRef: FirResolvedTypeRef + get() { + ensureType(fir.returnTypeRef) + return fir.returnTypeRef as FirResolvedTypeRef + } + + val resolvedReceiverTypeRef: FirResolvedTypeRef? + get() { + ensureType(fir.receiverTypeRef) + return fir.receiverTypeRef as FirResolvedTypeRef? + } + + val resolvedStatus: FirResolvedDeclarationStatus + get() { + ensureResolved(FirResolvePhase.STATUS) + return fir.status as FirResolvedDeclarationStatus + } + + val typeParameterSymbols: List + get() { + return fir.typeParameters.map { it.symbol } + } + + val dispatchReceiverType: ConeKotlinType? + get() = fir.dispatchReceiverType + + val name: Name + get() = callableId.callableName + + val deprecation: DeprecationsPerUseSite? + get() { + ensureResolved(FirResolvePhase.STATUS) + return fir.deprecation + } + + private fun ensureType(typeRef: FirTypeRef?) { + when (typeRef) { + null, is FirResolvedTypeRef -> {} + is FirImplicitTypeRef -> ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) + else -> ensureResolved(FirResolvePhase.TYPES) + } + } + override fun toString(): String = "${this::class.simpleName} $callableId" } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt index aaa72ba4701..f94a07d90a1 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirClassLikeSymbol.kt @@ -5,8 +5,12 @@ package org.jetbrains.kotlin.fir.symbols.impl +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -20,19 +24,62 @@ sealed class FirClassLikeSymbol( } sealed class FirClassSymbol(classId: ClassId) : FirClassLikeSymbol(classId) { - private val lookupTag = + private val lookupTag: ConeClassLikeLookupTag = if (classId.isLocal) ConeClassLookupTagWithFixedSymbol(classId, this) else ConeClassLikeLookupTagImpl(classId) override fun toLookupTag(): ConeClassLikeLookupTag = lookupTag + + val resolvedSuperTypeRefs: List + get() { + ensureResolved(FirResolvePhase.SUPER_TYPES) + @Suppress("UNCHECKED_CAST") + return fir.superTypeRefs as List + } + + val declarationSymbols: List> + get() { + return fir.declarations.map { it.symbol } + } + + val typeParameterSymbols: List + get() { + return fir.typeParameters.map { it.symbol } + } + + val classKind: ClassKind + get() = fir.classKind } -class FirRegularClassSymbol(classId: ClassId) : FirClassSymbol(classId) +class FirRegularClassSymbol(classId: ClassId) : FirClassSymbol(classId) { + val resolvedStatus: FirResolvedDeclarationStatus + get() { + ensureResolved(FirResolvePhase.STATUS) + return fir.status as FirResolvedDeclarationStatus + } +} val ANONYMOUS_CLASS_ID = ClassId(FqName.ROOT, FqName.topLevel(Name.special("")), true) class FirAnonymousObjectSymbol : FirClassSymbol(ANONYMOUS_CLASS_ID) class FirTypeAliasSymbol(classId: ClassId) : FirClassLikeSymbol(classId) { - override fun toLookupTag() = ConeClassLikeLookupTagImpl(classId) + override fun toLookupTag(): ConeClassLikeLookupTag = ConeClassLikeLookupTagImpl(classId) + + val resolvedStatus: FirResolvedDeclarationStatus + get() { + ensureResolved(FirResolvePhase.STATUS) + return fir.status as FirResolvedDeclarationStatus + } + + val resolvedExpandedTypeRef: FirResolvedTypeRef + get() { + ensureResolved(FirResolvePhase.SUPER_TYPES) + return fir.expandedTypeRef as FirResolvedTypeRef + } + + val typeParameterSymbols: List + get() { + return fir.typeParameters.map { it.symbol } + } } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt index 8e3082a95dc..bbdc6168262 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt @@ -5,16 +5,30 @@ package org.jetbrains.kotlin.fir.symbols.impl +import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.symbols.AccessorSymbol -import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name sealed class FirFunctionSymbol( override val callableId: CallableId -) : FirCallableSymbol() +) : FirCallableSymbol() { + val valueParameterSymbols: List + get() = fir.valueParameters.map { it.symbol } + + val resolvedContractDescription: FirResolvedContractDescription? + get() { + ensureResolved(FirResolvePhase.CONTRACTS) + return when (this) { + is FirNamedFunctionSymbol -> fir.contractDescription + is FirPropertyAccessorSymbol -> fir.contractDescription + else -> null + } as? FirResolvedContractDescription + } +} // ------------------------ named ------------------------ diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt index 82fd8c690b2..1f81b7d051e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirTypeParameterSymbol.kt @@ -5,12 +5,15 @@ package org.jetbrains.kotlin.fir.symbols.impl +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag +import org.jetbrains.kotlin.fir.symbols.ensureResolved +import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.types.Variance class FirTypeParameterSymbol : FirClassifierSymbol() { - val name: Name get() = fir.name @@ -19,5 +22,18 @@ class FirTypeParameterSymbol : FirClassifierSymbol() { override fun toLookupTag(): ConeTypeParameterLookupTag = lookupTag override fun toString(): String = "${this::class.simpleName} ${name.asString()}" + + val resolvedBounds: List + get() { + ensureResolved(FirResolvePhase.TYPES) + @Suppress("UNCHECKED_CAST") + return fir.bounds as List + } + + val variance: Variance + get() = fir.variance + + val isReified: Boolean + get() = fir.isReified } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt index c75d7c813e0..8b70732d19b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirVariableSymbol.kt @@ -7,7 +7,8 @@ package org.jetbrains.kotlin.fir.symbols.impl import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic -import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.references.FirControlFlowGraphReference +import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name @@ -19,6 +20,33 @@ open class FirPropertySymbol( ) : FirVariableSymbol(callableId) { // TODO: should we use this constructor for local variables? constructor(name: Name) : this(CallableId(name)) + + val isLocal: Boolean + get() = fir.isLocal + + val getterSymbol: FirPropertyAccessorSymbol? + get() = fir.getter?.symbol + + val setterSymbol: FirPropertyAccessorSymbol? + get() = fir.setter?.symbol + + val hasInitializer: Boolean + get() = fir.initializer != null + + val hasDelegate: Boolean + get() = fir.delegate != null + + val controlFlowGraphReference: FirControlFlowGraphReference? + get() { + ensureResolved(FirResolvePhase.BODY_RESOLVE) + return fir.controlFlowGraphReference + } + + val isVal: Boolean + get() = fir.isVal + + val isVar: Boolean + get() = fir.isVar } class FirIntersectionOverridePropertySymbol( @@ -26,20 +54,36 @@ class FirIntersectionOverridePropertySymbol( override val intersections: Collection> ) : FirPropertySymbol(callableId), FirIntersectionCallableSymbol -class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) +class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) { + val isVal: Boolean + get() = fir.isVal -class FirDelegateFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) { - val delegate: FirExpression - get() = fir.delegate!! + val isVar: Boolean + get() = fir.isVar + + val getterSymbol: FirPropertyAccessorSymbol? + get() = fir.getter?.symbol } +class FirDelegateFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) + class FirFieldSymbol(callableId: CallableId) : FirVariableSymbol(callableId) class FirEnumEntrySymbol(callableId: CallableId) : FirVariableSymbol(callableId) class FirValueParameterSymbol(name: Name) : FirVariableSymbol(CallableId(name)) { - val name: Name - get() = callableId.callableName + val hasDefaultValue: Boolean + get() = fir.defaultValue != null + + val isCrossinline: Boolean + get() = fir.isCrossinline + + val isNoinline: Boolean + get() = fir.isNoinline + + val isVararg: Boolean + get() = fir.isVararg + } class FirErrorPropertySymbol(