diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index 06d333682a5..e778bfa5051 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -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() @@ -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 diff --git a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt index 7fdfe5043b8..12c93915bae 100644 --- a/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt +++ b/compiler/fir/lightTree/tests/org/jetbrains/kotlin/fir/lightTree/compare/TreesCompareTest.kt @@ -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 + ) + } }