Write arrayOf call parsing (light tree to FIR)

This commit is contained in:
Ivan Cilcic
2019-07-17 14:04:07 +03:00
committed by Mikhail Glukhikh
parent 9d36855cb6
commit e15b91ea16
3 changed files with 26 additions and 42 deletions
@@ -58,6 +58,7 @@ class ExpressionsConverter(
in qualifiedAccessTokens -> convertQualifiedExpression(expression)
CALL_EXPRESSION -> convertCallExpression(expression)
ARRAY_ACCESS_EXPRESSION -> convertArrayAccessExpression(expression)
COLLECTION_LITERAL_EXPRESSION -> convertCollectionLiteralExpresion(expression)
STRING_TEMPLATE -> convertStringTemplate(expression)
is KtConstantExpressionElementType -> convertConstantExpression(expression)
REFERENCE_EXPRESSION -> convertSimpleNameExpression(expression)
@@ -441,6 +442,20 @@ class ExpressionsConverter(
}
}
/**
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseCollectionLiteralExpression
*/
private fun convertCollectionLiteralExpresion(expression: LighterASTNode): FirExpression {
val firExpressionList = mutableListOf<FirExpression>()
expression.forEachChildren {
if (it.isExpression()) firExpressionList += getAsFirExpression<FirExpression>(it)
}
return FirArrayOfCallImpl(session, null).apply {
arguments += firExpressionList
}
}
/**
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseAsCollectionLiteralExpression
*/
@@ -32,15 +32,12 @@ class FirPartialTransformer(
private val visitReturnExpression: Boolean = false,
private val visitThrowExpression: Boolean = false,
private val visitForLoop: Boolean = false,
private val visitClassReferenceExpression: Boolean = false,
private val visitConstExpression: Boolean = false,
private val visitQualifiedAccessExpression: Boolean = false,
private val visitCallableReferenceAccess: Boolean = false,
private val visitTryExpression: Boolean = false,
private val visitWhenExpression: Boolean = false,
private val visitNamedArgumentExpression: Boolean = false,
private val visitLambdaArgumentExpression: Boolean = false,
private val visitSpreadArgumentExpression: Boolean = false,
private val visitAnonymousObject: Boolean = false,
private val visitDoWhileLoop: Boolean = false,
private val visitWhileLoop: Boolean = false,
@@ -177,17 +174,6 @@ class FirPartialTransformer(
}
}
override fun transformClassReferenceExpression(
classReferenceExpression: FirClassReferenceExpression,
data: Nothing?
): CompositeTransformResult<FirStatement> {
return if (visitClassReferenceExpression) {
(classReferenceExpression.transformChildren(this, data) as FirClassReferenceExpression).compose()
} else {
DummyFirStatement().compose()
}
}
override fun <T> transformConstExpression(
constExpression: FirConstExpression<T>,
data: Nothing?
@@ -237,17 +223,6 @@ class FirPartialTransformer(
}
}
override fun transformNamedArgumentExpression(
namedArgumentExpression: FirNamedArgumentExpression,
data: Nothing?
): CompositeTransformResult<FirStatement> {
return if (visitNamedArgumentExpression) {
(namedArgumentExpression.transformChildren(this, data) as FirNamedArgumentExpression).compose()
} else {
DummyFirStatement().compose()
}
}
override fun transformLambdaArgumentExpression(
lambdaArgumentExpression: FirLambdaArgumentExpression,
data: Nothing?
@@ -259,17 +234,6 @@ class FirPartialTransformer(
}
}
override fun transformSpreadArgumentExpression(
spreadArgumentExpression: FirSpreadArgumentExpression,
data: Nothing?
): CompositeTransformResult<FirStatement> {
return if (visitSpreadArgumentExpression) {
(spreadArgumentExpression.transformChildren(this, data) as FirSpreadArgumentExpression).compose()
} else {
DummyFirStatement().compose()
}
}
override fun transformAnonymousObject(anonymousObject: FirAnonymousObject, data: Nothing?): CompositeTransformResult<FirStatement> {
return if (visitAnonymousObject) {
(anonymousObject.transformChildren(this, data) as FirAnonymousObject).compose()
@@ -72,15 +72,12 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
visitReturnExpression: Boolean = false,
visitThrowExpression: Boolean = false,
visitForLoop: Boolean = false,
visitClassReferenceExpression: Boolean = false,
visitConstExpression: Boolean = false,
visitQualifiedAccessExpression: Boolean = false,
visitCallableReferenceAccess: Boolean = false,
visitTryExpression: Boolean = false,
visitWhenExpression: Boolean = false,
visitNamedArgumentExpression: Boolean = false,
visitLambdaArgumentExpression: Boolean = false,
visitSpreadArgumentExpression: Boolean = false,
visitAnonymousObject: Boolean = false,
visitDoWhileLoop: Boolean = false,
visitWhileLoop: Boolean = false,
@@ -102,15 +99,12 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
visitReturnExpression = visitReturnExpression,
visitThrowExpression = visitThrowExpression,
visitForLoop = visitForLoop,
visitClassReferenceExpression = visitClassReferenceExpression,
visitConstExpression = visitConstExpression,
visitQualifiedAccessExpression = visitQualifiedAccessExpression,
visitCallableReferenceAccess = visitCallableReferenceAccess,
visitTryExpression = visitTryExpression,
visitWhenExpression = visitWhenExpression,
visitNamedArgumentExpression = visitNamedArgumentExpression,
visitLambdaArgumentExpression = visitLambdaArgumentExpression,
visitSpreadArgumentExpression = visitSpreadArgumentExpression,
visitAnonymousObject = visitAnonymousObject,
visitDoWhileLoop = visitDoWhileLoop,
visitWhileLoop = visitWhileLoop,
@@ -168,4 +162,15 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
visitQualifiedAccessExpression = true
)
}
fun testArrayOfCall() {
compare(
stubMode = false,
visitTypeOperatorCall = true,
visitArrayOfCall = true,
visitFunctionCall = true,
visitConstExpression = true,
visitQualifiedAccessExpression = true
)
}
}