[FIR] Fix generation of raw FIR for delegate with receiver
This commit is contained in:
committed by
Mikhail Glukhikh
parent
ef5aab374b
commit
ca5fee77d4
+12
-2
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -6,4 +6,12 @@ fun foo() {
|
||||
|
||||
val y by lazy { "Bye" }
|
||||
y.length
|
||||
}
|
||||
|
||||
class Some {
|
||||
val z by lazy { "Some" }
|
||||
|
||||
fun foo() {
|
||||
z.length
|
||||
}
|
||||
}
|
||||
@@ -14,3 +14,21 @@ FILE: simpleLazy.kt
|
||||
)
|
||||
R|<local>/y|.R|kotlin/String.length|
|
||||
}
|
||||
public final class Some : R|kotlin/Any| {
|
||||
public constructor(): R|Some| {
|
||||
super<R|kotlin/Any|>()
|
||||
}
|
||||
|
||||
public final val z: R|kotlin/String|by R|kotlin/lazy|<R|kotlin/String|>(<L> = lazy@fun <anonymous>(): R|kotlin/String| {
|
||||
String(Some)
|
||||
}
|
||||
)
|
||||
public get(): R|kotlin/String| {
|
||||
^ D|/Some.z|.R|kotlin/getValue|<R|kotlin/String|>(this@R|/Some|, ::R|/Some.z|)
|
||||
}
|
||||
|
||||
public final fun foo(): R|kotlin/Unit| {
|
||||
this@R|/Some|.R|/Some.z|.R|kotlin/String.length|
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user