[FIR] Expect classes can never have in implicit constructor. enums included

Motivation: If I don't fix it then I will get a false positive
ACTUAL_MISSING in
DiagnosticCompilerTestFE10TestdataTestGenerated.Tests.Multiplatform.Enum.testSimpleEnum
after I fix KT-59887

The commit also fixes false positive diagnostic in
annotationArgTypeAliasWithArray.fir.kt test

Review: https://jetbrains.team/p/kt/reviews/13244
This commit is contained in:
Nikita Bobko
2023-11-24 17:42:54 +01:00
committed by Space Team
parent 04dec2769b
commit ac3d8ad3ac
5 changed files with 5 additions and 13 deletions
@@ -170,7 +170,7 @@ class Fir2IrVisitor(
)
}
}
} else if (irParentEnumClass != null && initializer == null) {
} else if (irParentEnumClass != null && !irParentEnumClass.isExpect && initializer == null) {
// a default-ish enum entry whose initializer would be a delegating constructor call
// `irParentEnumClass` definitely is not a lazy class
@OptIn(UnsafeDuringIrConstructionAPI::class)
@@ -12,10 +12,7 @@ import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.ElementTypeUtils.isExpression
import org.jetbrains.kotlin.KtNodeTypes.*
import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
import org.jetbrains.kotlin.fir.*
@@ -893,11 +890,10 @@ class LightTreeRawFirDeclarationBuilder(
isImplicitlyActual: Boolean = false,
isKotlinAny: Boolean = false,
): PrimaryConstructor? {
fun ClassKind.isEnumRelated(): Boolean = this == ClassKind.ENUM_CLASS || this == ClassKind.ENUM_ENTRY
val shouldGenerateImplicitConstructor =
(classWrapper.isEnumEntry() || !classWrapper.hasSecondaryConstructor) &&
!classWrapper.isInterface() &&
(!containingClassIsExpectClass || classWrapper.classBuilder.classKind.isEnumRelated())
!classWrapper.isInterface() &&
(!containingClassIsExpectClass || classWrapper.classBuilder.classKind == ClassKind.ENUM_ENTRY)
val isErrorConstructor = primaryConstructor == null && !shouldGenerateImplicitConstructor
if (isErrorConstructor && classWrapper.delegatedSuperCalls.isEmpty()) {
return null
@@ -1015,7 +1015,7 @@ open class PsiRawFirBuilder(
// We are never here as part of enum entry
val shouldGenerateImplicitPrimaryConstructor =
!hasSecondaryConstructors() &&
!(containingClassIsExpectClass && classKind != ClassKind.ENUM_CLASS) &&
!containingClassIsExpectClass &&
(this !is KtClass || !this.isInterface())
val hasPrimaryConstructor = primaryConstructor != null || shouldGenerateImplicitPrimaryConstructor
@@ -1,8 +1,6 @@
FILE: expectNestedEnumClassGeneratedMembers.kt
public? final? expect class Outer : R|kotlin/Any| {
public? final? expect enum class NestedEnum : R|kotlin/Enum<Outer.NestedEnum>| {
private expect constructor(): R|Outer.NestedEnum|
public final expect static enum entry ONE: R|Outer.NestedEnum|
public final expect static enum entry TWO: R|Outer.NestedEnum|
public final expect static fun values(): R|kotlin/Array<Outer.NestedEnum>| {
@@ -1,8 +1,6 @@
FILE: expectNestedEnumClassGeneratedMembers.kt
public? final? expect class Outer : R|kotlin/Any| {
public? final? expect enum class NestedEnum : R|kotlin/Enum<Outer.NestedEnum>| {
private expect [ContainingClassKey=NestedEnum] constructor(): R|Outer.NestedEnum|
public final expect static [ContainingClassKey=NestedEnum] enum entry ONE: R|Outer.NestedEnum|
public final expect static [ContainingClassKey=NestedEnum] enum entry TWO: R|Outer.NestedEnum|
public final expect static [ContainingClassKey=NestedEnum] fun values(): R|kotlin/Array<Outer.NestedEnum>| {