From a428cc6eb44ba61823eac4f37eb04e1abceb92a5 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Wed, 24 Mar 2021 17:08:24 +0100 Subject: [PATCH] [FIR IDE] Add symbol kind to Kt accessor symbols --- .../frontend/api/symbols/KtPropertyAccessorSymbol.kt | 5 +++-- .../frontend/api/symbols/markers/KtSymbolWithKind.kt | 2 +- .../KtFirSymbolContainingDeclarationProvider.kt | 10 +++++++--- .../frontend/api/fir/symbols/KtFirFunctionSymbol.kt | 1 + .../api/fir/symbols/KtFirKotlinPropertySymbol.kt | 1 + .../api/fir/symbols/KtFirPropertyGetterSymbol.kt | 8 -------- .../api/fir/symbols/KtFirPropertySetterSymbol.kt | 8 -------- .../testData/symbols/symbolByPsi/memberProperties.kt | 2 +- .../testData/symbols/symbolByPsi/topLevelProperties.kt | 2 +- 9 files changed, 15 insertions(+), 24 deletions(-) diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt index 578e55d95ed..68ca7325786 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/KtPropertyAccessorSymbol.kt @@ -13,7 +13,8 @@ sealed class KtPropertyAccessorSymbol : KtCallableSymbol(), KtPossibleMemberSymbol, KtSymbolWithModality, KtSymbolWithVisibility, - KtAnnotatedSymbol { + KtAnnotatedSymbol, + KtSymbolWithKind { final override val callableIdIfNonLocal: CallableId? get() = null @@ -22,7 +23,7 @@ sealed class KtPropertyAccessorSymbol : KtCallableSymbol(), abstract val isOverride: Boolean abstract val hasBody: Boolean - abstract val symbolKind: KtSymbolKind + final override val symbolKind: KtSymbolKind get() = KtSymbolKind.ACCESSOR abstract override fun createPointer(): KtSymbolPointer } diff --git a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithKind.kt b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithKind.kt index 346bdbb76d8..3f234e5f034 100644 --- a/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithKind.kt +++ b/idea/idea-frontend-api/src/org/jetbrains/kotlin/idea/frontend/api/symbols/markers/KtSymbolWithKind.kt @@ -15,6 +15,6 @@ interface KtSymbolWithKind : KtSymbol { } enum class KtSymbolKind { - TOP_LEVEL, MEMBER, LOCAL + TOP_LEVEL, MEMBER, LOCAL, ACCESSOR } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index 5fe2f11bb85..6d04519e509 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtObjectLiteralExpression import org.jetbrains.kotlin.psi.KtPrimaryConstructor internal class KtFirSymbolContainingDeclarationProvider( @@ -46,9 +47,13 @@ internal class KtFirSymbolContainingDeclarationProvider( private fun getContainingDeclarationForKotlinInSourceSymbol(symbol: KtSymbolWithKind): KtSymbolWithKind = with(analysisSession) { require(symbol.origin == KtSymbolOrigin.SOURCE || symbol.origin == KtSymbolOrigin.SOURCE_MEMBER_GENERATED) - val psi = symbol.getPsi() - check(psi is KtDeclaration) { "PSI of kotlin declaration should be KtDeclaration" } + val psi = when (val psi = symbol.getPsi()) { + is KtDeclaration -> psi + is KtObjectLiteralExpression -> psi.objectDeclaration + else -> error { "PSI of kotlin declaration should be KtDeclaration but was ${psi::class.simpleName}" } + } + val containingDeclaration = when (symbol.origin) { KtSymbolOrigin.SOURCE -> psi.parentOfType() ?: error("Containing declaration should present for non-toplevel declaration") @@ -56,7 +61,6 @@ internal class KtFirSymbolContainingDeclarationProvider( else -> error("Unsupported declaration origin ${symbol.origin}") } - return with(analysisSession) { val containingSymbol = containingDeclaration.getSymbol() check(containingSymbol is KtSymbolWithKind) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt index adedd4ca0cf..80e2b084999 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirFunctionSymbol.kt @@ -107,6 +107,7 @@ internal class KtFirFunctionSymbol( fir.createSignature() ) } + KtSymbolKind.ACCESSOR -> TODO("Creating symbol for accessors fun is not supported yet") KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException( callableIdIfNonLocal?.toString() ?: name.asString() ) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt index db69082fee7..d487e84fc8e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirKotlinPropertySymbol.kt @@ -118,6 +118,7 @@ internal class KtFirKotlinPropertySymbol( fir.createSignature() ) } + KtSymbolKind.ACCESSOR -> TODO("Creating symbol for accessors is not supported yet") KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString()) } } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt index 4f4b29c5dd3..4dc2cc39f7e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertyGetterSymbol.kt @@ -46,14 +46,6 @@ internal class KtFirPropertyGetterSymbol( override val isOverride: Boolean get() = firRef.withFir { it.isOverride } override val hasBody: Boolean get() = firRef.withFir { it.body != null } - override val symbolKind: KtSymbolKind - get() = firRef.withFir { fir -> - when (fir.symbol.callableId.classId) { - null -> KtSymbolKind.TOP_LEVEL - else -> KtSymbolKind.MEMBER - } - } - override val annotatedType: KtTypeAndAnnotations by cached { firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt index 08f27367854..a65ad303526 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/symbols/KtFirPropertySetterSymbol.kt @@ -62,14 +62,6 @@ internal class KtFirPropertySetterSymbol( firRef.returnTypeAndAnnotations(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder) } - override val symbolKind: KtSymbolKind - get() = firRef.withFir { fir -> - when (fir.symbol.callableId.classId) { - null -> KtSymbolKind.TOP_LEVEL - else -> KtSymbolKind.MEMBER - } - } - override val dispatchType: KtType? by cached { firRef.dispatchReceiverTypeAndAnnotations(builder) } diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.kt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.kt index 284bf23311b..8b6e62ef4d8 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.kt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/memberProperties.kt @@ -41,7 +41,7 @@ KtFirPropertyGetterSymbol: isOverride: false modality: FINAL origin: SOURCE - symbolKind: TOP_LEVEL + symbolKind: ACCESSOR visibility: Public KtFirKotlinPropertySymbol: diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.kt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.kt index 03c137133d0..0b651218d83 100644 --- a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.kt +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/topLevelProperties.kt @@ -39,7 +39,7 @@ KtFirPropertyGetterSymbol: isOverride: false modality: FINAL origin: SOURCE - symbolKind: TOP_LEVEL + symbolKind: ACCESSOR visibility: Public KtFirKotlinPropertySymbol: