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 021b7930f64..2e8a63c680a 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 @@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleCompilerFacilityTestGenerate KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compilerFacility/compilation"), Pattern.compile("^(.+)\\.(kt)$"), null, true); } + @Test + @TestMetadata("annotationWithVararg.kt") + public void testAnnotationWithVararg() { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.kt"); + } + @Test @TestMetadata("classKinds.kt") public void testClassKinds() { 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 e72a49ffd09..aae015ab4f4 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 @@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisSourceModuleCompilerFacilityTestGenerated exten KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/compilerFacility/compilation"), Pattern.compile("^(.+)\\.(kt)$"), null, true); } + @Test + @TestMetadata("annotationWithVararg.kt") + public void testAnnotationWithVararg() { + runTest("analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.kt"); + } + @Test @TestMetadata("classKinds.kt") public void testClassKinds() { diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.ir.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.ir.txt new file mode 100644 index 00000000000..55080ebf4b9 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.ir.txt @@ -0,0 +1,12 @@ +MODULE_FRAGMENT + FILE fqName: fileName:main.kt + FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Int + annotations: + Anno(x = ["A", "B"]) + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.Int declared in ' + CONST Int type=kotlin.Int value=10 + FUN name:test visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + VAR name:x type:kotlin.Int [val] + CALL 'public final fun foo (): kotlin.Int declared in ' type=kotlin.Int origin=null diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.kt b/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.kt new file mode 100644 index 00000000000..987c063a0f5 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.kt @@ -0,0 +1,15 @@ +// FILE: Anno.kt +package p3 + +@Target(AnnotationTarget.FUNCTION) +annotation class Anno(vararg val x: String) + +// FILE: main.kt +import p3.Anno + +@Anno("A", "B") +fun foo(): Int = 10 + +fun test() { + val x = foo() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.txt b/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.txt new file mode 100644 index 00000000000..fe1a9347a89 --- /dev/null +++ b/analysis/analysis-api/testData/components/compilerFacility/compilation/annotationWithVararg.txt @@ -0,0 +1,5 @@ +public final class MainKt { + // source: 'main.kt' + public final static method foo(): int + public final static method test(): void +} \ No newline at end of file diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt index 4bbe9286010..079ceb86493 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt @@ -12,13 +12,18 @@ import org.jetbrains.kotlin.descriptors.isAnnotationClass import org.jetbrains.kotlin.fir.backend.* import org.jetbrains.kotlin.fir.backend.generators.FirBasedFakeOverrideGenerator import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenPropertySymbols +import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter +import org.jetbrains.kotlin.fir.declarations.primaryConstructorIfAny import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.resolve.toFirRegularClass +import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.resolvedType import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI @@ -26,6 +31,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol +import org.jetbrains.kotlin.ir.symbols.UnsafeDuringIrConstructionAPI import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.NameUtils @@ -98,9 +104,21 @@ class Fir2IrLazyProperty( private fun toIrInitializer(initializer: FirExpression?): IrExpressionBody? { // Annotations need full initializer information to instantiate them correctly return when { - containingClass?.classKind?.isAnnotationClass == true -> initializer?.asCompileTimeIrInitializer( - components, fir.returnTypeRef.coneType - ) + containingClass?.classKind?.isAnnotationClass == true -> { + var irInitializer: IrExpressionBody? = null + declarationStorage.withScope(symbol) { + with(declarationStorage) { + val firPrimaryConstructor = + fir.containingClassLookupTag()?.toFirRegularClass(session)?.primaryConstructorIfAny(session) ?: return@with + + @OptIn(UnsafeDuringIrConstructionAPI::class) + declarationStorage.getIrConstructorSymbol(firPrimaryConstructor).owner.putParametersInScope(firPrimaryConstructor.fir) + } + fir.lazyResolveToPhase(FirResolvePhase.BODY_RESOLVE) + irInitializer = initializer?.asCompileTimeIrInitializer(components, fir.returnTypeRef.coneType) + } + irInitializer + } // Setting initializers to every other class causes some cryptic errors in lowerings initializer is FirLiteralExpression<*> -> { val constType = with(typeConverter) { initializer.resolvedType.toIrType() }