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 0c17c7ef96a..46fb8a82742 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 @@ -361,11 +361,22 @@ abstract class FirJavaFacade( ) generateValueOfFunction(moduleData, classId.packageFqName, classId.relativeClassName) generateEntriesGetter(moduleData, classId.packageFqName, classId.relativeClassName) + if (javaClassDeclaredConstructors.isEmpty()) { + declarations += buildSyntheticConstructorForJavaClass( + javaClass, + classKind, + constructorId = constructorId, + ownerClassBuilder = this, + valueParametersForAnnotationConstructor = null, + moduleData = moduleData, + ) + } } if (classIsAnnotation) { declarations += - buildConstructorForAnnotationClass( + buildSyntheticConstructorForJavaClass( javaClass, + classKind, constructorId = constructorId, ownerClassBuilder = this, valueParametersForAnnotationConstructor = valueParametersForAnnotationConstructor, @@ -674,11 +685,12 @@ abstract class FirJavaFacade( } } - private fun buildConstructorForAnnotationClass( + private fun buildSyntheticConstructorForJavaClass( javaClass: JavaClass, + classKind: ClassKind, constructorId: CallableId, ownerClassBuilder: FirJavaClassBuilder, - valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor, + valueParametersForAnnotationConstructor: ValueParametersForAnnotationConstructor?, moduleData: FirModuleData, ): FirJavaConstructor { return buildJavaConstructor { @@ -690,8 +702,8 @@ abstract class FirJavaFacade( returnTypeRef = buildResolvedTypeRef { type = ownerClassBuilder.buildSelfTypeRef() } - valueParametersForAnnotationConstructor.forEach { _, firValueParameter -> valueParameters += firValueParameter } - visibility = Visibilities.Public + valueParametersForAnnotationConstructor?.forEach { _, firValueParameter -> valueParameters += firValueParameter } + visibility = if (classKind == ClassKind.ENUM_CLASS) Visibilities.Private else Visibilities.Public isInner = false isPrimary = true annotationBuilder = { emptyList() } diff --git a/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.fir.kt b/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.fir.kt index 3f3824c8d59..68b3a079aa7 100644 --- a/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.fir.kt +++ b/compiler/testData/diagnostics/tests/enum/inheritanceFromEnum.fir.kt @@ -10,4 +10,4 @@ enum class MyEnum2() {} class MyClass(): MyEnum2() {} -class MyClass2(): MyJavaEnum() {} +class MyClass2(): MyJavaEnum() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.fir.kt index 497a656f41c..153d0e0649c 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.fir.kt @@ -3,16 +3,16 @@ // MODULE: m1-common // FILE: common.kt -expect enum class Mode { +expect enum class Mode { Throughput, AverageTime -} +} expect annotation class BenchmarkMode(vararg val value: Mode) // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt -actual typealias Mode = mypackage.Mode +actual typealias Mode = mypackage.Mode actual typealias BenchmarkMode = mypackage.BenchmarkMode diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.ll.kt deleted file mode 100644 index b590fbb8a88..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgTypeAliasWithArray.ll.kt +++ /dev/null @@ -1,35 +0,0 @@ -// ISSUES: KT-61100, KT-59561 -// WITH_STDLIB -// MODULE: m1-common -// FILE: common.kt - -expect enum class Mode { - Throughput, AverageTime -} - -expect annotation class BenchmarkMode(vararg val value: Mode) - -// MODULE: m1-jvm()()(m1-common) -// FILE: jvm.kt - -actual typealias Mode = mypackage.Mode - - -actual typealias BenchmarkMode = mypackage.BenchmarkMode - -// FILE: mypackage/Mode.java - -package mypackage; - -public enum Mode { - Throughput, AverageTime -} - -// FILE: mypackage/BenchmarkMode.java - -package mypackage; - -public @interface BenchmarkMode { - - Mode[] value(); -} diff --git a/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt index 70ce69add5a..fd9e0c0f8d3 100644 --- a/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt @@ -1,5 +1,6 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB ENUM_CLASS name:JEnum modality:FINAL visibility:public superTypes:[kotlin.Enum<@[FlexibleNullability] .JEnum?>] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.JEnum + CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.JEnum [primary] ENUM_ENTRY IR_EXTERNAL_JAVA_DECLARATION_STUB name:ONE ENUM_ENTRY IR_EXTERNAL_JAVA_DECLARATION_STUB name:TWO ENUM_ENTRY IR_EXTERNAL_JAVA_DECLARATION_STUB name:THREE diff --git a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt index 4d113202a5b..8ad01f21a4c 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/AnnotatedEnumEntry.fir.txt @@ -11,6 +11,8 @@ public final enum class AnnotatedEnumEntry : R|kotlin/Enum| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/AnnotatedEnumEntry| + public final annotation class Anno : R|kotlin/Annotation| { public constructor(value: R|kotlin/String|): R|test/AnnotatedEnumEntry.Anno| diff --git a/compiler/testData/loadJava/compiledJava/annotations/CustomAnnotation.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/CustomAnnotation.fir.txt index 30cbe047f13..0fef819947b 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/CustomAnnotation.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/CustomAnnotation.fir.txt @@ -14,6 +14,8 @@ public abstract interface CustomAnnotation : R|kotlin/Any| { public final static val entries: R|kotlin/enums/EnumEntries| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/CustomAnnotation.MyEnum| + } @R|test/CustomAnnotation.MyAnnotation|(value = R|test/CustomAnnotation.MyEnum.ONE|) public open class MyTest : R|kotlin/Any| { public constructor(): R|test/CustomAnnotation.MyTest| diff --git a/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt index 06a0d7fd35d..daff8bdec8f 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/EnumArgumentWithCustomToString.fir.txt @@ -14,6 +14,8 @@ public open class EnumArgumentWithCustomToString : R|kotlin/Any| { public final static val entries: R|kotlin/enums/EnumEntries| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/EnumArgumentWithCustomToString.E| + } public final annotation class EnumAnno : R|kotlin/Annotation| { public constructor(value: R|test/EnumArgumentWithCustomToString.E|): R|test/EnumArgumentWithCustomToString.EnumAnno| diff --git a/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt index cfd785564c6..02de15d4627 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/NestedEnumArgument.fir.txt @@ -18,5 +18,7 @@ public open class NestedEnumArgument : R|kotlin/Any| { public final static val entries: R|kotlin/enums/EnumEntries| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/NestedEnumArgument.E| + } } diff --git a/compiler/testData/loadJava/compiledJava/annotations/NestedEnumInAnnotation.fir.txt b/compiler/testData/loadJava/compiledJava/annotations/NestedEnumInAnnotation.fir.txt index 842b8113688..d90e2e41f42 100644 --- a/compiler/testData/loadJava/compiledJava/annotations/NestedEnumInAnnotation.fir.txt +++ b/compiler/testData/loadJava/compiledJava/annotations/NestedEnumInAnnotation.fir.txt @@ -13,6 +13,8 @@ public final annotation class Api : R|kotlin/Annotation| { public final static val entries: R|kotlin/enums/EnumEntries| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/Api.Status| + } } @R|test/Api|(status = R|test/Api.Status.Ok|) public open class NestedEnumInAnnotation : R|kotlin/Any| { diff --git a/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt b/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt index c34a43742cf..1b9dc78ad5e 100644 --- a/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/EnumWithSpecializedEntry.fir.txt @@ -10,6 +10,8 @@ public final enum class EnumWithSpecializedEntry : R|kotlin/Enum| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/EnumWithSpecializedEntry| + public/*package*/ open class Nested : R|kotlin/Any| { public/*package*/ constructor(): R|test/EnumWithSpecializedEntry.Nested| diff --git a/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt b/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt index 3c7e25261b1..787aa9ea669 100644 --- a/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/enum/JavaEnum.fir.txt @@ -10,4 +10,6 @@ public final enum class JavaEnum : R|kotlin/Enum| { public final static val entries: R|kotlin/enums/EnumEntries| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/JavaEnum| + } diff --git a/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt b/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt index 1b007faf349..895b8671ee2 100644 --- a/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/Enum.fir.txt @@ -11,6 +11,8 @@ public final enum class Enum : R|kotlin/Enum| { public final static val entries: R|kotlin/enums/EnumEntries| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/Enum| + public open inner class Inner : R|kotlin/Any| { public/*package*/ open fun bar(): R|kotlin/Unit| diff --git a/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt b/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt index 701f30f8fdd..2c1fa2c9230 100644 --- a/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt +++ b/compiler/testData/loadJava/compiledJava/static/StaticMembersInEnum.fir.txt @@ -19,4 +19,6 @@ public final enum class StaticMembersInEnum : R|kotlin/Enum| public get(): R|kotlin/enums/EnumEntries| + public constructor(): R|test/StaticMembersInEnum| + }