From 1876c8a9eebb2cd8f78dd03b84d1cd6d270fce7e Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Mon, 11 Mar 2024 11:08:21 +0100 Subject: [PATCH] [AA] Fix getKtExpressionType for augmented array assignment This previously worked on accident because the get call in an augmented array assignment wouldn't have a resolved argument list, and so `argumentsToSubstitutedValueParameters` would return null. Now, we additionally verify that we're in a `set` call. #KT-66124 --- ...AnalysisSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ .../api/fir/components/KtFirExpressionTypeProvider.kt | 4 +++- ...AnalysisSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ ...AnalysisSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ ...AnalysisSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ .../expressionType/assignment/augmentedArrayAssigment.kt | 8 ++++++++ .../expressionType/assignment/augmentedArrayAssigment.txt | 2 ++ 7 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt create mode 100644 analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java index c736720dcbe..d72b9cc3921 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/expressionTypeProvider/Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -313,6 +313,12 @@ public class Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated exte runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + @Test + @TestMetadata("augmentedArrayAssigment.kt") + public void testAugmentedArrayAssigment() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt"); + } + @Test @TestMetadata("readArrayElement.kt") public void testReadArrayElement() { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt index 44f328d7b2a..f5c4895504b 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirExpressionTypeProvider.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getOutermostParenthesizerOrThis +import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.applyIf import org.jetbrains.kotlin.utils.exceptions.rethrowExceptionWithDetails import org.jetbrains.kotlin.utils.exceptions.withPsiEntry @@ -150,7 +151,8 @@ internal class KtFirExpressionTypeProvider( expression: KtExpression, fir: FirFunctionCall, ): KtType? { - if (fir.calleeReference !is FirResolvedNamedReference) return null + // When we're in a call like `a[x] = y`, we want to get the `set` call's last argument's type. + if (fir.calleeReference !is FirResolvedNamedReference || fir.calleeReference.name != OperatorNameConventions.SET) return null if (expression !is KtArrayAccessExpression) return null val assignment = expression.parent as? KtBinaryExpression ?: return null if (assignment.operationToken !in KtTokens.ALL_ASSIGNMENTS) return null diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java index c3cc45be6d6..cd939cd49a8 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -313,6 +313,12 @@ public class FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated ex runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + @Test + @TestMetadata("augmentedArrayAssigment.kt") + public void testAugmentedArrayAssigment() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt"); + } + @Test @TestMetadata("readArrayElement.kt") public void testReadArrayElement() { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java index caddf3b733a..edcaae40248 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/expressionTypeProvider/FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -313,6 +313,12 @@ public class FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated exten runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + @Test + @TestMetadata("augmentedArrayAssigment.kt") + public void testAugmentedArrayAssigment() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt"); + } + @Test @TestMetadata("readArrayElement.kt") public void testReadArrayElement() { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java index c82a18834b8..6f289bb3411 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/expressionTypeProvider/FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerated.java @@ -313,6 +313,12 @@ public class FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerate runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + @Test + @TestMetadata("augmentedArrayAssigment.kt") + public void testAugmentedArrayAssigment() { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt"); + } + @Test @TestMetadata("readArrayElement.kt") public void testReadArrayElement() { diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt new file mode 100644 index 00000000000..46893117421 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.kt @@ -0,0 +1,8 @@ +operator fun Array.get(index1: Int, index2: Int) = this[index1 + index2] +operator fun Array.set(index1: Int, index2: Int, elem: String) { + this[index1 + index2] = elem +} + +fun test(s: Array) { + s[2, -2] += "K" +} diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.txt new file mode 100644 index 00000000000..e611af515d0 --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/augmentedArrayAssigment.txt @@ -0,0 +1,2 @@ +expression: s[2, -2] +type: kotlin.String