Raw FIR: make component call a function call, its argument -> receiver

This commit is contained in:
Mikhail Glukhikh
2019-04-02 15:27:04 +03:00
parent 30697787a0
commit a0fa9e6b48
11 changed files with 56 additions and 29 deletions
@@ -354,9 +354,7 @@ internal fun generateDestructuringBlock(
statements += FirVariableImpl(
session, entry, entry.nameAsSafeName,
entry.typeReference.toFirOrImplicitTypeRef(), isVar,
FirComponentCallImpl(session, entry, index + 1).apply {
arguments += generateAccessExpression(session, entry, container.name)
},
FirComponentCallImpl(session, entry, index + 1, generateAccessExpression(session, entry, container.name)),
FirVariableSymbol(entry.nameAsSafeName) // TODO?
).apply {
entry.extractAnnotationsTo(this)
@@ -28,6 +28,6 @@ FILE: annotated.kt
}
public? final? fun bar(two: Two): kotlin/Unit {
lval <destruct>: <implicit> = two#
@Ann() lval x: <implicit> = component1(<destruct>#)
@Ann() lval y: <implicit> = component2(<destruct>#)
@Ann() lval x: <implicit> = <destruct>#.component1()
@Ann() lval y: <implicit> = <destruct>#.component2()
}
@@ -14,9 +14,9 @@ FILE: destructuring.kt
}
public? final? fun foo(some: Some): kotlin/Unit {
lval <destruct>: <implicit> = some#
lvar x: <implicit> = component1(<destruct>#)
lvar y: <implicit> = component2(<destruct>#)
lvar z: String = component3(<destruct>#)
lvar x: <implicit> = <destruct>#.component1()
lvar y: <implicit> = <destruct>#.component2()
lvar z: String = <destruct>#.component3()
lval <unary>: <implicit> = x#
x# = inc#(<unary>#)
<unary>#
@@ -39,8 +39,8 @@ FILE: for.kt
lval <iterator>: <implicit> = <range>#.iterator#()
while(<iterator>#.hasNext#()) {
lval <destruct>: <implicit> = <iterator>#.next#()
lval x: <implicit> = component1(<destruct>#)
lval y: <implicit> = component2(<destruct>#)
lval x: <implicit> = <destruct>#.component1()
lval y: <implicit> = <destruct>#.component2()
println#(plus#(String(x = ), x#, String( y = ), y#))
}
@@ -24,8 +24,8 @@ FILE: lambda.kt
use#(use@fun <implicit>.<anonymous>(<destruct>: <implicit>): <implicit> {
^ {
lval x: <implicit> = component1(<destruct>#)
lval y: <implicit> = component2(<destruct>#)
lval x: <implicit> = <destruct>#.component1()
lval y: <implicit> = <destruct>#.component2()
plus#(x#, y#)
}
@@ -868,8 +868,8 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitComponentCall(componentCall: FirComponentCall) {
componentCall.annotations.renderAnnotations()
print("component${componentCall.componentIndex}")
visitCall(componentCall)
componentCall.explicitReceiver.accept(this)
print(".component${componentCall.componentIndex}()")
}
override fun visitGetClassCall(getClassCall: FirGetClassCall) {
@@ -7,10 +7,12 @@ package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirComponentCall : FirCall {
interface FirComponentCall : FirFunctionCall {
// Starting from 1, not from 0
val componentIndex: Int
override val explicitReceiver: FirExpression
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitComponentCall(this, data)
}
@@ -6,11 +6,38 @@
package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirNamedReference
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirComponentCall
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccess
import org.jetbrains.kotlin.fir.references.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeProjection
import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.name.Name
class FirComponentCallImpl(
session: FirSession,
psi: PsiElement?,
override val componentIndex: Int
) : FirAbstractCall(session, psi), FirComponentCall
override val componentIndex: Int,
override var explicitReceiver: FirExpression
) : FirAbstractCall(session, psi), FirComponentCall {
override var calleeReference: FirNamedReference =
FirSimpleNamedReference(session, psi, Name.identifier("component$componentIndex"))
override val typeArguments: List<FirTypeProjection>
get() = emptyList()
override fun <D> transformCalleeReference(transformer: FirTransformer<D>, data: D): FirQualifiedAccess {
calleeReference = calleeReference.transformSingle(transformer, data)
return this
}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
calleeReference = calleeReference.transformSingle(transformer, data)
explicitReceiver = explicitReceiver.transformSingle(transformer, data)
return super<FirAbstractCall>.transformChildren(transformer, data)
}
}
@@ -212,10 +212,6 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformCall(arraySetCall, data)
}
open fun transformComponentCall(componentCall: FirComponentCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(componentCall, data)
}
open fun transformDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(delegatedConstructorCall, data)
}
@@ -224,6 +220,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformCall(functionCall, data)
}
open fun transformComponentCall(componentCall: FirComponentCall, data: D): CompositeTransformResult<FirStatement> {
return transformFunctionCall(componentCall, data)
}
open fun transformGetClassCall(getClassCall: FirGetClassCall, data: D): CompositeTransformResult<FirStatement> {
return transformCall(getClassCall, data)
}
@@ -212,10 +212,6 @@ abstract class FirVisitor<out R, in D> {
return visitCall(arraySetCall, data)
}
open fun visitComponentCall(componentCall: FirComponentCall, data: D): R {
return visitCall(componentCall, data)
}
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: D): R {
return visitCall(delegatedConstructorCall, data)
}
@@ -224,6 +220,10 @@ abstract class FirVisitor<out R, in D> {
return visitCall(functionCall, data)
}
open fun visitComponentCall(componentCall: FirComponentCall, data: D): R {
return visitFunctionCall(componentCall, data)
}
open fun visitGetClassCall(getClassCall: FirGetClassCall, data: D): R {
return visitCall(getClassCall, data)
}
@@ -212,10 +212,6 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCall(arraySetCall, null)
}
open fun visitComponentCall(componentCall: FirComponentCall) {
visitCall(componentCall, null)
}
open fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall) {
visitCall(delegatedConstructorCall, null)
}
@@ -224,6 +220,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitCall(functionCall, null)
}
open fun visitComponentCall(componentCall: FirComponentCall) {
visitFunctionCall(componentCall, null)
}
open fun visitGetClassCall(getClassCall: FirGetClassCall) {
visitCall(getClassCall, null)
}