[Analysis API, FIR] optimize KtSymbol requests for declaration statuses

resolvedStatus is not needed for the most calls while it may be expensive to compute as it requires running declaration resolve.
This commit is contained in:
Ilya Kirillov
2022-06-23 15:51:46 +02:00
parent bc39727bf1
commit 1915a1029f
3 changed files with 35 additions and 28 deletions
@@ -29,20 +29,20 @@ inline val FirCallableSymbol<*>.allowsToHaveFakeOverride: Boolean
inline val FirCallableSymbol<*>.isActual: Boolean get() = resolvedStatus.isActual inline val FirCallableSymbol<*>.isActual: Boolean get() = resolvedStatus.isActual
inline val FirCallableSymbol<*>.isExpect: Boolean get() = resolvedStatus.isExpect inline val FirCallableSymbol<*>.isExpect: Boolean get() = resolvedStatus.isExpect
inline val FirCallableSymbol<*>.isInner: Boolean get() = resolvedStatus.isInner inline val FirCallableSymbol<*>.isInner: Boolean get() = rawStatus.isInner
inline val FirCallableSymbol<*>.isStatic: Boolean get() = resolvedStatus.isStatic inline val FirCallableSymbol<*>.isStatic: Boolean get() = rawStatus.isStatic
inline val FirCallableSymbol<*>.isOverride: Boolean get() = resolvedStatus.isOverride inline val FirCallableSymbol<*>.isOverride: Boolean get() = rawStatus.isOverride
inline val FirCallableSymbol<*>.isOperator: Boolean get() = resolvedStatus.isOperator inline val FirCallableSymbol<*>.isOperator: Boolean get() = resolvedStatus.isOperator
inline val FirCallableSymbol<*>.isInfix: Boolean get() = resolvedStatus.isInfix inline val FirCallableSymbol<*>.isInfix: Boolean get() = resolvedStatus.isInfix
inline val FirCallableSymbol<*>.isInline: Boolean get() = resolvedStatus.isInline inline val FirCallableSymbol<*>.isInline: Boolean get() = rawStatus.isInline
inline val FirCallableSymbol<*>.isTailRec: Boolean get() = resolvedStatus.isTailRec inline val FirCallableSymbol<*>.isTailRec: Boolean get() = rawStatus.isTailRec
inline val FirCallableSymbol<*>.isExternal: Boolean get() = resolvedStatus.isExternal inline val FirCallableSymbol<*>.isExternal: Boolean get() = rawStatus.isExternal
inline val FirCallableSymbol<*>.isSuspend: Boolean get() = resolvedStatus.isSuspend inline val FirCallableSymbol<*>.isSuspend: Boolean get() = rawStatus.isSuspend
inline val FirCallableSymbol<*>.isConst: Boolean get() = resolvedStatus.isConst inline val FirCallableSymbol<*>.isConst: Boolean get() = rawStatus.isConst
inline val FirCallableSymbol<*>.isLateInit: Boolean get() = resolvedStatus.isLateInit inline val FirCallableSymbol<*>.isLateInit: Boolean get() = rawStatus.isLateInit
inline val FirCallableSymbol<*>.isFromSealedClass: Boolean get() = resolvedStatus.isFromSealedClass inline val FirCallableSymbol<*>.isFromSealedClass: Boolean get() = rawStatus.isFromSealedClass
inline val FirCallableSymbol<*>.isFromEnumClass: Boolean get() = resolvedStatus.isFromEnumClass inline val FirCallableSymbol<*>.isFromEnumClass: Boolean get() = rawStatus.isFromEnumClass
inline val FirCallableSymbol<*>.isFun: Boolean get() = resolvedStatus.isFun inline val FirCallableSymbol<*>.isFun: Boolean get() = rawStatus.isFun
// ---------------------- regular with status ---------------------- // ---------------------- regular with status ----------------------
@@ -61,15 +61,15 @@ inline val FirClassSymbol<*>.effectiveVisibility: EffectiveVisibility get() = re
inline val FirClassSymbol<*>.isActual: Boolean get() = resolvedStatus.isActual inline val FirClassSymbol<*>.isActual: Boolean get() = resolvedStatus.isActual
inline val FirClassSymbol<*>.isExpect: Boolean get() = resolvedStatus.isExpect inline val FirClassSymbol<*>.isExpect: Boolean get() = resolvedStatus.isExpect
inline val FirClassSymbol<*>.isInner: Boolean get() = resolvedStatus.isInner inline val FirClassSymbol<*>.isInner: Boolean get() = rawStatus.isInner
inline val FirClassSymbol<*>.isStatic: Boolean get() = resolvedStatus.isStatic inline val FirClassSymbol<*>.isStatic: Boolean get() = rawStatus.isStatic
inline val FirClassSymbol<*>.isInline: Boolean get() = resolvedStatus.isInline inline val FirClassSymbol<*>.isInline: Boolean get() = rawStatus.isInline
inline val FirClassSymbol<*>.isExternal: Boolean get() = resolvedStatus.isExternal inline val FirClassSymbol<*>.isExternal: Boolean get() = rawStatus.isExternal
inline val FirClassSymbol<*>.isFromSealedClass: Boolean get() = resolvedStatus.isFromSealedClass inline val FirClassSymbol<*>.isFromSealedClass: Boolean get() = rawStatus.isFromSealedClass
inline val FirClassSymbol<*>.isFromEnumClass: Boolean get() = resolvedStatus.isFromEnumClass inline val FirClassSymbol<*>.isFromEnumClass: Boolean get() = rawStatus.isFromEnumClass
inline val FirClassSymbol<*>.isFun: Boolean get() = resolvedStatus.isFun inline val FirClassSymbol<*>.isFun: Boolean get() = rawStatus.isFun
inline val FirClassSymbol<*>.isCompanion: Boolean get() = resolvedStatus.isCompanion inline val FirClassSymbol<*>.isCompanion: Boolean get() = rawStatus.isCompanion
inline val FirClassSymbol<*>.isData: Boolean get() = resolvedStatus.isData inline val FirClassSymbol<*>.isData: Boolean get() = rawStatus.isData
inline val FirClassSymbol<*>.isSealed: Boolean get() = resolvedStatus.modality == Modality.SEALED inline val FirClassSymbol<*>.isSealed: Boolean get() = resolvedStatus.modality == Modality.SEALED
inline val FirRegularClassSymbol.canHaveAbstractDeclaration: Boolean inline val FirRegularClassSymbol.canHaveAbstractDeclaration: Boolean
@@ -93,13 +93,13 @@ inline val FirTypeAliasSymbol.effectiveVisibility: EffectiveVisibility
inline val FirTypeAliasSymbol.isActual: Boolean get() = resolvedStatus.isActual inline val FirTypeAliasSymbol.isActual: Boolean get() = resolvedStatus.isActual
inline val FirTypeAliasSymbol.isExpect: Boolean get() = resolvedStatus.isExpect inline val FirTypeAliasSymbol.isExpect: Boolean get() = resolvedStatus.isExpect
inline val FirTypeAliasSymbol.isInner: Boolean get() = resolvedStatus.isInner inline val FirTypeAliasSymbol.isInner: Boolean get() = rawStatus.isInner
inline val FirTypeAliasSymbol.isStatic: Boolean get() = resolvedStatus.isStatic inline val FirTypeAliasSymbol.isStatic: Boolean get() = rawStatus.isStatic
inline val FirTypeAliasSymbol.isInline: Boolean get() = resolvedStatus.isInline inline val FirTypeAliasSymbol.isInline: Boolean get() = rawStatus.isInline
inline val FirTypeAliasSymbol.isExternal: Boolean get() = resolvedStatus.isExternal inline val FirTypeAliasSymbol.isExternal: Boolean get() = rawStatus.isExternal
inline val FirTypeAliasSymbol.isFromSealedClass: Boolean get() = resolvedStatus.isFromSealedClass inline val FirTypeAliasSymbol.isFromSealedClass: Boolean get() = rawStatus.isFromSealedClass
inline val FirTypeAliasSymbol.isFromEnumClass: Boolean get() = resolvedStatus.isFromEnumClass inline val FirTypeAliasSymbol.isFromEnumClass: Boolean get() = rawStatus.isFromEnumClass
inline val FirTypeAliasSymbol.isFun: Boolean get() = resolvedStatus.isFun inline val FirTypeAliasSymbol.isFun: Boolean get() = rawStatus.isFun
// ---------------------- common classes ---------------------- // ---------------------- common classes ----------------------
@@ -37,6 +37,10 @@ abstract class FirCallableSymbol<D : FirCallableDeclaration> : FirBasedSymbol<D>
return fir.status as FirResolvedDeclarationStatus return fir.status as FirResolvedDeclarationStatus
} }
val rawStatus: FirDeclarationStatus
get() = fir.status
val typeParameterSymbols: List<FirTypeParameterSymbol> val typeParameterSymbols: List<FirTypeParameterSymbol>
get() { get() {
return fir.typeParameters.map { it.symbol } return fir.typeParameters.map { it.symbol }
@@ -30,6 +30,9 @@ sealed class FirClassLikeSymbol<D : FirClassLikeDeclaration>(
return fir.deprecation return fir.deprecation
} }
val rawStatus: FirDeclarationStatus
get() = fir.status
override fun toString(): String = "${this::class.simpleName} ${classId.asString()}" override fun toString(): String = "${this::class.simpleName} ${classId.asString()}"
} }