From 7b9f5293dad6047d0d04dc00c4e2aca29e74c19e Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 25 Apr 2019 14:55:33 +0300 Subject: [PATCH] FIR: resolve primary constructor parameters in initializers context --- .../transformers/FirBodyResolveTransformer.kt | 33 +++++++++++++++++-- .../testData/resolve/fromBuilder/enums.txt | 2 +- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index bfbd266204e..7ab80ed3134 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType import org.jetbrains.kotlin.fir.symbols.* -import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult @@ -62,6 +61,27 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn } } + private var primaryConstructorParametersScope: FirLocalScope? = null + + override fun transformConstructor(constructor: FirConstructor, data: Any?): CompositeTransformResult { + if (constructor.isPrimary) { + primaryConstructorParametersScope = FirLocalScope().apply { + constructor.valueParameters.forEach { this.storeDeclaration(it) } + } + } + return super.transformConstructor(constructor, data) + } + + override fun transformAnonymousInitializer( + anonymousInitializer: FirAnonymousInitializer, + data: Any? + ): CompositeTransformResult { + return withScopeCleanup(localScopes) { + localScopes.addIfNotNull(primaryConstructorParametersScope) + super.transformAnonymousInitializer(anonymousInitializer, data) + } + } + override fun transformImplicitTypeRef(implicitTypeRef: FirImplicitTypeRef, data: Any?): CompositeTransformResult { if (data == null) return implicitTypeRef.compose() @@ -99,11 +119,15 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn override fun transformRegularClass(regularClass: FirRegularClass, data: Any?): CompositeTransformResult { return withScopeCleanup(scopes) { + val oldConstructorScope = primaryConstructorParametersScope + primaryConstructorParametersScope = null val type = regularClass.defaultType() scopes.addIfNotNull(type.scope(session, scopeSession)) - withLabelAndReceiverType(regularClass.name, regularClass, type) { + val result = withLabelAndReceiverType(regularClass.name, regularClass, type) { super.transformRegularClass(regularClass, data) } + primaryConstructorParametersScope = oldConstructorScope + result } } @@ -685,7 +709,10 @@ open class FirBodyResolveTransformer(val session: FirSession, val implicitTypeOn override fun transformProperty(property: FirProperty, data: Any?): CompositeTransformResult { if (property.returnTypeRef !is FirImplicitTypeRef && implicitTypeOnly) return property.compose() - return transformVariable(property, data) + return withScopeCleanup(localScopes) { + localScopes.addIfNotNull(primaryConstructorParametersScope) + transformVariable(property, data) + } } override fun transformExpression(expression: FirExpression, data: Any?): CompositeTransformResult { diff --git a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt index a6b85945550..66c402ae61e 100644 --- a/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt +++ b/compiler/fir/resolve/testData/resolve/fromBuilder/enums.txt @@ -70,7 +70,7 @@ FILE: enums.kt } - public final val g: R|kotlin/Double| = R|/Planet.Companion.G|.R|kotlin/Double.times|(R|/Planet.m|).R|kotlin/Double.div|(R|/Planet.r|.R|kotlin/Double.times|(R|/Planet.r|)) + public final val g: R|kotlin/Double| = R|/Planet.Companion.G|.R|kotlin/Double.times|(R|/m|).R|kotlin/Double.div|(R|/r|.R|kotlin/Double.times|(R|/r|)) public get(): R|kotlin/Double| public abstract fun sayHello(): R|kotlin/Unit|