From 40ecd4bc1e7a667a0a02a9279ac870fecb8152ac Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 14 Sep 2023 19:06:18 +0900 Subject: [PATCH] [fir2ir] Fix annotation conversion on partial module compilation Backend requires annotation constructors to be fully resolved for the 'IrConst' default value lowering. However, in the IDE there is usually no need in complete annotation class resolution. ^KTIJ-27061 Fixed --- ...rceModuleCompilerFacilityTestGenerated.java | 6 ++++++ ...rceModuleCompilerFacilityTestGenerated.java | 6 ++++++ .../codeFragments/annotationUsage.fragment.kt | 1 + .../codeFragments/annotationUsage.ir.txt | 13 +++++++++++++ .../codeFragments/annotationUsage.kt | 18 ++++++++++++++++++ .../codeFragments/annotationUsage.txt | 5 +++++ .../generators/CallAndReferenceGenerator.kt | 6 ++++++ 7 files changed, 55 insertions(+) create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.fragment.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.ir.txt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt create mode 100644 analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.txt diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java index 552fad6bcd5..ff743a0a285 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerated.java @@ -79,6 +79,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerate KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("annotationUsage.kt") + public void testAnnotationUsage() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt"); + } + @Test @TestMetadata("customName.kt") public void testCustomName() throws Exception { diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java index ebdb12547b1..55b2a441269 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/compilerFacility/FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated.java @@ -79,6 +79,12 @@ public class FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated exten KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments"), Pattern.compile("^([^.]+)\\.kt$"), null, true); } + @Test + @TestMetadata("annotationUsage.kt") + public void testAnnotationUsage() throws Exception { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt"); + } + @Test @TestMetadata("customName.kt") public void testCustomName() throws Exception { diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.fragment.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.fragment.kt new file mode 100644 index 00000000000..6164b2a9b7a --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.fragment.kt @@ -0,0 +1 @@ +foo() + bar() \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.ir.txt new file mode 100644 index 00000000000..dfb71c6d9f6 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.ir.txt @@ -0,0 +1,13 @@ +MODULE_FRAGMENT + FILE fqName: fileName:fragment.kt + CLASS CLASS name:CodeFragment modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CodeFragment + CONSTRUCTOR visibility:public <> () returnType:.CodeFragment [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + FUN name:run visibility:public modality:FINAL <> () returnType:kotlin.Int + EXPRESSION_BODY + BLOCK type=kotlin.Int origin=null + CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=PLUS + $this: CALL 'public final fun foo (): kotlin.Int declared in .MainKt' type=kotlin.Int origin=null + other: CALL 'public final fun bar (): kotlin.Int declared in .MainKt' type=kotlin.Int origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt new file mode 100644 index 00000000000..f0e79966f8d --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.kt @@ -0,0 +1,18 @@ +// FILE: lib.kt +package lib + +@Target(AnnotationTarget.FUNCTION) +annotation class Anno(val x: String = "foo") + +// FILE: main.kt +import lib.Anno + +@Anno +fun foo(): Int = 5 + +@Anno(x = "bar") +fun bar(): Int = 10 + +fun test() { + val x = 0 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.txt new file mode 100644 index 00000000000..78e2b5055b4 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/codeFragments/annotationUsage.txt @@ -0,0 +1,5 @@ +public final class CodeFragment { + // source: 'fragment.kt' + public method (): void + public final static method run(): int +} diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index de12513a2db..ee99991a7a6 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.originalConstructorIfTypeAlias import org.jetbrains.kotlin.fir.scopes.impl.typeAliasForConstructor import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef @@ -759,6 +760,11 @@ class CallAndReferenceGenerator( startOffset, endOffset, type, "No annotation constructor found: $symbol" ) + // Annotation constructor may come unresolved on partial module compilation (inside the IDE). + // Here it is resolved together with default parameter values, as transformers convert them to constants. + // Also see 'IrConstAnnotationTransformer'. + firConstructorSymbol.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE) + val irConstructor = declarationStorage.getIrConstructorSymbol(firConstructorSymbol) IrConstructorCallImpl(