From 860dee2cb1dcdc5b441102e8964fa1ddf0faf8a9 Mon Sep 17 00:00:00 2001 From: Jaebaek Seo Date: Wed, 25 Jan 2023 01:34:46 +0100 Subject: [PATCH] Fix reference resolver bug for companion object whose name is the same as class FirReferenceResolveHelper internally checks whether the referenced class id matches the qualifed access or not. If they do not match, it reports an error. When the companion object has the same name as the class, resolving a qualified expression access to a member of the companion object causes an error because of the mismatch e.g., ``` package my.sample class Test { fun a() { my.sample.Test.say() } companion object Test { fun say() {} } } ``` This commit fixes the issue. TODO: When the companion object has a name difference from class, it does not report an error but the resolution result is wrong in FIR. See KT-56167. --- Commentary from rebaser: the issue mentioned in this code is fixed in 71a368e06e7f0435402f1447ea5e70b2b3820cae, so the actual fix is omitted, and only test data is preserved --- ...sisSourceModuleReferenceResolveTestGenerated.java | 12 ++++++++++++ .../api/fir/references/FirReferenceResolveHelper.kt | 8 ++++---- ...sisSourceModuleReferenceResolveTestGenerated.java | 12 ++++++++++++ ...arySourceModuleReferenceResolveTestGenerated.java | 12 ++++++++++++ ...sisSourceModuleReferenceResolveTestGenerated.java | 12 ++++++++++++ ...sisSourceModuleReferenceResolveTestGenerated.java | 12 ++++++++++++ .../referenceResolve/CompanionObjectWithName1.kt | 11 +++++++++++ .../referenceResolve/CompanionObjectWithName1.txt | 2 ++ .../referenceResolve/CompanionObjectWithName2.kt | 11 +++++++++++ .../referenceResolve/CompanionObjectWithName2.txt | 2 ++ 10 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.txt create mode 100644 analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index e42502413d0..379eb5a4871 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -112,6 +112,18 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CompanionObjectWithName1.kt") + public void testCompanionObjectWithName1() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt"); + } + + @Test + @TestMetadata("CompanionObjectWithName2.kt") + public void testCompanionObjectWithName2() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt"); + } + @Test @TestMetadata("CtrlClickResolve.kt") public void testCtrlClickResolve() throws Exception { diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt index 804675f6590..b81e8440f42 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/FirReferenceResolveHelper.kt @@ -517,12 +517,12 @@ internal object FirReferenceResolveHelper { // If we're looking for the deepest qualifier, then just resolve to the companion if (expression === deepestQualifier) return referencedSymbolsByFir - if (deepestQualifier?.getReferencedName() != referencedClass.classId.shortClassName.asString()) { - // Remove the last companion name part if the qualified access does not contain it. - // This is needed because the companion name part is optional. + if (fir.resolvedToCompanionObject) { + // this flag is true only when companion object is resolved through its containing class name, + // so we want to drop companion object own name from the classId referencedClass.classId.outerClassId ?: return referencedSymbolsByFir } else { - referencedClass.classId + referencedClass.classId // ?: return referencedSymbolsByFir } } else { referencedClass.classId diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java index 18e138b9b8c..c793c0a3099 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -112,6 +112,18 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CompanionObjectWithName1.kt") + public void testCompanionObjectWithName1() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt"); + } + + @Test + @TestMetadata("CompanionObjectWithName2.kt") + public void testCompanionObjectWithName2() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt"); + } + @Test @TestMetadata("CtrlClickResolve.kt") public void testCtrlClickResolve() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java index f8c5726f00b..9b41a4a6e87 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java @@ -112,6 +112,18 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CompanionObjectWithName1.kt") + public void testCompanionObjectWithName1() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt"); + } + + @Test + @TestMetadata("CompanionObjectWithName2.kt") + public void testCompanionObjectWithName2() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt"); + } + @Test @TestMetadata("CtrlClickResolve.kt") public void testCtrlClickResolve() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 3f142670341..d6f90b03d9e 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -112,6 +112,18 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CompanionObjectWithName1.kt") + public void testCompanionObjectWithName1() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt"); + } + + @Test + @TestMetadata("CompanionObjectWithName2.kt") + public void testCompanionObjectWithName2() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt"); + } + @Test @TestMetadata("CtrlClickResolve.kt") public void testCtrlClickResolve() throws Exception { diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 2be12a3fd68..a983b483d8b 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -112,6 +112,18 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate runTest("analysis/analysis-api/testData/referenceResolve/ClassReferenceInImport.kt"); } + @Test + @TestMetadata("CompanionObjectWithName1.kt") + public void testCompanionObjectWithName1() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt"); + } + + @Test + @TestMetadata("CompanionObjectWithName2.kt") + public void testCompanionObjectWithName2() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt"); + } + @Test @TestMetadata("CtrlClickResolve.kt") public void testCtrlClickResolve() throws Exception { diff --git a/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt new file mode 100644 index 00000000000..4674b740f58 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.kt @@ -0,0 +1,11 @@ +package my.sample + +class Inner { + fun a() { + my.sample.Inner.say() + } + + companion object Inner { + fun say() {} + } +} diff --git a/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.txt b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.txt new file mode 100644 index 00000000000..8245f833d76 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName1.txt @@ -0,0 +1,2 @@ +Resolved to: +0: (in my.sample.Inner) companion object Inner diff --git a/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt new file mode 100644 index 00000000000..7bfb90528ff --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.kt @@ -0,0 +1,11 @@ +package my.sample + +class Inner { + fun a() { + my.sample.Inner.say() + } + + companion object Inner { + fun say() {} + } +} diff --git a/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.txt b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.txt new file mode 100644 index 00000000000..a4b007472a5 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/CompanionObjectWithName2.txt @@ -0,0 +1,2 @@ +Resolved to: +0: package my.sample