From ca5fee77d4f7bacb07205984aa0765c99a266318 Mon Sep 17 00:00:00 2001 From: "simon.ogorodnik" Date: Fri, 31 Jan 2020 19:04:54 +0300 Subject: [PATCH] [FIR] Fix generation of raw FIR for delegate with receiver --- .../converter/DeclarationsConverter.kt | 14 ++++++++++++-- .../kotlin/fir/builder/ConversionUtils.kt | 16 ++++++++++++---- .../kotlin/fir/builder/RawFirBuilder.kt | 10 ++++++++-- .../testData/resolve/stdlib/simpleLazy.kt | 8 ++++++++ .../testData/resolve/stdlib/simpleLazy.txt | 18 ++++++++++++++++++ 5 files changed, 58 insertions(+), 8 deletions(-) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 56f5790ffd6..7adeae35da0 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -865,7 +865,13 @@ class DeclarationsConverter( FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL) ).apply { annotations += modifiers.annotations - this.generateAccessorsByDelegate(this@DeclarationsConverter.session, member = false, stubMode, receiver) + this.generateAccessorsByDelegate( + this@DeclarationsConverter.session, + member = false, + extension = false, + stubMode, + receiver + ) } } else { val status = FirDeclarationStatusImpl(modifiers.getVisibility(), modifiers.getModality()).apply { @@ -902,7 +908,11 @@ class DeclarationsConverter( this.getter = getter ?: FirDefaultPropertyGetter(null, session, returnType, modifiers.getVisibility()) this.setter = if (isVar) setter ?: FirDefaultPropertySetter(null, session, returnType, modifiers.getVisibility()) else null generateAccessorsByDelegate( - this@DeclarationsConverter.session, member = parentNode?.tokenType != KT_FILE, stubMode, receiver + this@DeclarationsConverter.session, + member = parentNode?.tokenType != KT_FILE, + extension = receiverType != null, + stubMode, + receiver ) } } diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index 32ced5eaba7..55110e3cf4f 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -314,7 +314,13 @@ fun generateTemporaryVariable( session: FirSession, source: FirSourceElement?, specialName: String, initializer: FirExpression ): FirVariable<*> = generateTemporaryVariable(session, source, Name.special("<$specialName>"), initializer) -fun FirModifiableVariable<*>.generateAccessorsByDelegate(session: FirSession, member: Boolean, stubMode: Boolean, receiver: FirExpression?) { +fun FirModifiableVariable<*>.generateAccessorsByDelegate( + session: FirSession, + member: Boolean, + extension: Boolean, + stubMode: Boolean, + receiver: FirExpression? +) { val variable = this as FirVariable<*> val delegateFieldSymbol = delegateFieldSymbol ?: return val delegate = delegate as? FirWrappedDelegateExpressionImpl ?: return @@ -323,10 +329,12 @@ fun FirModifiableVariable<*>.generateAccessorsByDelegate(session: FirSession, me } fun thisRef(): FirExpression = - if (member) FirQualifiedAccessExpressionImpl(null).apply { - calleeReference = FirExplicitThisReference(null, null) + when { + member || extension -> FirQualifiedAccessExpressionImpl(null).apply { + calleeReference = FirExplicitThisReference(null, null) + } + else -> FirConstExpressionImpl(null, FirConstKind.Null, null) } - else FirConstExpressionImpl(null, FirConstKind.Null, null) fun propertyRef() = FirCallableReferenceAccessImpl(null).apply { calleeReference = FirResolvedNamedReferenceImpl(null, variable.name, variable.symbol) diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 8570ee4dedc..6e2b1985e26 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -863,7 +863,7 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va true, FirDeclarationStatusImpl(Visibilities.LOCAL, Modality.FINAL) ).apply { - generateAccessorsByDelegate(this@RawFirBuilder.session, member = false, stubMode, receiver) + generateAccessorsByDelegate(this@RawFirBuilder.session, member = false, extension = false, stubMode, receiver) } } else { val status = FirDeclarationStatusImpl(property.visibility, property.modality).apply { @@ -895,7 +895,13 @@ class RawFirBuilder(session: FirSession, val scopeProvider: FirScopeProvider, va property.extractTypeParametersTo(this) getter = property.getter.toFirPropertyAccessor(property, propertyType, isGetter = true) setter = if (isVar) property.setter.toFirPropertyAccessor(property, propertyType, isGetter = false) else null - generateAccessorsByDelegate(this@RawFirBuilder.session, member = !property.isTopLevel, stubMode, receiver) + generateAccessorsByDelegate( + this@RawFirBuilder.session, + member = !property.isTopLevel, + extension = property.receiverTypeReference != null, + stubMode, + receiver + ) } } property.extractAnnotationsTo(firProperty) diff --git a/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.kt b/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.kt index 21681446568..899b4b911f3 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.kt +++ b/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.kt @@ -6,4 +6,12 @@ fun foo() { val y by lazy { "Bye" } y.length +} + +class Some { + val z by lazy { "Some" } + + fun foo() { + z.length + } } \ No newline at end of file diff --git a/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.txt b/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.txt index c1d5a15e543..ac493823236 100644 --- a/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.txt +++ b/compiler/fir/resolve/testData/resolve/stdlib/simpleLazy.txt @@ -14,3 +14,21 @@ FILE: simpleLazy.kt ) R|/y|.R|kotlin/String.length| } + public final class Some : R|kotlin/Any| { + public constructor(): R|Some| { + super() + } + + public final val z: R|kotlin/String|by R|kotlin/lazy|( = lazy@fun (): R|kotlin/String| { + String(Some) + } + ) + public get(): R|kotlin/String| { + ^ D|/Some.z|.R|kotlin/getValue|(this@R|/Some|, ::R|/Some.z|) + } + + public final fun foo(): R|kotlin/Unit| { + this@R|/Some|.R|/Some.z|.R|kotlin/String.length| + } + + }