From 6e1fce6b8bac9bf6d94e00e8f200cd9d218a8bd6 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Sun, 4 Jul 2021 13:27:12 +0300 Subject: [PATCH] [FIR] Fix creating scopes for enum entry initializers Before we analyzed initializers of enum entry with scope for constructor in implict type mode, so scope was untouchable. Now we analyze them in body resolve phase, so previously we add value parameters to constructors scope, which mess up scope of enum entry initializer --- .../kotlin/fir/resolve/BodyResolveComponents.kt | 3 +++ .../transformers/body/resolve/BodyResolveContext.kt | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt index 5ea256f6f0a..166a6c473bd 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/BodyResolveComponents.kt @@ -152,6 +152,7 @@ enum class FirTowerDataMode { NESTED_CLASS, COMPANION_OBJECT, CONSTRUCTOR_HEADER, + ENUM_ENTRY, SPECIAL, } @@ -160,6 +161,7 @@ class FirTowerDataContextsForClassParts( forNestedClasses: FirTowerDataContext? = null, forCompanionObject: FirTowerDataContext? = null, forConstructorHeaders: FirTowerDataContext? = null, + forEnumEntries: FirTowerDataContext? = null, val primaryConstructorPureParametersScope: FirLocalScope? = null, val primaryConstructorAllParametersScope: FirLocalScope? = null, ) { @@ -170,6 +172,7 @@ class FirTowerDataContextsForClassParts( modeMap[NESTED_CLASS] = forNestedClasses modeMap[COMPANION_OBJECT] = forCompanionObject modeMap[CONSTRUCTOR_HEADER] = forConstructorHeaders + modeMap[ENUM_ENTRY] = forEnumEntries } var mode: FirTowerDataMode = MEMBER_DECLARATION diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt index 7c3af6f13e8..9db9bad0697 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/BodyResolveContext.kt @@ -418,6 +418,16 @@ class BodyResolveContext( val scopeForConstructorHeader = staticsAndCompanion.addNonLocalScopeIfNotNull(typeParameterScope) + /* + * Scope for enum entries is equal to initial scope for constructor header + * + * The only difference that we add value parameters to local scope for constructors + * and should not do this for enum entries + */ + + @Suppress("UnnecessaryVariable") + val scopeForEnumEntries = scopeForConstructorHeader + val newTowerDataContextForStaticNestedClasses = if ((owner as? FirRegularClass)?.classKind?.isSingleton == true) forMembersResolution @@ -437,6 +447,7 @@ class BodyResolveContext( newTowerDataContextForStaticNestedClasses, statics, scopeForConstructorHeader, + scopeForEnumEntries, primaryConstructorPureParametersScope, primaryConstructorAllParametersScope ) @@ -569,7 +580,7 @@ class BodyResolveContext( @OptIn(PrivateForInline::class) inline fun forEnumEntry( f: () -> T - ): T = withTowerDataMode(FirTowerDataMode.CONSTRUCTOR_HEADER, f) + ): T = withTowerDataMode(FirTowerDataMode.ENUM_ENTRY, f) @OptIn(PrivateForInline::class) inline fun withAnonymousInitializer(