From 9a5791ad6d8e66bd6baae2c859620bf1f1e5e016 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 15 Jan 2021 18:37:06 +0300 Subject: [PATCH] FIR: use correct context for enum entry resolve Now the same resolve context is used for enum entries and for constructors. --- .../selfReferenceToCompanionObject.fir.txt | 49 +++++++++++++++++++ .../selfReferenceToCompanionObject.kt | 11 +++++ .../body/resolve/FirBodyResolveTransformer.kt | 4 ++ .../FirDeclarationsResolveTransformer.kt | 6 +++ .../codegen/box/enum/kt20651_inlineLambda.kt | 1 - 5 files changed, 70 insertions(+), 1 deletion(-) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt index 52c10711859..70951a63eaa 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.fir.txt @@ -30,6 +30,55 @@ FILE: selfReferenceToCompanionObject.kt } + } + public final enum class Test : R|kotlin/Enum| { + private constructor(x: R|kotlin/String|, closure1: R|() -> kotlin/String|): R|Test| { + super|>() + } + + public final val x: R|kotlin/String| = R|/x| + public get(): R|kotlin/String| + + public final val closure1: R|() -> kotlin/String| = R|/closure1| + public get(): R|() -> kotlin/String| + + public final static enum entry FOO: R|Test| = object : R|Test| { + private constructor(): R|| { + super(String(O), this@R|kotlin/Enum.Companion|.R|kotlin/run| kotlin/String|>( = run@fun R|kotlin/Enum.Companion|.(): R|() -> kotlin/String| { + ^ run@fun (): R|kotlin/String| { + ^ R|/Test.FOO|.R|/Test.x| + } + + } + )) + } + + public final override val y: R|kotlin/String| = String(K) + public get(): R|kotlin/String| + + public final val closure2: R|() -> kotlin/String| = fun (): R|kotlin/String| { + ^ this@R|/|.R|/.y| + } + + public get(): R|() -> kotlin/String| + + public final override val z: R|kotlin/String| = this@R|/|.R|/.closure2|.R|SubstitutionOverride|() + public get(): R|kotlin/String| + + } + + public abstract val y: R|kotlin/String| + public get(): R|kotlin/String| + + public abstract val z: R|kotlin/String| + public get(): R|kotlin/String| + + public final static fun values(): R|kotlin/Array| { + } + + public final static fun valueOf(value: R|kotlin/String|): R|Test| { + } + } public final fun box(): R|kotlin/String| { ^box Q|Host.Companion|.R|/Base.fn|.R|SubstitutionOverride|() diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.kt index 0d2dcfa78a4..107b41f7310 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.kt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/problems/selfReferenceToCompanionObject.kt @@ -6,4 +6,15 @@ class Host { } } +enum class Test(val x: String, val closure1: () -> String) { + FOO("O", run { { FOO.x } }) { + override val y: String = "K" + val closure2 = { y } // Implicit 'FOO' + override val z: String = closure2() + }; + + abstract val y: String + abstract val z: String +} + fun box() = Host.Companion.fn() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt index 59618303921..3243455d96b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirBodyResolveTransformer.kt @@ -250,6 +250,10 @@ open class FirBodyResolveTransformer( return declarationsTransformer.transformDeclarationStatus(declarationStatus, data) } + override fun transformEnumEntry(enumEntry: FirEnumEntry, data: ResolutionMode): CompositeTransformResult { + return declarationsTransformer.transformEnumEntry(enumEntry, data) + } + override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult { return declarationsTransformer.transformProperty(property, data) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 42e5189ef16..b160becbf98 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -99,6 +99,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor } } + override fun transformEnumEntry(enumEntry: FirEnumEntry, data: ResolutionMode): CompositeTransformResult { + context.withTowerDataContext(context.getTowerDataContextForConstructorResolution()) { + return (enumEntry.transformChildren(this, data) as FirEnumEntry).compose() + } + } + override fun transformProperty(property: FirProperty, data: ResolutionMode): CompositeTransformResult { require(property !is FirSyntheticProperty) { "Synthetic properties should not be processed by body transfromers" } diff --git a/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt b/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt index dbaefe3c9b2..d1f12734575 100644 --- a/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt +++ b/compiler/testData/codegen/box/enum/kt20651_inlineLambda.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR enum class Test(val x: String, val closure1: () -> String) { FOO("O", run { { FOO.x } }) { override val y: String = "K"