From aed728c4d8324584dd1ea4d50e43c3a015f20e7a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 2 Feb 2021 18:43:04 +0100 Subject: [PATCH] FIR IDE: do not require containing declaration for getting overridden symbols --- .../kotlin/idea/frontend/api/KtAnalysisSession.kt | 6 ++++++ .../api/components/KtSymbolDeclarationOverridesProvider.kt | 7 +++++++ .../components/KtFirSymbolDeclarationOverridesProvider.kt | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt index 9c022a268e4..ef912edf1e7 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/KtAnalysisSession.kt @@ -56,9 +56,13 @@ abstract class KtAnalysisSession(final override val token: ValidityToken) : Vali abstract fun createContextDependentCopy(originalKtFile: KtFile, fakeKtElement: KtElement): KtAnalysisSession + //TODO get rid of it fun KtCallableSymbol.getOverriddenSymbols(containingDeclaration: KtClassOrObjectSymbol): List = symbolDeclarationOverridesProvider.getOverriddenSymbols(this, containingDeclaration) + fun KtCallableSymbol.getOverriddenSymbols(): List = + symbolDeclarationOverridesProvider.getOverriddenSymbols(this) + fun KtCallableSymbol.getIntersectionOverriddenSymbols(): Collection = symbolDeclarationOverridesProvider.getIntersectionOverriddenSymbols(this) @@ -75,6 +79,8 @@ abstract class KtAnalysisSession(final override val token: ValidityToken) : Vali infix fun KtType.isSubTypeOf(superType: KtType): Boolean = subtypingComponent.isSubTypeOf(this, superType) + infix fun KtType.isNotSubTypeOf(superType: KtType): Boolean = !subtypingComponent.isSubTypeOf(this, superType) + fun PsiElement.getExpectedType(): KtType? = expressionTypeProvider.getExpectedType(this) val builtinTypes: KtBuiltinTypes get() = typeProvider.builtinTypes diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtSymbolDeclarationOverridesProvider.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtSymbolDeclarationOverridesProvider.kt index caec1ed846c..6dc5415998e 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtSymbolDeclarationOverridesProvider.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/components/KtSymbolDeclarationOverridesProvider.kt @@ -18,6 +18,13 @@ abstract class KtSymbolDeclarationOverridesProvider : KtAnalysisSessionComponent containingDeclaration: KtClassOrObjectSymbol ): List + /** + * Returns symbols that overridden by requested + */ + abstract fun getOverriddenSymbols( + callableSymbol: T, + ): List + /** * If [symbol] origin is [org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbolOrigin.INTERSECTION_OVERRIDE] * Then returns the symbols which [symbol] overrides, otherwise empty collection diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt index 7dce5343342..7e2062f83dd 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolDeclarationOverridesProvider.kt @@ -20,6 +20,7 @@ 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.KtFirSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.* +import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind internal class KtFirSymbolDeclarationOverridesProvider( override val analysisSession: KtFirAnalysisSession, @@ -70,6 +71,11 @@ internal class KtFirSymbolDeclarationOverridesProvider( } } + override fun getOverriddenSymbols(callableSymbol: T): List = with(analysisSession) { + val containingDeclaration = (callableSymbol as? KtSymbolWithKind)?.getContainingSymbol() as? KtClassOrObjectSymbol ?: return emptyList() + getOverriddenSymbols(callableSymbol, containingDeclaration) + } + override fun getIntersectionOverriddenSymbols(symbol: KtCallableSymbol): Collection { require(symbol is KtFirSymbol<*>) if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList()