From a55b8d30fd4b442f48b79f6a825ac7ae5c6f21f1 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 31 Jan 2024 10:18:14 +0100 Subject: [PATCH] KT-65425 [SLC] Correctly compute `getQualifiedName` for generated classes Since the declarations generated by compiler plugins do not have proper PSI (`classOrObjectDeclaration` in this case), we need to resort to symbols for such declarations to compute the proper qualified name ^KT-65425 Fixed --- ...ysisApiFirLibraryBinaryTestConfigurator.kt | 2 ++ .../classes/SymbolLightClassForClassLike.kt | 7 ++++- ...lassesByFqNameForLibraryTestGenerated.java | 6 +++++ ...ualityByFqNameForLibraryTestGenerated.java | 6 +++++ ...entingByFqNameForLibraryTestGenerated.java | 6 +++++ ...ClassesByFqNameForSourceTestGenerated.java | 6 +++++ ...qualityByFqNameForSourceTestGenerated.java | 6 +++++ ...rentingByFqNameForSourceTestGenerated.java | 6 +++++ ...nJava_ReferenceFromKotlin.descriptors.java | 7 +++++ ...ionTypeUsedInJava_ReferenceFromKotlin.java | 7 +++++ ...anionTypeUsedInJava_ReferenceFromKotlin.kt | 26 +++++++++++++++++++ .../CompilerLightClassTestGenerated.java | 5 ++++ 12 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.descriptors.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.java create mode 100644 compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirLibraryBinaryTestConfigurator.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirLibraryBinaryTestConfigurator.kt index 95a097abf7d..f6d80f666e4 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirLibraryBinaryTestConfigurator.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/configurators/AnalysisApiFirLibraryBinaryTestConfigurator.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisAp import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiLibraryBaseTestServiceRegistrar import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.AnalysisApiFirTestServiceRegistrar +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.configureOptionalTestCompilerPlugin import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtLibraryBinaryModuleFactory import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory @@ -34,6 +35,7 @@ object AnalysisApiFirLibraryBinaryTestConfigurator : AnalysisApiTestConfigurator builder.apply { useAdditionalService { KtLibraryBinaryModuleFactory } configureLibraryCompilationSupport(this) + configureOptionalTestCompilerPlugin() } } diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassLike.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassLike.kt index 4fa64d48dac..7a2c63b79e1 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassLike.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForClassLike.kt @@ -158,7 +158,12 @@ abstract class SymbolLightClassForClassLike prote override val originKind: LightClassOriginKind get() = LightClassOriginKind.SOURCE - override fun getQualifiedName(): String? = classOrObjectDeclaration?.fqName?.asString() + override fun getQualifiedName(): String? { + val classOrObjectFqName = classOrObjectDeclaration?.fqName + ?: withClassOrObjectSymbol { s -> s.classIdIfNonLocal?.asSingleFqName() } + + return classOrObjectFqName?.toString() + } override fun getInterfaces(): Array = PsiClassImplUtil.getInterfaces(this) override fun getSuperClass(): PsiClass? = PsiClassImplUtil.getSuperClass(this) diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java index 40416bcafa2..f699a67f52c 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesByFqNameForLibraryTestGenerated.java @@ -616,5 +616,11 @@ public class SymbolLightClassesByFqNameForLibraryTestGenerated extends AbstractS public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @Test + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java index 9d5f7c0c47c..50cec51946b 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesEqualityByFqNameForLibraryTestGenerated.java @@ -616,5 +616,11 @@ public class SymbolLightClassesEqualityByFqNameForLibraryTestGenerated extends A public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @Test + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java index 3cecd4a660a..df0a8e08c89 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/decompiled/SymbolLightClassesParentingByFqNameForLibraryTestGenerated.java @@ -616,5 +616,11 @@ public class SymbolLightClassesParentingByFqNameForLibraryTestGenerated extends public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @Test + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java index b5f45281634..325f16a56b9 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesByFqNameForSourceTestGenerated.java @@ -806,5 +806,11 @@ public class SymbolLightClassesByFqNameForSourceTestGenerated extends AbstractSy public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @Test + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java index 249097d267c..230db5a9959 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesEqualityByFqNameForSourceTestGenerated.java @@ -806,5 +806,11 @@ public class SymbolLightClassesEqualityByFqNameForSourceTestGenerated extends Ab public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @Test + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } } diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java index fd748fbaa12..6b81d7c7753 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/source/SymbolLightClassesParentingByFqNameForSourceTestGenerated.java @@ -806,5 +806,11 @@ public class SymbolLightClassesParentingByFqNameForSourceTestGenerated extends A public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @Test + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } } diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.descriptors.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.descriptors.java new file mode 100644 index 00000000000..d0615565e98 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.descriptors.java @@ -0,0 +1,7 @@ +public final class TestClass /* test.TestClass*/ { + private final error.NonExistentClass usage; + + public TestClass();// .ctor() + + public final error.NonExistentClass getUsage();// getUsage() +} \ No newline at end of file diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.java b/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.java new file mode 100644 index 00000000000..6b089987240 --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.java @@ -0,0 +1,7 @@ +public final class TestClass /* test.TestClass*/ { + private final MyClass.Companion usage; + + public TestClass();// .ctor() + + public final MyClass.Companion getUsage();// getUsage() +} diff --git a/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt b/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt new file mode 100644 index 00000000000..a3d139b05fd --- /dev/null +++ b/compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt @@ -0,0 +1,26 @@ +// test.TestClass + +// Java code does not see declarations generated by compiler plugins, see KT-65454 +// COMPILATION_ERRORS + +// WITH_FIR_TEST_COMPILER_PLUGIN + +// FILE: main.kt +package test + +import org.jetbrains.kotlin.fir.plugin.CompanionWithFoo + +@CompanionWithFoo +class MyClass + +class TestClass { + val usage = CompanionProvider.provide() +} + +// FILE: test/JavaClass.java +package test; + +public class CompanionProvider { + // generated MyClass.Companion type reference in java + public static MyClass.Companion provide() { return null; } +} diff --git a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java index ff886ed611f..1e9abd86f56 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/asJava/CompilerLightClassTestGenerated.java @@ -670,5 +670,10 @@ public class CompilerLightClassTestGenerated extends AbstractCompilerLightClassT public void testAllOpen() throws Exception { runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/allOpen.kt"); } + + @TestMetadata("companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt") + public void testCompanionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin() throws Exception { + runTest("compiler/testData/asJava/lightClasses/lightClassByFqName/withTestCompilerPluginEnabled/companionWithFoo_companionTypeUsedInJava_ReferenceFromKotlin.kt"); + } } }