Write double colon suffix parsing (light tree to FIR)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
e15b91ea16
commit
50573066fe
+48
@@ -55,6 +55,8 @@ class ExpressionsConverter(
|
||||
IS_EXPRESSION -> convertIsExpression(expression)
|
||||
PREFIX_EXPRESSION, POSTFIX_EXPRESSION -> convertUnaryExpression(expression)
|
||||
ANNOTATED_EXPRESSION -> convertAnnotatedExpression(expression)
|
||||
CLASS_LITERAL_EXPRESSION -> convertClassLiteralExpression(expression)
|
||||
CALLABLE_REFERENCE_EXPRESSION -> convertCallableReferenceExpression(expression)
|
||||
in qualifiedAccessTokens -> convertQualifiedExpression(expression)
|
||||
CALL_EXPRESSION -> convertCallExpression(expression)
|
||||
ARRAY_ACCESS_EXPRESSION -> convertArrayAccessExpression(expression)
|
||||
@@ -220,6 +222,10 @@ class ExpressionsConverter(
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parsePrefixExpression
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitAnnotatedExpression
|
||||
*/
|
||||
private fun convertAnnotatedExpression(annotatedExpression: LighterASTNode): FirElement {
|
||||
var firExpression: FirElement? = null
|
||||
val firAnnotationList = mutableListOf<FirAnnotationCall>()
|
||||
@@ -236,6 +242,48 @@ class ExpressionsConverter(
|
||||
} ?: FirErrorExpressionImpl(session, null, "Strange annotated expression: ${firExpression?.render()}")
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseDoubleColonSuffix
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitClassLiteralExpression
|
||||
*/
|
||||
private fun convertClassLiteralExpression(classLiteralExpression: LighterASTNode): FirExpression {
|
||||
lateinit var firReceiverExpression: FirExpression
|
||||
classLiteralExpression.forEachChildren {
|
||||
if (it.isExpression()) firReceiverExpression = getAsFirExpression(it)
|
||||
}
|
||||
|
||||
return FirGetClassCallImpl(session, null).apply {
|
||||
arguments += firReceiverExpression
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parseDoubleColonSuffix
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitCallableReferenceExpression
|
||||
*/
|
||||
private fun convertCallableReferenceExpression(callableReferenceExpression: LighterASTNode): FirExpression {
|
||||
var isReceiver = true
|
||||
var firReceiverExpression: FirExpression? = null
|
||||
lateinit var firCallableReference: FirQualifiedAccess
|
||||
callableReferenceExpression.forEachChildren {
|
||||
when (it.tokenType) {
|
||||
COLONCOLON -> isReceiver = false
|
||||
else -> if (it.isExpression()) {
|
||||
if (isReceiver) {
|
||||
firReceiverExpression = getAsFirExpression(it)
|
||||
} else {
|
||||
firCallableReference = convertSimpleNameExpression(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return FirCallableReferenceAccessImpl(session, null).apply {
|
||||
calleeReference = firCallableReference.calleeReference
|
||||
explicitReceiver = firReceiverExpression
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @see org.jetbrains.kotlin.parsing.KotlinExpressionParsing.parsePostfixExpression
|
||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitQualifiedExpression
|
||||
|
||||
+13
@@ -173,4 +173,17 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
|
||||
visitQualifiedAccessExpression = true
|
||||
)
|
||||
}
|
||||
|
||||
fun testDoubleColonSuffix() {
|
||||
compare(
|
||||
stubMode = false,
|
||||
visitTypeOperatorCall = true,
|
||||
visitArrayOfCall = true,
|
||||
visitFunctionCall = true,
|
||||
visitGetClassCall = true,
|
||||
visitConstExpression = true,
|
||||
visitQualifiedAccessExpression = true,
|
||||
visitCallableReferenceAccess = true
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user