From d4e1ecd9d3efccc806301996a511f3ab29c9cfac Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Thu, 22 Jul 2021 22:22:19 -0700 Subject: [PATCH] FIR IDE: fix scope processing for enum entry with members --- .../api/fir/components/KtFirScopeProvider.kt | 6 +- .../symbols/symbolByPsi/enumValueMember.kt | 137 ++++++++++++++++++ .../symbols/symbolByPsi/enumValueMember.txt | 125 ++++++++++++++++ .../api/symbols/SymbolByPsiTestGenerated.java | 6 + 4 files changed, 271 insertions(+), 3 deletions(-) create mode 100644 idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.kt create mode 100644 idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.txt diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt index e5b82bd7ddc..de11e54ae3c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirScopeProvider.kt @@ -7,10 +7,10 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import com.intellij.openapi.project.Project import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope import org.jetbrains.kotlin.fir.resolve.scope @@ -63,8 +63,8 @@ internal class KtFirScopeProvider( is KtFirAnonymousObjectSymbol -> firRef.withFir(FirResolvePhase.TYPES, body) is KtFirEnumEntrySymbol -> firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { val initializer = it.initializer - check(initializer is FirAnonymousObject) - body(initializer) + check(initializer is FirAnonymousObjectExpression) { "Unexpected enum entry initializer: ${initializer?.javaClass}" } + body(initializer.anonymousObject) } else -> error { "Unknown KtSymbolWithDeclarations implementation ${this::class.qualifiedName}" } } diff --git a/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.kt b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.kt new file mode 100644 index 00000000000..84df05256e7 --- /dev/null +++ b/idea/idea-frontend-fir/testData/symbols/symbolByPsi/enumValueMember.kt @@ -0,0 +1,137 @@ +enum class Style(val value: String) { + SHEET("foo") { + override val exitAnimation: String + get() = "bar" + }; + + abstract val exitAnimation: String +} + +// RESULT +/* +KtFirValueParameterSymbol: +annotatedType: [] kotlin/String +annotationClassIds: [] +annotations: [] +callableIdIfNonLocal: null +hasDefaultValue: false +isExtension: false +isVararg: false +name: value +origin: SOURCE +receiverType: null +symbolKind: LOCAL + +KtFirConstructorSymbol: +annotatedType: [] Style +annotationClassIds: [] +annotations: [] +callableIdIfNonLocal: null +containingClassIdIfNonLocal: Style +dispatchType: null +hasStableParameterNames: true +isExtension: false +isPrimary: true +origin: SOURCE +receiverType: null +symbolKind: MEMBER +typeParameters: [] +valueParameters: [KtFirValueParameterSymbol(value)] +visibility: Private + +KtFirPropertyGetterSymbol: +annotatedType: [] kotlin/String +annotationClassIds: [] +annotations: [] +callableIdIfNonLocal: null +dispatchType: null +hasBody: true +isDefault: false +isExtension: false +isInline: false +isOverride: false +modality: FINAL +origin: SOURCE +receiverType: null +symbolKind: ACCESSOR +visibility: Public + +KtFirKotlinPropertySymbol: +annotatedType: [] kotlin/String +annotationClassIds: [] +annotations: [] +callableIdIfNonLocal: null +dispatchType: +getter: KtFirPropertyGetterSymbol() +hasBackingField: false +hasGetter: true +hasSetter: false +initializer: null +isConst: false +isExtension: false +isLateInit: false +isOverride: true +isStatic: false +isVal: true +modality: FINAL +name: exitAnimation +origin: SOURCE +receiverType: null +setter: null +symbolKind: MEMBER +visibility: Public + +KtFirEnumEntrySymbol: +annotatedType: [] Style +callableIdIfNonLocal: /Style.SHEET +containingEnumClassIdIfNonLocal: Style +isExtension: false +name: SHEET +origin: SOURCE +receiverType: null +symbolKind: MEMBER + +KtFirKotlinPropertySymbol: +annotatedType: [] kotlin/String +annotationClassIds: [] +annotations: [] +callableIdIfNonLocal: /Style.exitAnimation +dispatchType: Style +getter: KtFirPropertyGetterSymbol() +hasBackingField: false +hasGetter: true +hasSetter: false +initializer: null +isConst: false +isExtension: false +isLateInit: false +isOverride: false +isStatic: false +isVal: true +modality: ABSTRACT +name: exitAnimation +origin: SOURCE +receiverType: null +setter: null +symbolKind: MEMBER +visibility: Public + +KtFirNamedClassOrObjectSymbol: +annotationClassIds: [] +annotations: [] +classIdIfNonLocal: Style +classKind: ENUM_CLASS +companionObject: null +isData: false +isExternal: false +isFun: false +isInline: false +isInner: false +modality: FINAL +name: Style +origin: SOURCE +superTypes: [[] kotlin/Enum