From 61475c48e261e9c0d104e878da77b83b107083ac Mon Sep 17 00:00:00 2001 From: Tianyu Geng Date: Sat, 22 May 2021 00:07:37 -0700 Subject: [PATCH] FIR: fix VALUE_ARGUMENTS position strategy --- .../diagnostics/LightTreePositioningStrategies.kt | 11 +++++++---- .../kotlin/fir/lightTree/converter/ConverterUtil.kt | 2 -- .../fir/lightTree/converter/ExpressionsConverter.kt | 2 +- .../kotlin/diagnostics/PositioningStrategies.kt | 6 +++++- .../psi/src/org/jetbrains/kotlin/lexer/KtTokens.java | 4 ++++ .../namedArguments/disallowForJavaMethods.fir.kt | 2 +- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index a963263cf2e..565c2987098 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -409,12 +409,15 @@ object LightTreePositioningStrategies { endOffset: Int, tree: FlyweightCapableTreeStructure ): List { - //PSI counterpart simply search for first RPAR descendant, but this one is more correct - return tree.findDescendantByType(node, KtNodeTypes.VALUE_ARGUMENT_LIST)?.let { valueArgumentList -> + val nodeToStart = when (node.tokenType) { + in KtTokens.QUALIFIED_ACCESS -> tree.findLastChildByType(node, KtNodeTypes.CALL_EXPRESSION) ?: node + else -> node + } + return tree.findDescendantByType(nodeToStart, KtNodeTypes.VALUE_ARGUMENT_LIST)?.let { valueArgumentList -> tree.findLastChildByType(valueArgumentList, KtTokens.RPAR)?.let { rpar -> markElement(rpar, startOffset, endOffset, tree, node) } - } ?: markElement(node, startOffset, endOffset, tree, node) + } ?: markElement(nodeToStart, startOffset, endOffset, tree, node) } } @@ -454,7 +457,7 @@ object LightTreePositioningStrategies { return markElement(it, startOffset, endOffset, tree, node) } } - if (node.tokenType != KtNodeTypes.DOT_QUALIFIED_EXPRESSION && node.tokenType != KtNodeTypes.SAFE_ACCESS_EXPRESSION) { + if (node.tokenType !in KtTokens.QUALIFIED_ACCESS) { return super.mark(node, startOffset, endOffset, tree) } val selector = tree.selector(node) 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 6a56f295b41..d04c1459110 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 @@ -40,8 +40,6 @@ private val expressionSet = listOf( FUN ) -val qualifiedAccessTokens = TokenSet.create(DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION) - fun String?.nameAsSafeName(defaultName: String = ""): Name { return when { this != null -> Name.identifier(this.replace("`", "")) 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 ba31cf37be0..9646ee973da 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 @@ -86,7 +86,7 @@ class ExpressionsConverter( ANNOTATED_EXPRESSION -> convertAnnotatedExpression(expression) CLASS_LITERAL_EXPRESSION -> convertClassLiteralExpression(expression) CALLABLE_REFERENCE_EXPRESSION -> convertCallableReferenceExpression(expression) - in qualifiedAccessTokens -> convertQualifiedExpression(expression) + in QUALIFIED_ACCESS -> convertQualifiedExpression(expression) CALL_EXPRESSION -> convertCallExpression(expression) WHEN -> convertWhenExpression(expression) ARRAY_ACCESS_EXPRESSION -> convertArrayAccessExpression(expression) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index bf6985a5101..360ae24b76a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -614,7 +614,11 @@ object PositioningStrategies { @JvmField val VALUE_ARGUMENTS: PositioningStrategy = object : PositioningStrategy() { override fun mark(element: KtElement): List { - return markElement(element.findDescendantOfType()?.rightParenthesis ?: element) + val qualifiedAccess = when (element) { + is KtQualifiedExpression -> element.selectorExpression ?: element + else -> element + } + return markElement(qualifiedAccess.findDescendantOfType()?.rightParenthesis ?: qualifiedAccess) } } diff --git a/compiler/psi/src/org/jetbrains/kotlin/lexer/KtTokens.java b/compiler/psi/src/org/jetbrains/kotlin/lexer/KtTokens.java index c1119d53da0..c2b20808a05 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/lexer/KtTokens.java +++ b/compiler/psi/src/org/jetbrains/kotlin/lexer/KtTokens.java @@ -22,6 +22,9 @@ import com.intellij.psi.tree.TokenSet; import org.jetbrains.kotlin.kdoc.lexer.KDocTokens; import org.jetbrains.kotlin.psi.KtPsiUtil; +import static org.jetbrains.kotlin.KtNodeTypes.DOT_QUALIFIED_EXPRESSION; +import static org.jetbrains.kotlin.KtNodeTypes.SAFE_ACCESS_EXPRESSION; + public interface KtTokens { KtToken EOF = new KtToken("EOF"); @@ -266,4 +269,5 @@ public interface KtTokens { TokenSet AUGMENTED_ASSIGNMENTS = TokenSet.create(PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ); TokenSet ALL_ASSIGNMENTS = TokenSet.create(EQ, PLUSEQ, MINUSEQ, MULTEQ, PERCEQ, DIVEQ); TokenSet INCREMENT_AND_DECREMENT = TokenSet.create(PLUSPLUS, MINUSMINUS); + TokenSet QUALIFIED_ACCESS = TokenSet.create(DOT_QUALIFIED_EXPRESSION, SAFE_ACCESS_EXPRESSION); } diff --git a/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt index b061f3680de..ab444f95a92 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt @@ -21,7 +21,7 @@ class KotlinSubSubClass : KotlinSubClass() { fun viaRealOverride() = KotlinSubSubClass().foo(kotlinName = 3) -fun unresolvedParameter() = JavaSuperClass().foo(nonexistentName = 4) +fun unresolvedParameter() = JavaSuperClass().foo(nonexistentName = 4) fun multipleParameters() = JavaSuperClass().multipleParameters(first = 1, second = 2L, third = "3")