From b026678a3454adb2b66a4c073ed50231aeef231f Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 24 Jan 2023 15:46:44 +0100 Subject: [PATCH] [LL] retrieve fir from generated property of desugaring ++ operator ^ KTIJ-24385 Temp property to store receiver is generated for `a.b++` expression. If this property's psi corresponds to receiver expr, then FirProperty would be found by mapper if receiver is requested. It works unexpectedly, because FirProperty is normally not expected by expression. This change set fake sources for generated FirProperty, so it won't be found by source psi --- ...sisSourceModuleResolveCallTestGenerated.java | 12 ++++++++++++ ...sisSourceModuleResolveCallTestGenerated.java | 12 ++++++++++++ ...sisSourceModuleResolveCallTestGenerated.java | 12 ++++++++++++ .../resolveCall/arrayIncWithDotQualifier.kt | 10 ++++++++++ .../resolveCall/arrayIncWithDotQualifier.txt | 17 +++++++++++++++++ .../resolveCall/incWithDotQualifier.kt | 10 ++++++++++ .../resolveCall/incWithDotQualifier.txt | 17 +++++++++++++++++ .../qualifiedPartOfQualifiedCallUnresolved.kt | 5 +++++ .../qualifiedPartOfQualifiedCallUnresolved.txt | 6 ++++++ ...OfContentRootGetOrBuildFirTestGenerated.java | 6 ++++++ .../fir/SourceGetOrBuildFirTestGenerated.java | 6 ++++++ .../kotlin/fir/builder/BaseFirBuilder.kt | 3 +-- 12 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.txt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.kt create mode 100644 analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 5c9ff56011a..3da254a4ca6 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/callResolver/Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -202,6 +202,12 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/annotationOnReceiver.kt"); } + @Test + @TestMetadata("arrayIncWithDotQualifier.kt") + public void testArrayIncWithDotQualifier() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt"); + } + @Test @TestMetadata("arrayOfInAnnotation.kt") public void testArrayOfInAnnotation() throws Exception { @@ -502,6 +508,12 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/implicitJavaConstuctorCall.kt"); } + @Test + @TestMetadata("incWithDotQualifier.kt") + public void testIncWithDotQualifier() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt"); + } + @Test @TestMetadata("indexedGet.kt") public void testIndexedGet() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java index 1364ee679bb..b2543f38d1a 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -202,6 +202,12 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/annotationOnReceiver.kt"); } + @Test + @TestMetadata("arrayIncWithDotQualifier.kt") + public void testArrayIncWithDotQualifier() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt"); + } + @Test @TestMetadata("arrayOfInAnnotation.kt") public void testArrayOfInAnnotation() throws Exception { @@ -502,6 +508,12 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/implicitJavaConstuctorCall.kt"); } + @Test + @TestMetadata("incWithDotQualifier.kt") + public void testIncWithDotQualifier() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt"); + } + @Test @TestMetadata("indexedGet.kt") public void testIndexedGet() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java index 44c9af212f7..585e74956c9 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated.java @@ -202,6 +202,12 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/annotationOnReceiver.kt"); } + @Test + @TestMetadata("arrayIncWithDotQualifier.kt") + public void testArrayIncWithDotQualifier() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt"); + } + @Test @TestMetadata("arrayOfInAnnotation.kt") public void testArrayOfInAnnotation() throws Exception { @@ -502,6 +508,12 @@ public class FirStandaloneNormalAnalysisSourceModuleResolveCallTestGenerated ext runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/implicitJavaConstuctorCall.kt"); } + @Test + @TestMetadata("incWithDotQualifier.kt") + public void testIncWithDotQualifier() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt"); + } + @Test @TestMetadata("indexedGet.kt") public void testIndexedGet() throws Exception { diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt new file mode 100644 index 00000000000..1453584ef01 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.kt @@ -0,0 +1,10 @@ +// IGNORE_FE10 +class F { + val a = arrayOf(1, 2) + fun handleLeftBracketInFragment() { + foo().peek().a[0]++ + } + + fun foo() : F = F() + fun peek() : F = this +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.txt new file mode 100644 index 00000000000..4636ebafcc5 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/arrayIncWithDotQualifier.txt @@ -0,0 +1,17 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = foo() + isSafeNavigation = false + type = F + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = F + symbol = /F.peek(: F): F + valueParameters = [] + callableIdIfNonLocal = /F.peek + typeArgumentsMapping = {} + argumentMapping = {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt new file mode 100644 index 00000000000..8a189a3e082 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.kt @@ -0,0 +1,10 @@ +// IGNORE_FE10 +class F { + var a = 1 + fun handleLeftBracketInFragment() { + foo().peek().a++ + } + + fun foo() : F = F() + fun peek() : F = this +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.txt new file mode 100644 index 00000000000..4636ebafcc5 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/incWithDotQualifier.txt @@ -0,0 +1,17 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = foo() + isSafeNavigation = false + type = F + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = F + symbol = /F.peek(: F): F + valueParameters = [] + callableIdIfNonLocal = /F.peek + typeArgumentsMapping = {} + argumentMapping = {} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.kt new file mode 100644 index 00000000000..43afeb9a29e --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.kt @@ -0,0 +1,5 @@ +class FF { + fun handleLeftBracketInFragment() { + peek().braceBalance++ + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.txt new file mode 100644 index 00000000000..2c3a0c85f8d --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.txt @@ -0,0 +1,6 @@ +KT element: KtCallExpression +FIR element: FirFunctionCallImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +#() \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java index a7efa9c4948..e80f08ca688 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/OutOfContentRootGetOrBuildFirTestGenerated.java @@ -619,6 +619,12 @@ public class OutOfContentRootGetOrBuildFirTestGenerated extends AbstractOutOfCon runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/middlePartOfQualifiedCallWithNestedClasses.kt"); } + @Test + @TestMetadata("qualifiedPartOfQualifiedCallUnresolved.kt") + public void testQualifiedPartOfQualifiedCallUnresolved() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.kt"); + } + @Test @TestMetadata("qualifiedPartOfQualifiedCallWithNestedClasses.kt") public void testQualifiedPartOfQualifiedCallWithNestedClasses() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java index 5c47c14eddf..bb6d4edae38 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/SourceGetOrBuildFirTestGenerated.java @@ -619,6 +619,12 @@ public class SourceGetOrBuildFirTestGenerated extends AbstractSourceGetOrBuildFi runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/middlePartOfQualifiedCallWithNestedClasses.kt"); } + @Test + @TestMetadata("qualifiedPartOfQualifiedCallUnresolved.kt") + public void testQualifiedPartOfQualifiedCallUnresolved() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/qualifiedExpressions/qualifiedPartOfQualifiedCallUnresolved.kt"); + } + @Test @TestMetadata("qualifiedPartOfQualifiedCallWithNestedClasses.kt") public void testQualifiedPartOfQualifiedCallWithNestedClasses() throws Exception { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index d020505ae08..e21ff366f58 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -703,7 +703,6 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte prefix: Boolean, convert: T.() -> FirExpression ): FirExpression { - val argumentReceiver = receiverForOperation.receiverExpression // a return buildBlockProbablyUnderSafeCall( receiverForOperation, convert, @@ -720,7 +719,7 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte val argumentReceiverVariable = generateTemporaryVariable( baseModuleData, - argumentReceiver?.toFirSourceElement(), + desugaredSource, SpecialNames.RECEIVER, initializer = receiverFir, ).also { statements += it }