FIR: introduce & resolve spread named arguments #KT-31575 Fixed

This commit is contained in:
Mikhail Glukhikh
2019-05-24 23:48:36 +03:00
parent 806d2d628c
commit 2db8409d85
18 changed files with 117 additions and 47 deletions
@@ -627,9 +627,19 @@ class FirRenderer(builder: StringBuilder) : FirVisitorVoid() {
override fun visitNamedArgumentExpression(namedArgumentExpression: FirNamedArgumentExpression) {
print(namedArgumentExpression.name)
print(" = ")
if (namedArgumentExpression.isSpread) {
print("*")
}
namedArgumentExpression.expression.accept(this)
}
override fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression) {
if (spreadArgumentExpression.isSpread) {
print("*")
}
spreadArgumentExpression.expression.accept(this)
}
override fun visitLambdaArgumentExpression(lambdaArgumentExpression: FirLambdaArgumentExpression) {
print("<L> = ")
lambdaArgumentExpression.expression.accept(this)
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions
import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirSpreadArgumentExpression : FirWrappedArgumentExpression {
override val isSpread: Boolean
get() = true
override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R =
visitor.visitSpreadArgumentExpression(this, data)
}
@@ -11,6 +11,9 @@ import org.jetbrains.kotlin.fir.visitors.FirVisitor
interface FirWrappedArgumentExpression : FirExpression {
val expression: FirExpression
val isSpread: Boolean
get() = false
override val typeRef: FirTypeRef
get() = expression.typeRef
@@ -9,7 +9,6 @@ import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirLambdaArgumentExpression
import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
@@ -20,6 +19,7 @@ class FirNamedArgumentExpressionImpl(
session: FirSession,
psi: PsiElement?,
override val name: Name,
override val isSpread: Boolean,
override var expression: FirExpression
) : FirNamedArgumentExpression, FirAbstractExpression(session, psi) {
override var typeRef: FirTypeRef
@@ -0,0 +1,30 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.expressions.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.FirSpreadArgumentExpression
import org.jetbrains.kotlin.fir.transformSingle
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirTransformer
class FirSpreadArgumentExpressionImpl(
session: FirSession,
psi: PsiElement?,
override var expression: FirExpression
) : FirSpreadArgumentExpression, FirAbstractExpression(session, psi) {
override var typeRef: FirTypeRef
get() = super<FirSpreadArgumentExpression>.typeRef
set(_) {}
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirElement {
expression = expression.transformSingle(transformer, data)
return super<FirAbstractExpression>.transformChildren(transformer, data)
}
}
@@ -300,6 +300,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformWrappedArgumentExpression(namedArgumentExpression, data)
}
open fun transformSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): CompositeTransformResult<FirStatement> {
return transformWrappedArgumentExpression(spreadArgumentExpression, data)
}
open fun transformLoop(loop: FirLoop, data: D): CompositeTransformResult<FirStatement> {
return transformStatement(loop, data)
}
@@ -680,6 +684,10 @@ abstract class FirTransformer<in D> : FirVisitor<CompositeTransformResult<FirEle
return transformReturnExpression(returnExpression, data)
}
final override fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): CompositeTransformResult<FirElement> {
return transformSpreadArgumentExpression(spreadArgumentExpression, data)
}
final override fun visitStarProjection(starProjection: FirStarProjection, data: D): CompositeTransformResult<FirElement> {
return transformStarProjection(starProjection, data)
}
@@ -300,6 +300,10 @@ abstract class FirVisitor<out R, in D> {
return visitWrappedArgumentExpression(namedArgumentExpression, data)
}
open fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: D): R {
return visitWrappedArgumentExpression(spreadArgumentExpression, data)
}
open fun visitLoop(loop: FirLoop, data: D): R {
return visitStatement(loop, data)
}
@@ -300,6 +300,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitWrappedArgumentExpression(namedArgumentExpression, null)
}
open fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression) {
visitWrappedArgumentExpression(spreadArgumentExpression, null)
}
open fun visitLoop(loop: FirLoop) {
visitStatement(loop, null)
}
@@ -680,6 +684,10 @@ abstract class FirVisitorVoid : FirVisitor<Unit, Nothing?>() {
visitReturnExpression(returnExpression)
}
final override fun visitSpreadArgumentExpression(spreadArgumentExpression: FirSpreadArgumentExpression, data: Nothing?) {
visitSpreadArgumentExpression(spreadArgumentExpression)
}
final override fun visitStarProjection(starProjection: FirStarProjection, data: Nothing?) {
visitStarProjection(starProjection)
}