[FIR] Use correct source for implicit this receiver

#KT-57489 Fixed
#KT-56139 Fixed
#KT-56755 Fixed
This commit is contained in:
Ivan Kylchik
2023-05-10 12:51:47 +02:00
committed by Space Team
parent ab03cb2357
commit 8f88f08573
23 changed files with 286 additions and 36 deletions
@@ -38,6 +38,8 @@ abstract class FirSmartCastExpression : FirExpression() {
abstract override fun replaceTypeRef(newTypeRef: FirTypeRef)
abstract fun replaceOriginalExpression(newOriginalExpression: FirExpression)
abstract override fun <D> transformAnnotations(transformer: FirTransformer<D>, data: D): FirSmartCastExpression
abstract fun <D> transformOriginalExpression(transformer: FirTransformer<D>, data: D): FirSmartCastExpression
@@ -84,3 +84,19 @@ inline fun buildThisReceiverExpression(init: FirThisReceiverExpressionBuilder.()
}
return FirThisReceiverExpressionBuilder().apply(init).build()
}
@OptIn(ExperimentalContracts::class)
inline fun buildThisReceiverExpressionCopy(original: FirThisReceiverExpression, init: FirThisReceiverExpressionBuilder.() -> Unit): FirThisReceiverExpression {
contract {
callsInPlace(init, kotlin.contracts.InvocationKind.EXACTLY_ONCE)
}
val copyBuilder = FirThisReceiverExpressionBuilder()
copyBuilder.typeRef = original.typeRef
copyBuilder.annotations.addAll(original.annotations)
copyBuilder.contextReceiverArguments.addAll(original.contextReceiverArguments)
copyBuilder.typeArguments.addAll(original.typeArguments)
copyBuilder.source = original.source
copyBuilder.calleeReference = original.calleeReference
copyBuilder.isImplicit = original.isImplicit
return copyBuilder.apply(init).build()
}
@@ -69,4 +69,8 @@ internal class FirSmartCastExpressionImpl(
override fun replaceTypeRef(newTypeRef: FirTypeRef) {
typeRef = newTypeRef
}
override fun replaceOriginalExpression(newOriginalExpression: FirExpression) {
originalExpression = newOriginalExpression
}
}
@@ -257,6 +257,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
builder(thisReceiverExpression) {
parents += qualifiedAccessExpressionBuilder
default("isImplicit", "false")
withCopy()
}
builder(thisReference, "FirExplicitThisReference") {
@@ -562,7 +562,7 @@ object NodeConfigurator : AbstractFieldConfigurator<FirTreeBuilder>(FirTreeBuild
smartCastExpression.configure {
+typeRefField
+field("originalExpression", expression).withTransform()
+field("originalExpression", expression, withReplace = true).withTransform()
+field("typesFromSmartCast", "Collection<ConeKotlinType>", null, customType = coneKotlinTypeType)
+field("smartcastType", typeRef)
+field("smartcastTypeWithoutNullableNothing", typeRef, nullable = true)