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)
|
IS_EXPRESSION -> convertIsExpression(expression)
|
||||||
PREFIX_EXPRESSION, POSTFIX_EXPRESSION -> convertUnaryExpression(expression)
|
PREFIX_EXPRESSION, POSTFIX_EXPRESSION -> convertUnaryExpression(expression)
|
||||||
ANNOTATED_EXPRESSION -> convertAnnotatedExpression(expression)
|
ANNOTATED_EXPRESSION -> convertAnnotatedExpression(expression)
|
||||||
|
CLASS_LITERAL_EXPRESSION -> convertClassLiteralExpression(expression)
|
||||||
|
CALLABLE_REFERENCE_EXPRESSION -> convertCallableReferenceExpression(expression)
|
||||||
in qualifiedAccessTokens -> convertQualifiedExpression(expression)
|
in qualifiedAccessTokens -> convertQualifiedExpression(expression)
|
||||||
CALL_EXPRESSION -> convertCallExpression(expression)
|
CALL_EXPRESSION -> convertCallExpression(expression)
|
||||||
ARRAY_ACCESS_EXPRESSION -> convertArrayAccessExpression(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 {
|
private fun convertAnnotatedExpression(annotatedExpression: LighterASTNode): FirElement {
|
||||||
var firExpression: FirElement? = null
|
var firExpression: FirElement? = null
|
||||||
val firAnnotationList = mutableListOf<FirAnnotationCall>()
|
val firAnnotationList = mutableListOf<FirAnnotationCall>()
|
||||||
@@ -236,6 +242,48 @@ class ExpressionsConverter(
|
|||||||
} ?: FirErrorExpressionImpl(session, null, "Strange annotated expression: ${firExpression?.render()}")
|
} ?: 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.parsing.KotlinExpressionParsing.parsePostfixExpression
|
||||||
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitQualifiedExpression
|
* @see org.jetbrains.kotlin.fir.builder.RawFirBuilder.Visitor.visitQualifiedExpression
|
||||||
|
|||||||
+13
@@ -173,4 +173,17 @@ class TreesCompareTest : AbstractRawFirBuilderTestCase() {
|
|||||||
visitQualifiedAccessExpression = true
|
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