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(