From 5047751b85759354ecce25b8d26a7e654e527e3c Mon Sep 17 00:00:00 2001 From: Victor Petukhov Date: Fri, 22 Oct 2021 14:38:04 +0300 Subject: [PATCH] [FIR] Support underscored type arguments in the light tree --- .../fir/lightTree/converter/ConverterUtil.kt | 3 +++ .../converter/DeclarationsConverter.kt | 25 ++++++++++--------- .../converter/ExpressionsConverter.kt | 2 +- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt index e97a58bece1..261fb7f8975 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ConverterUtil.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.fir.expressions.builder.buildBlock import org.jetbrains.kotlin.fir.expressions.builder.buildComponentCall import org.jetbrains.kotlin.fir.lightTree.fir.DestructuringDeclaration import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.types.FirUserTypeRef import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.KtPsiUtil @@ -108,3 +109,5 @@ fun generateDestructuringBlock( } } } + +val FirUserTypeRef.isUnderscored get() = qualifier.lastOrNull()?.name?.asString() == "_" diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index 3f2746bfdf1..788602f544c 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -51,9 +51,7 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.* -import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl -import org.jetbrains.kotlin.fir.types.impl.FirQualifierPartImpl -import org.jetbrains.kotlin.fir.types.impl.FirTypeArgumentListImpl +import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.name.* @@ -2010,7 +2008,7 @@ class DeclarationsConverter( } TYPE_ARGUMENT_LIST -> { typeArgumentsSource = it.toFirSourceElement() - firTypeArguments += convertTypeArguments(it) + firTypeArguments += convertTypeArguments(it, allowedUnderscoredTypeArgument = false) } } } @@ -2040,10 +2038,10 @@ class DeclarationsConverter( /** * @see org.jetbrains.kotlin.parsing.KotlinParsing.parseTypeArgumentList */ - fun convertTypeArguments(typeArguments: LighterASTNode): List { + fun convertTypeArguments(typeArguments: LighterASTNode, allowedUnderscoredTypeArgument: Boolean): List { return typeArguments.forEachChildrenReturnList { node, container -> when (node.tokenType) { - TYPE_PROJECTION -> container += convertTypeProjection(node) + TYPE_PROJECTION -> container += convertTypeProjection(node, allowedUnderscoredTypeArgument) } } } @@ -2051,7 +2049,7 @@ class DeclarationsConverter( /** * @see org.jetbrains.kotlin.parsing.KotlinParsing.tryParseTypeArgumentList */ - private fun convertTypeProjection(typeProjection: LighterASTNode): FirTypeProjection { + private fun convertTypeProjection(typeProjection: LighterASTNode, allowedUnderscoredTypeArgument: Boolean): FirTypeProjection { var modifiers = TypeProjectionModifier() lateinit var firType: FirTypeRef var isStarProjection = false @@ -2064,11 +2062,14 @@ class DeclarationsConverter( } //annotations from modifiers must be ignored - return if (isStarProjection) buildStarProjection { source = typeProjection.toFirSourceElement() } - else buildTypeProjectionWithVariance { - source = typeProjection.toFirSourceElement() - typeRef = firType - variance = modifiers.getVariance() + return when { + isStarProjection -> buildStarProjection { source = typeProjection.toFirSourceElement() } + allowedUnderscoredTypeArgument && (firType as? FirUserTypeRef)?.isUnderscored == true -> FirTypePlaceholderProjection + else -> buildTypeProjectionWithVariance { + source = typeProjection.toFirSourceElement() + typeRef = firType + variance = modifiers.getVariance() + } } } diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt index f21ee85ab92..48d01d20dc6 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/ExpressionsConverter.kt @@ -594,7 +594,7 @@ class ExpressionsConverter( additionalArgument = getAsFirExpression(node, "Incorrect invoke receiver") } TYPE_ARGUMENT_LIST -> { - firTypeArguments += declarationsConverter.convertTypeArguments(node) + firTypeArguments += declarationsConverter.convertTypeArguments(node, allowedUnderscoredTypeArgument = true) } VALUE_ARGUMENT_LIST, LAMBDA_ARGUMENT -> { hasArguments = true