diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.kt b/analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.kt new file mode 100644 index 00000000000..ad4f5c70588 --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.kt @@ -0,0 +1,21 @@ +// SKIP_WHEN_OUT_OF_CONTENT_ROOT +// FILE: ArrayAnnUsage.kt +package light.ann.array + +import light.ann.array.AnnAuxEnum.ANN_ENUM_VAL_A; +import light.ann.array.AnnAuxEnum.ANN_ENUM_VAL_B; + +enum class AnnAuxEnum { ANN_ENUM_VAL_A, ANN_ENUM_VAL_B } + +@ArrayAnnEnumJava(enumValDef = arrayOf(ANN_ENUM_VAL_A, ANN_ENUM_VAL_B)) +fun box() = "OK" + +// FILE: ArrayAnnEnumJava.java +package light.ann.array; + +import static light.ann.array.AnnAuxEnum.ANN_ENUM_VAL_A; +import static light.ann.array.AnnAuxEnum.ANN_ENUM_VAL_B; + +public @interface ArrayAnnEnumJava { + AnnAuxEnum[] enumValDef() default { ANN_ENUM_VAL_A, ANN_ENUM_VAL_B }; +} diff --git a/analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.txt b/analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.txt new file mode 100644 index 00000000000..8f37de47499 --- /dev/null +++ b/analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.txt @@ -0,0 +1,280 @@ +RAW_FIR: +FILE: [ResolvedTo(RAW_FIR)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @ArrayAnnEnumJava[Unresolved](LAZY_EXPRESSION) public? final? [ResolvedTo(RAW_FIR)] fun box(): { LAZY_BLOCK } + +IMPORTS: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @ArrayAnnEnumJava[Unresolved](LAZY_EXPRESSION) public? final? [ResolvedTo(RAW_FIR)] fun box(): { LAZY_BLOCK } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @ArrayAnnEnumJava[Unresolved](LAZY_EXPRESSION) public? final? [ResolvedTo(COMPILER_REQUIRED_ANNOTATIONS)] fun box(): { LAZY_BLOCK } + +COMPANION_GENERATION: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @ArrayAnnEnumJava[Unresolved](LAZY_EXPRESSION) public? final? [ResolvedTo(COMPANION_GENERATION)] fun box(): { LAZY_BLOCK } + +SUPER_TYPES: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @ArrayAnnEnumJava[Unresolved](LAZY_EXPRESSION) public? final? [ResolvedTo(SUPER_TYPES)] fun box(): { LAZY_BLOCK } + +TYPES: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](LAZY_EXPRESSION) public? final? [ResolvedTo(TYPES)] fun box(): { LAZY_BLOCK } + +STATUS: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](LAZY_EXPRESSION) public final [ResolvedTo(STATUS)] fun box(): { LAZY_BLOCK } + +EXPECT_ACTUAL_MATCHING: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](LAZY_EXPRESSION) public final [ResolvedTo(EXPECT_ACTUAL_MATCHING)] fun box(): { LAZY_BLOCK } + +CONTRACTS: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](LAZY_EXPRESSION) public final [ResolvedTo(CONTRACTS)] fun box(): { LAZY_BLOCK } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public? final? [ResolvedTo(RAW_FIR)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(RAW_FIR)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(RAW_FIR)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(RAW_FIR)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](LAZY_EXPRESSION) public final [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] fun box(): R|kotlin/String| { + ^box String(OK) + } + +ANNOTATION_ARGUMENTS: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public final [ResolvedTo(STATUS)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(STATUS)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(STATUS)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](enumValDef = (R|light/ann/array/AnnAuxEnum.ANN_ENUM_VAL_A|, R|light/ann/array/AnnAuxEnum.ANN_ENUM_VAL_B|)) public final [ResolvedTo(ANNOTATION_ARGUMENTS)] fun box(): R|kotlin/String| { + ^box String(OK) + } + +BODY_RESOLVE: +FILE: [ResolvedTo(IMPORTS)] ArrayAnnUsage.kt + public final [ResolvedTo(STATUS)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + LAZY_super|> + } + + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(STATUS)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(STATUS)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(STATUS)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](enumValDef = (R|light/ann/array/AnnAuxEnum.ANN_ENUM_VAL_A|, R|light/ann/array/AnnAuxEnum.ANN_ENUM_VAL_B|)) public final [ResolvedTo(BODY_RESOLVE)] fun box(): R|kotlin/String| { + ^box String(OK) + } + +FILE RAW TO BODY: +FILE: [ResolvedTo(BODY_RESOLVE)] ArrayAnnUsage.kt + public final [ResolvedTo(BODY_RESOLVE)] enum class AnnAuxEnum : R|kotlin/Enum| { + private [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnnAuxEnum] constructor(): R|light/ann/array/AnnAuxEnum| { + super|>() + } + + public final static [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_A: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnnAuxEnum] enum entry ANN_ENUM_VAL_B: R|light/ann/array/AnnAuxEnum| + public final static [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnnAuxEnum] fun values(): R|kotlin/Array| { + } + + public final static [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnnAuxEnum] fun valueOf([ResolvedTo(BODY_RESOLVE)] value: R|kotlin/String|): R|light/ann/array/AnnAuxEnum| { + } + + public final static [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=AnnAuxEnum] val entries: R|kotlin/enums/EnumEntries| + public [ResolvedTo(BODY_RESOLVE)] get(): R|kotlin/enums/EnumEntries| + + } + @R|light/ann/array/ArrayAnnEnumJava|[Types](enumValDef = (R|light/ann/array/AnnAuxEnum.ANN_ENUM_VAL_A|, R|light/ann/array/AnnAuxEnum.ANN_ENUM_VAL_B|)) public final [ResolvedTo(BODY_RESOLVE)] fun box(): R|kotlin/String| { + ^box String(OK) + } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java index 864da292bd9..b0608078e31 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirOutOfContentRootLazyDeclarationResolveTestGenerated.java @@ -951,6 +951,12 @@ public class FirOutOfContentRootLazyDeclarationResolveTestGenerated extends Abst runTest("analysis/low-level-api-fir/testData/lazyResolve/functions/implicitTypeFromFunctionWithDuplicatedName.kt"); } + @Test + @TestMetadata("javaAnnotationWithDefaultValueForenumArray.kt") + public void testJavaAnnotationWithDefaultValueForenumArray() throws Exception { + runTest("analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.kt"); + } + @Test @TestMetadata("simpleLoopInOverride.kt") public void testSimpleLoopInOverride() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java index 42a3aa0011a..7594878c9d2 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirSourceLazyDeclarationResolveTestGenerated.java @@ -951,6 +951,12 @@ public class FirSourceLazyDeclarationResolveTestGenerated extends AbstractFirSou runTest("analysis/low-level-api-fir/testData/lazyResolve/functions/implicitTypeFromFunctionWithDuplicatedName.kt"); } + @Test + @TestMetadata("javaAnnotationWithDefaultValueForenumArray.kt") + public void testJavaAnnotationWithDefaultValueForenumArray() throws Exception { + runTest("analysis/low-level-api-fir/testData/lazyResolve/functions/javaAnnotationWithDefaultValueForenumArray.kt"); + } + @Test @TestMetadata("simpleLoopInOverride.kt") public void testSimpleLoopInOverride() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt index ac6d8cc9d7e..9bf456cbda1 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaFacade.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.fir.java import com.intellij.psi.PsiMethod -import com.intellij.psi.impl.light.LightRecordCanonicalConstructor import com.intellij.psi.util.JavaPsiRecordUtil import org.jetbrains.kotlin.* import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap @@ -397,11 +396,13 @@ abstract class FirJavaFacade( } if (classIsAnnotation) { + val javaTypeParameterStackSnapshot = javaTypeParameterStack.snapshot() // Cannot load these until the symbol is bound because they may be self-referential. valueParametersForAnnotationConstructor.forEach { javaMethod, firValueParameter -> javaMethod.annotationParameterDefaultValue?.let { javaDefaultValue -> - firValueParameter.defaultValue = - javaDefaultValue.toFirExpression(session, javaTypeParameterStack, firValueParameter.returnTypeRef) + firValueParameter.lazyDefaultValue = lazy { + javaDefaultValue.toFirExpression(session, javaTypeParameterStackSnapshot, firValueParameter.returnTypeRef) + } } } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt index 4939e0661bc..70716cc4bbc 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/MutableJavaTypeParameterStack.kt @@ -1,6 +1,6 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.fir.java @@ -28,6 +28,13 @@ class MutableJavaTypeParameterStack : JavaTypeParameterStack() { return typeParameterMap.iterator() } + fun snapshot(): JavaTypeParameterStack { + val snapshot = typeParameterMap.toMap() + return object : JavaTypeParameterStack() { + override fun get(javaTypeParameter: JavaTypeParameter): FirTypeParameterSymbol = snapshot.getValue(javaTypeParameter) + override fun iterator(): Iterator> = snapshot.iterator() + } + } } abstract class JavaTypeParameterStack : Iterable> { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaValueParameter.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaValueParameter.kt index 20cc4ba7ae8..e450d44dbfa 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaValueParameter.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/declarations/FirJavaValueParameter.kt @@ -39,10 +39,16 @@ class FirJavaValueParameter @FirImplementationDetail constructor( override val name: Name, override val symbol: FirValueParameterSymbol, annotationBuilder: () -> List, - override var defaultValue: FirExpression?, + var lazyDefaultValue: Lazy?, override val containingFunctionSymbol: FirFunctionSymbol<*>, override val isVararg: Boolean, ) : FirValueParameter() { + override var defaultValue: FirExpression? + get() = lazyDefaultValue?.value + set(value) { + lazyDefaultValue = value?.let(::lazyOf) + } + init { symbol.bind(this) @@ -210,7 +216,7 @@ class FirJavaValueParameterBuilder { lateinit var returnTypeRef: FirTypeRef lateinit var name: Name lateinit var annotationBuilder: () -> List - var defaultValue: FirExpression? = null + var defaultValue: Lazy? = null lateinit var containingFunctionSymbol: FirFunctionSymbol<*> var isVararg: Boolean by Delegates.notNull() var isFromSource: Boolean by Delegates.notNull() @@ -252,7 +258,7 @@ inline fun buildJavaValueParameterCopy(original: FirValueParameter, init: FirJav copyBuilder.name = original.name val annotations = original.annotations copyBuilder.annotationBuilder = { annotations } - copyBuilder.defaultValue = original.defaultValue + copyBuilder.defaultValue = if (original is FirJavaValueParameter) original.lazyDefaultValue else original.defaultValue?.let(::lazyOf) copyBuilder.containingFunctionSymbol = original.containingFunctionSymbol copyBuilder.isVararg = original.isVararg return copyBuilder.apply(init).build() diff --git a/compiler/testData/codegen/box/fir/javaAnnotationWithDefaultValueForenumArray.kt b/compiler/testData/codegen/box/fir/javaAnnotationWithDefaultValueForenumArray.kt index 23d62e4eca3..03d79092dd8 100644 --- a/compiler/testData/codegen/box/fir/javaAnnotationWithDefaultValueForenumArray.kt +++ b/compiler/testData/codegen/box/fir/javaAnnotationWithDefaultValueForenumArray.kt @@ -1,6 +1,5 @@ // IGNORE_LIGHT_ANALYSIS // TARGET_BACKEND: JVM -// MUTE_LL_FIR: KT-62776 // FILE: ArrayAnnEnumJava.java package light.ann.array;