From 50c293f83fefc68dda1e14ec9a4378669ef2299d Mon Sep 17 00:00:00 2001 From: Jaebaek Seo Date: Fri, 5 Aug 2022 19:25:58 +0000 Subject: [PATCH] Fix array access expression getKtType() bug For an array access expression e.g., `foo[3]`, KtFirExpressionTypeProvider first tries `getReturnTypeForArrayStyleAssignmentTarget(..)` method that determines the type of the array access expression when it is in the form of "set" the value. However, the method also returns a non-null result for an array access expression that reads its value i.e., "get". In this case, the result of `getKtType()` becomes wrong. This commit lets the method return a null for the type of "get" array access expression. --- ...sSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ .../fir/components/KtFirExpressionTypeProvider.kt | 1 + ...sSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ ...sSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ ...sSourceModuleHLExpressionTypeTestGenerated.java | 6 ++++++ .../expressionType/assignment/readArrayElement.kt | 14 ++++++++++++++ .../expressionType/assignment/readArrayElement.txt | 2 ++ 7 files changed, 41 insertions(+) create mode 100644 analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt create mode 100644 analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.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 a1fea1f405d..0c5a494d605 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 @@ -258,5 +258,11 @@ public class Fe10IdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated exte public void testArrayCompoundAssignementTarget() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + + @Test + @TestMetadata("readArrayElement.kt") + public void testReadArrayElement() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt"); + } } } 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 6a4f0b776dd..33f49aaa38d 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 @@ -90,6 +90,7 @@ internal class KtFirExpressionTypeProvider( if (expression !is KtArrayAccessExpression) return null val assignment = expression.parent as? KtBinaryExpression ?: return null if (assignment.operationToken !in KtTokens.ALL_ASSIGNMENTS) return null + if (assignment.left != expression) return null val setTargetArgumentParameter = fir.argumentMapping?.entries?.last()?.value ?: return null return setTargetArgumentParameter.returnTypeRef.coneType.asKtType() } 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 0a3e3ae0f03..215d80677e0 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 @@ -258,5 +258,11 @@ public class FirIdeDependentAnalysisSourceModuleHLExpressionTypeTestGenerated ex public void testArrayCompoundAssignementTarget() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + + @Test + @TestMetadata("readArrayElement.kt") + public void testReadArrayElement() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt"); + } } } 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 56176189b3e..58ea8ac17f5 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 @@ -258,5 +258,11 @@ public class FirIdeNormalAnalysisSourceModuleHLExpressionTypeTestGenerated exten public void testArrayCompoundAssignementTarget() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + + @Test + @TestMetadata("readArrayElement.kt") + public void testReadArrayElement() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt"); + } } } 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 4ff74c84e1b..a42b29f8d4a 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 @@ -258,5 +258,11 @@ public class FirStandaloneNormalAnalysisSourceModuleHLExpressionTypeTestGenerate public void testArrayCompoundAssignementTarget() throws Exception { runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/arrayCompoundAssignementTarget.kt"); } + + @Test + @TestMetadata("readArrayElement.kt") + public void testReadArrayElement() throws Exception { + runTest("analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt"); + } } } diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt new file mode 100644 index 00000000000..ef0fb52137f --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.kt @@ -0,0 +1,14 @@ +class FOO { + var str: String = "" + operator fun plusAssign(tk: String?) { + str += tk + } +} + +fun main(args: Array) { + val foo: FOO = FOO() + if (args.size > 2) + foo += args[2] + else + foo += foo.toString() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.txt new file mode 100644 index 00000000000..62efb9c5e0c --- /dev/null +++ b/analysis/analysis-api/testData/components/expressionTypeProvider/expressionType/assignment/readArrayElement.txt @@ -0,0 +1,2 @@ +expression: args[2] +type: kotlin.String?