From 500dd2027760c5312b81ce6222a65e3977e9385d Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Mon, 6 Nov 2023 18:38:21 +0100 Subject: [PATCH] KT-63096 [LL] Add test for using annotation from other module for compiler plugin --- ...leMultiModuleResolveCallTestGenerated.java | 10 ++++++++++ ...leMultiModuleResolveCallTestGenerated.java | 16 ++++++++++++++++ ...leMultiModuleResolveCallTestGenerated.java | 16 ++++++++++++++++ .../fir/test/StandaloneModeConfigurator.kt | 2 ++ .../annotationFromOtherModule.kt | 19 +++++++++++++++++++ .../annotationFromOtherModule.txt | 17 +++++++++++++++++ .../test/base/compilerPluginConfiguration.kt | 2 +- .../generators/AdditionalMembersGenerator.kt | 13 ++++++++++++- 8 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.kt create mode 100644 analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.txt diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleMultiModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleMultiModuleResolveCallTestGenerated.java index 86924ea92e5..2aebe430f8d 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleMultiModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisScriptSourceModuleMultiModuleResolveCallTestGenerated.java @@ -45,4 +45,14 @@ public class FirIdeNormalAnalysisScriptSourceModuleMultiModuleResolveCallTestGen public void testAllFilesPresentInResolveCall() throws Exception { KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall"), Pattern.compile("^(.+)\\.kts$"), null, true); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled") + @TestDataPath("$PROJECT_ROOT") + public class WithTestCompilerPluginEnabled { + @Test + public void testAllFilesPresentInWithTestCompilerPluginEnabled() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled"), Pattern.compile("^(.+)\\.kts$"), null, true); + } + } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java index f47c3731694..4c553298664 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/callResolver/FirIdeNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java @@ -57,4 +57,20 @@ public class FirIdeNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated public void testUnitTypeFromOtherModule() throws Exception { runTest("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/unitTypeFromOtherModule.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled") + @TestDataPath("$PROJECT_ROOT") + public class WithTestCompilerPluginEnabled { + @Test + public void testAllFilesPresentInWithTestCompilerPluginEnabled() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("annotationFromOtherModule.kt") + public void testAnnotationFromOtherModule() throws Exception { + runTest("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.kt"); + } + } } diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java index adf59ff40e9..b0584c8cdf6 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/callResolver/FirStandaloneNormalAnalysisSourceModuleMultiModuleResolveCallTestGenerated.java @@ -57,4 +57,20 @@ public class FirStandaloneNormalAnalysisSourceModuleMultiModuleResolveCallTestGe public void testUnitTypeFromOtherModule() throws Exception { runTest("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/unitTypeFromOtherModule.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled") + @TestDataPath("$PROJECT_ROOT") + public class WithTestCompilerPluginEnabled { + @Test + public void testAllFilesPresentInWithTestCompilerPluginEnabled() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("annotationFromOtherModule.kt") + public void testAnnotationFromOtherModule() throws Exception { + runTest("analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.kt"); + } + } } diff --git a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt index ad9b372845d..47e9e42e6d3 100644 --- a/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt +++ b/analysis/analysis-api-standalone/tests/org/jetbrains/kotlin/analysis/api/standalone/fir/test/StandaloneModeConfigurator.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.SealedClassesInheritorsCaclulatorPreAnalysisHandler +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.configureOptionalTestCompilerPlugin import org.jetbrains.kotlin.analysis.low.level.api.fir.test.configurators.AnalysisApiFirSourceTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtModuleFactory import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtSourceModuleFactory @@ -33,6 +34,7 @@ object StandaloneModeConfigurator : AnalysisApiTestConfigurator() { useAdditionalService { KtSourceModuleFactory() } useDirectives(SealedClassesInheritorsCaclulatorPreAnalysisHandler.Directives) usePreAnalysisHandlers(::SealedClassesInheritorsCaclulatorPreAnalysisHandler) + configureOptionalTestCompilerPlugin() useConfigurators(::ExternalAnnotationsEnvironmentConfigurator) useSourcePreprocessor(::ExternalAnnotationsSourcePreprocessor) } diff --git a/analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.kt b/analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.kt new file mode 100644 index 00000000000..ef1435ff5b6 --- /dev/null +++ b/analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.kt @@ -0,0 +1,19 @@ +// WITH_FIR_TEST_COMPILER_PLUGIN +// MODULE: lib + +// FILE: foo/MyAnnotation.kt +package foo + +annotation class MyAnnotation + +// MODULE: main(lib) + +// FILE: test/main.kt +package test + +@foo.MyAnnotation +class MyClass + +fun test(myClass: MyClass) { + myClass.materialize() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.txt b/analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.txt new file mode 100644 index 00000000000..b2c5ca7b807 --- /dev/null +++ b/analysis/analysis-api/testData/components/multiModuleCallResolver/resolveCall/withTestCompilerPluginEnabled/annotationFromOtherModule.txt @@ -0,0 +1,17 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = myClass + isSafeNavigation = false + type = test.MyClass + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = test.MyClass + symbol = test/MyClass.materialize(: test.MyClass): test.MyClass + valueParameters = [] + callableIdIfNonLocal = test/MyClass.materialize + typeArgumentsMapping = {} + argumentMapping = {} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt index eb17e4231cf..ea4c4d37301 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/compilerPluginConfiguration.kt @@ -29,7 +29,7 @@ private object CompilerPluginsDirectives : SimpleDirectivesContainer() { ) } -internal fun TestConfigurationBuilder.configureOptionalTestCompilerPlugin() { +fun TestConfigurationBuilder.configureOptionalTestCompilerPlugin() { useDirectives(CompilerPluginsDirectives) useConfigurators( diff --git a/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AdditionalMembersGenerator.kt b/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AdditionalMembersGenerator.kt index ccad3d81a68..4512fb1a0db 100644 --- a/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AdditionalMembersGenerator.kt +++ b/plugins/fir-plugin-prototype/src/org/jetbrains/kotlin/fir/plugin/generators/AdditionalMembersGenerator.kt @@ -29,7 +29,18 @@ class AdditionalMembersGenerator(session: FirSession) : FirDeclarationGeneration private val MATERIALIZE_NAME = Name.identifier("materialize") private val NESTED_NAME = Name.identifier("Nested") - private val PREDICATE = LookupPredicate.create { annotated("NestedClassAndMaterializeMember".fqn()) } + /** + * This annotation does not exist in 'plugin-annotations' module/jar; instead, + * it's supposed to be defined in the user's (or test case) code. + * + * We need this to test that the generation extensions and annotation resolvers + * properly work with such annotations and with the declarations marked by them. + */ + private val MY_ANNOTATION = AnnotationFqn("foo.MyAnnotation") + + private val PREDICATE = LookupPredicate.create { + annotated("NestedClassAndMaterializeMember".fqn()) or annotated(MY_ANNOTATION) + } } private val predicateBasedProvider = session.predicateBasedProvider