From 1915a1029fa04ea701b609f1a954d1a2cccba02e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 23 Jun 2022 15:51:46 +0200 Subject: [PATCH] [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. --- .../utils/FirSymbolStatusUtils.kt | 56 +++++++++---------- .../fir/symbols/impl/FirCallableSymbol.kt | 4 ++ .../fir/symbols/impl/FirClassLikeSymbol.kt | 3 + 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt index ea66270055e..5fdf92edc81 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirSymbolStatusUtils.kt @@ -29,20 +29,20 @@ inline val FirCallableSymbol<*>.allowsToHaveFakeOverride: Boolean inline val FirCallableSymbol<*>.isActual: Boolean get() = resolvedStatus.isActual inline val FirCallableSymbol<*>.isExpect: Boolean get() = resolvedStatus.isExpect -inline val FirCallableSymbol<*>.isInner: Boolean get() = resolvedStatus.isInner -inline val FirCallableSymbol<*>.isStatic: Boolean get() = resolvedStatus.isStatic -inline val FirCallableSymbol<*>.isOverride: Boolean get() = resolvedStatus.isOverride +inline val FirCallableSymbol<*>.isInner: Boolean get() = rawStatus.isInner +inline val FirCallableSymbol<*>.isStatic: Boolean get() = rawStatus.isStatic +inline val FirCallableSymbol<*>.isOverride: Boolean get() = rawStatus.isOverride inline val FirCallableSymbol<*>.isOperator: Boolean get() = resolvedStatus.isOperator inline val FirCallableSymbol<*>.isInfix: Boolean get() = resolvedStatus.isInfix -inline val FirCallableSymbol<*>.isInline: Boolean get() = resolvedStatus.isInline -inline val FirCallableSymbol<*>.isTailRec: Boolean get() = resolvedStatus.isTailRec -inline val FirCallableSymbol<*>.isExternal: Boolean get() = resolvedStatus.isExternal -inline val FirCallableSymbol<*>.isSuspend: Boolean get() = resolvedStatus.isSuspend -inline val FirCallableSymbol<*>.isConst: Boolean get() = resolvedStatus.isConst -inline val FirCallableSymbol<*>.isLateInit: Boolean get() = resolvedStatus.isLateInit -inline val FirCallableSymbol<*>.isFromSealedClass: Boolean get() = resolvedStatus.isFromSealedClass -inline val FirCallableSymbol<*>.isFromEnumClass: Boolean get() = resolvedStatus.isFromEnumClass -inline val FirCallableSymbol<*>.isFun: Boolean get() = resolvedStatus.isFun +inline val FirCallableSymbol<*>.isInline: Boolean get() = rawStatus.isInline +inline val FirCallableSymbol<*>.isTailRec: Boolean get() = rawStatus.isTailRec +inline val FirCallableSymbol<*>.isExternal: Boolean get() = rawStatus.isExternal +inline val FirCallableSymbol<*>.isSuspend: Boolean get() = rawStatus.isSuspend +inline val FirCallableSymbol<*>.isConst: Boolean get() = rawStatus.isConst +inline val FirCallableSymbol<*>.isLateInit: Boolean get() = rawStatus.isLateInit +inline val FirCallableSymbol<*>.isFromSealedClass: Boolean get() = rawStatus.isFromSealedClass +inline val FirCallableSymbol<*>.isFromEnumClass: Boolean get() = rawStatus.isFromEnumClass +inline val FirCallableSymbol<*>.isFun: Boolean get() = rawStatus.isFun // ---------------------- 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<*>.isExpect: Boolean get() = resolvedStatus.isExpect -inline val FirClassSymbol<*>.isInner: Boolean get() = resolvedStatus.isInner -inline val FirClassSymbol<*>.isStatic: Boolean get() = resolvedStatus.isStatic -inline val FirClassSymbol<*>.isInline: Boolean get() = resolvedStatus.isInline -inline val FirClassSymbol<*>.isExternal: Boolean get() = resolvedStatus.isExternal -inline val FirClassSymbol<*>.isFromSealedClass: Boolean get() = resolvedStatus.isFromSealedClass -inline val FirClassSymbol<*>.isFromEnumClass: Boolean get() = resolvedStatus.isFromEnumClass -inline val FirClassSymbol<*>.isFun: Boolean get() = resolvedStatus.isFun -inline val FirClassSymbol<*>.isCompanion: Boolean get() = resolvedStatus.isCompanion -inline val FirClassSymbol<*>.isData: Boolean get() = resolvedStatus.isData +inline val FirClassSymbol<*>.isInner: Boolean get() = rawStatus.isInner +inline val FirClassSymbol<*>.isStatic: Boolean get() = rawStatus.isStatic +inline val FirClassSymbol<*>.isInline: Boolean get() = rawStatus.isInline +inline val FirClassSymbol<*>.isExternal: Boolean get() = rawStatus.isExternal +inline val FirClassSymbol<*>.isFromSealedClass: Boolean get() = rawStatus.isFromSealedClass +inline val FirClassSymbol<*>.isFromEnumClass: Boolean get() = rawStatus.isFromEnumClass +inline val FirClassSymbol<*>.isFun: Boolean get() = rawStatus.isFun +inline val FirClassSymbol<*>.isCompanion: Boolean get() = rawStatus.isCompanion +inline val FirClassSymbol<*>.isData: Boolean get() = rawStatus.isData inline val FirClassSymbol<*>.isSealed: Boolean get() = resolvedStatus.modality == Modality.SEALED 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.isExpect: Boolean get() = resolvedStatus.isExpect -inline val FirTypeAliasSymbol.isInner: Boolean get() = resolvedStatus.isInner -inline val FirTypeAliasSymbol.isStatic: Boolean get() = resolvedStatus.isStatic -inline val FirTypeAliasSymbol.isInline: Boolean get() = resolvedStatus.isInline -inline val FirTypeAliasSymbol.isExternal: Boolean get() = resolvedStatus.isExternal -inline val FirTypeAliasSymbol.isFromSealedClass: Boolean get() = resolvedStatus.isFromSealedClass -inline val FirTypeAliasSymbol.isFromEnumClass: Boolean get() = resolvedStatus.isFromEnumClass -inline val FirTypeAliasSymbol.isFun: Boolean get() = resolvedStatus.isFun +inline val FirTypeAliasSymbol.isInner: Boolean get() = rawStatus.isInner +inline val FirTypeAliasSymbol.isStatic: Boolean get() = rawStatus.isStatic +inline val FirTypeAliasSymbol.isInline: Boolean get() = rawStatus.isInline +inline val FirTypeAliasSymbol.isExternal: Boolean get() = rawStatus.isExternal +inline val FirTypeAliasSymbol.isFromSealedClass: Boolean get() = rawStatus.isFromSealedClass +inline val FirTypeAliasSymbol.isFromEnumClass: Boolean get() = rawStatus.isFromEnumClass +inline val FirTypeAliasSymbol.isFun: Boolean get() = rawStatus.isFun // ---------------------- common classes ---------------------- 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 6b8b9dfd6fb..5973fb02bea 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 @@ -37,6 +37,10 @@ abstract class FirCallableSymbol : FirBasedSymbol return fir.status as FirResolvedDeclarationStatus } + val rawStatus: FirDeclarationStatus + get() = fir.status + + val typeParameterSymbols: List get() { return fir.typeParameters.map { it.symbol } 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 00224e826d1..d5ddd7c7f40 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 @@ -30,6 +30,9 @@ sealed class FirClassLikeSymbol( return fir.deprecation } + val rawStatus: FirDeclarationStatus + get() = fir.status + override fun toString(): String = "${this::class.simpleName} ${classId.asString()}" }