[FIR] Support dispatch & extension receiver in component calls
This commit is contained in:
+4
@@ -37,6 +37,8 @@ class FirComponentCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, F
|
||||
override var source: FirSourceElement? = null
|
||||
override val annotations: MutableList<FirAnnotationCall> = mutableListOf()
|
||||
val typeArguments: MutableList<FirTypeProjection> = mutableListOf()
|
||||
var dispatchReceiver: FirExpression = FirNoReceiverExpression
|
||||
var extensionReceiver: FirExpression = FirNoReceiverExpression
|
||||
override var argumentList: FirArgumentList = FirEmptyArgumentList
|
||||
lateinit var explicitReceiver: FirExpression
|
||||
var componentIndex: Int by kotlin.properties.Delegates.notNull<Int>()
|
||||
@@ -46,6 +48,8 @@ class FirComponentCallBuilder : FirCallBuilder, FirAnnotationContainerBuilder, F
|
||||
source,
|
||||
annotations,
|
||||
typeArguments,
|
||||
dispatchReceiver,
|
||||
extensionReceiver,
|
||||
argumentList,
|
||||
explicitReceiver,
|
||||
componentIndex,
|
||||
|
||||
+10
-3
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirArgumentList
|
||||
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeProjection
|
||||
@@ -30,14 +29,14 @@ internal class FirComponentCallImpl(
|
||||
override val source: FirSourceElement?,
|
||||
override val annotations: MutableList<FirAnnotationCall>,
|
||||
override val typeArguments: MutableList<FirTypeProjection>,
|
||||
override var dispatchReceiver: FirExpression,
|
||||
override var extensionReceiver: FirExpression,
|
||||
override var argumentList: FirArgumentList,
|
||||
override var explicitReceiver: FirExpression,
|
||||
override val componentIndex: Int,
|
||||
) : FirComponentCall() {
|
||||
override var typeRef: FirTypeRef = FirImplicitTypeRefImpl(null)
|
||||
override val safe: Boolean get() = false
|
||||
override val dispatchReceiver: FirExpression get() = FirNoReceiverExpression
|
||||
override val extensionReceiver: FirExpression get() = FirNoReceiverExpression
|
||||
override var calleeReference: FirNamedReference = FirSimpleNamedReference(source, Name.identifier("component$componentIndex"), null)
|
||||
|
||||
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
|
||||
@@ -62,6 +61,12 @@ internal class FirComponentCallImpl(
|
||||
argumentList = argumentList.transformSingle(transformer, data)
|
||||
transformCalleeReference(transformer, data)
|
||||
explicitReceiver = explicitReceiver.transformSingle(transformer, data)
|
||||
if (dispatchReceiver !== explicitReceiver) {
|
||||
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
|
||||
}
|
||||
if (extensionReceiver !== explicitReceiver && extensionReceiver !== dispatchReceiver) {
|
||||
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -76,10 +81,12 @@ internal class FirComponentCallImpl(
|
||||
}
|
||||
|
||||
override fun <D> transformDispatchReceiver(transformer: FirTransformer<D>, data: D): FirComponentCallImpl {
|
||||
dispatchReceiver = dispatchReceiver.transformSingle(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
override fun <D> transformExtensionReceiver(transformer: FirTransformer<D>, data: D): FirComponentCallImpl {
|
||||
extensionReceiver = extensionReceiver.transformSingle(transformer, data)
|
||||
return this
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -125,6 +125,7 @@ object BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>(FirTree
|
||||
|
||||
builder(componentCall) {
|
||||
parents += callBuilder
|
||||
defaultNoReceivers(notNullExplicitReceiver = true)
|
||||
default("argumentList") {
|
||||
value = "FirEmptyArgumentList"
|
||||
}
|
||||
|
||||
+1
-7
@@ -97,14 +97,8 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
|
||||
value = "false"
|
||||
withGetter = true
|
||||
}
|
||||
listOf("dispatchReceiver", "extensionReceiver").forEach {
|
||||
default(it) {
|
||||
value = "FirNoReceiverExpression"
|
||||
withGetter = true
|
||||
}
|
||||
}
|
||||
default("calleeReference", "FirSimpleNamedReference(source, Name.identifier(\"component\$componentIndex\"), null)")
|
||||
useTypes(simpleNamedReferenceType, nameType, noReceiverExpressionType)
|
||||
useTypes(simpleNamedReferenceType, nameType)
|
||||
optInToInternals()
|
||||
}
|
||||
|
||||
|
||||
+4
-2
@@ -23,8 +23,10 @@ abstract class AbstractBuilderConfigurator<T : AbstractFirTreeBuilder>(val firTr
|
||||
types.forEach { builder.usedTypes += it }
|
||||
}
|
||||
|
||||
fun defaultNoReceivers() {
|
||||
defaultNull("explicitReceiver")
|
||||
fun defaultNoReceivers(notNullExplicitReceiver: Boolean = false) {
|
||||
if (!notNullExplicitReceiver) {
|
||||
defaultNull("explicitReceiver")
|
||||
}
|
||||
default("dispatchReceiver", "FirNoReceiverExpression")
|
||||
default("extensionReceiver", "FirNoReceiverExpression")
|
||||
useTypes(noReceiverExpressionType)
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class C(val i: Int) {
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class C(val i: Int) {
|
||||
}
|
||||
|
||||
|
||||
Vendored
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
Vendored
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class A<T>(val x: String, val y: String, val z: T)
|
||||
|
||||
fun <T> foo(a: A<T>, block: (A<T>) -> String): String = block(a)
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
// WITH_RUNTIME
|
||||
|
||||
|
||||
Vendored
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
class C(val i: Int) {
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// KJS_WITH_FULL_RUNTIME
|
||||
class C(val i: Int) {
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class Range(val from : C, val to: C) {
|
||||
operator fun iterator() = It(from, to)
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class Range(val from : C, val to: C) {
|
||||
operator fun iterator() = It(from, to)
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class Range(val from : C, val to: C) {
|
||||
operator fun iterator() = It(from, to)
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class Range(val from : C, val to: C) {
|
||||
operator fun iterator() = It(from, to)
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class Range(val from : C, val to: C) {
|
||||
operator fun iterator() = It(from, to)
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class Range(val from : C, val to: C) {
|
||||
operator fun iterator() = It(from, to)
|
||||
}
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
Vendored
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Int.component1() = this + 1
|
||||
operator fun Int.component2() = this + 2
|
||||
|
||||
Vendored
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
-1
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
class M {
|
||||
operator fun Long.component1() = this + 1
|
||||
operator fun Long.component2() = this + 2
|
||||
|
||||
@@ -56,9 +56,9 @@ FILE fqName:<root> fileName:/destructuring1.kt
|
||||
GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=<root>.A
|
||||
VAR name:x type:kotlin.Int [val]
|
||||
CALL 'public final fun component1 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
|
||||
$this: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
|
||||
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
VAR name:y type:kotlin.Int [val]
|
||||
CALL 'public final fun component2 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
|
||||
$this: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
|
||||
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
|
||||
+3
-3
@@ -62,13 +62,13 @@ FILE fqName:<root> fileName:/destructuringWithUnderscore.kt
|
||||
GET_OBJECT 'CLASS OBJECT name:A modality:FINAL visibility:public superTypes:[kotlin.Any]' type=<root>.A
|
||||
VAR name:x type:kotlin.Int [val]
|
||||
CALL 'public final fun component1 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
|
||||
$this: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
|
||||
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
VAR name:_ type:kotlin.Int [val]
|
||||
CALL 'public final fun component2 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
|
||||
$this: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
|
||||
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
VAR name:z type:kotlin.Int [val]
|
||||
CALL 'public final fun component3 (): kotlin.Int [operator] declared in <root>.B' type=kotlin.Int origin=null
|
||||
$this: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
$this: GET_VAR '<this>: <root>.B declared in <root>.test' type=<root>.B origin=null
|
||||
$receiver: GET_VAR 'val tmp_0: <root>.A [val] declared in <root>.test' type=<root>.A origin=null
|
||||
|
||||
Reference in New Issue
Block a user