From ee48fc320de18bcea7b3485335eaf04f56018c81 Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Mon, 19 Apr 2021 15:32:27 +0300 Subject: [PATCH] [FIR][LightTree] Mark fake nodes in FOR loop + fix bunch of tests --- .../diagnostics/LightTreePositioningStrategies.kt | 11 +++++++---- .../fir/lightTree/converter/ExpressionsConverter.kt | 2 +- .../tests/FunctionCalleeExpressions.fir.kt | 4 ++-- compiler/testData/diagnostics/tests/kt435.fir.kt | 2 +- .../resolve/nestedCalls/kt5971NestedSafeCall.fir.kt | 2 +- 5 files changed, 12 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 6f797e65534..3bbe85c3062 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 @@ -15,7 +15,6 @@ import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.KtNodeType import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.fir.FirSourceElement -import org.jetbrains.kotlin.fir.analysis.checkers.getChildren import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.MODALITY_MODIFIERS import org.jetbrains.kotlin.lexer.KtTokens.VISIBILITY_MODIFIERS @@ -402,6 +401,7 @@ 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 -> tree.findLastChildByType(valueArgumentList, KtTokens.RPAR)?.let { rpar -> markElement(rpar, startOffset, endOffset, tree, node) @@ -621,7 +621,7 @@ internal fun FlyweightCapableTreeStructure.nameIdentifier(node: private fun FlyweightCapableTreeStructure.operationReference(node: LighterASTNode): LighterASTNode? = findChildByType(node, KtNodeTypes.OPERATION_REFERENCE) -private val REFERENCE_EXPRESSIONS = setOf( +private val EXPRESSION_NODE_TYPES = setOf( KtNodeTypes.REFERENCE_EXPRESSION, KtNodeTypes.CONSTRUCTOR_DELEGATION_REFERENCE, KtNodeTypes.SUPER_EXPRESSION, @@ -630,6 +630,9 @@ private val REFERENCE_EXPRESSIONS = setOf( KtNodeTypes.LABELED_EXPRESSION, KtNodeTypes.DOT_QUALIFIED_EXPRESSION, KtNodeTypes.FUN, + KtNodeTypes.IF, + KtNodeTypes.STRING_TEMPLATE, + KtNodeTypes.LAMBDA_EXPRESSION, ) /** @@ -652,7 +655,7 @@ private fun FlyweightCapableTreeStructure.referenceExpression( val childrenRef = Ref>() getChildren(node, childrenRef) var result = childrenRef.get()?.firstOrNull { - it?.tokenType in REFERENCE_EXPRESSIONS || + it?.tokenType in EXPRESSION_NODE_TYPES || it?.tokenType is KtConstantExpressionElementType || it?.tokenType == KtNodeTypes.PARENTHESIZED } @@ -663,7 +666,7 @@ private fun FlyweightCapableTreeStructure.referenceExpression( } private fun FlyweightCapableTreeStructure.findReferenceExpressionDeep(node: LighterASTNode): LighterASTNode? = - findDescendantByTypes(node, REFERENCE_EXPRESSIONS) + findDescendantByTypes(node, EXPRESSION_NODE_TYPES) private fun FlyweightCapableTreeStructure.rightParenthesis(node: LighterASTNode): LighterASTNode? = findChildByType(node, KtTokens.RPAR) 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 c6887afba37..b7d5db01aab 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 @@ -957,7 +957,7 @@ class ExpressionsConverter( source = fakeSource val iteratorVal = generateTemporaryVariable( this@ExpressionsConverter.baseSession, - rangeExpression.source, + rangeExpression.source?.fakeElement(FirFakeSourceElementKind.DesugaredForLoop), ITERATOR_NAME, buildFunctionCall { source = fakeSource diff --git a/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.fir.kt b/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.fir.kt index 966b9ec8bf6..cef9a56ac42 100644 --- a/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.fir.kt +++ b/compiler/testData/diagnostics/tests/FunctionCalleeExpressions.fir.kt @@ -28,8 +28,8 @@ fun fooT2() : (t : T) -> T { fun main(args : Array) { args.foo()() - args.foo1()() - a.foo1()() + args.foo1()() + a.foo1()() a.foo1()(a) args.foo1()(1) diff --git a/compiler/testData/diagnostics/tests/kt435.fir.kt b/compiler/testData/diagnostics/tests/kt435.fir.kt index 5a1ac0a610e..7830a5ae3fa 100644 --- a/compiler/testData/diagnostics/tests/kt435.fir.kt +++ b/compiler/testData/diagnostics/tests/kt435.fir.kt @@ -3,5 +3,5 @@ fun Any.foo1() : (i : Int) -> Unit { } fun test(a : Any) { - a.foo1()() + a.foo1()() } diff --git a/compiler/testData/diagnostics/tests/resolve/nestedCalls/kt5971NestedSafeCall.fir.kt b/compiler/testData/diagnostics/tests/resolve/nestedCalls/kt5971NestedSafeCall.fir.kt index 6bc9de2c7d0..45c85854fd5 100644 --- a/compiler/testData/diagnostics/tests/resolve/nestedCalls/kt5971NestedSafeCall.fir.kt +++ b/compiler/testData/diagnostics/tests/resolve/nestedCalls/kt5971NestedSafeCall.fir.kt @@ -5,5 +5,5 @@ fun foo(i: Int) {} fun test(s: String?) { - foo(s?.length) + foo(s?.length) }