diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt index 08dd7c55828ddc1bf52bb922db781940625c2dce..dcfdffe00604be68a64def1fa8bd356c9d8ca9de 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt @@ -12,7 +12,7 @@ public sealed class Sealed : R|kotlin/Any| { public final val z: R|test/Z| public get(): R|test/Z| - @R|test/Ann|() internal constructor(@R|test/Ann|() z: R|test/Z|): R|test/Sealed| + @R|test/Ann|() protected constructor(@R|test/Ann|() z: R|test/Z|): R|test/Sealed| } diff --git a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/SealedClass.txt b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/SealedClass.txt index 7eb9f3de23dab08d136eff1c9e9603753bb46d5d..5a4cc58b80eac824dd8a6097b39f9664f98cda85 100644 --- a/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/SealedClass.txt +++ b/compiler/fir/analysis-tests/testData/loadCompiledKotlin/class/SealedClass.txt @@ -14,7 +14,7 @@ public sealed class SealedClass : R|kotlin/Any| { } - internal constructor(): R|test/SealedClass| + protected constructor(): R|test/SealedClass| } diff --git a/compiler/fir/analysis-tests/testData/resolve/constantValues.fir.txt b/compiler/fir/analysis-tests/testData/resolve/constantValues.fir.txt index 81bbe2a4f853490002e8064fb4ee95ff6b95dcb8..28d5dccf4632954872ecdddaaf8c2963ac7c1837 100644 --- a/compiler/fir/analysis-tests/testData/resolve/constantValues.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/constantValues.fir.txt @@ -44,7 +44,7 @@ FILE: constantValues.kt } public sealed class Value : R|kotlin/Any| { - private constructor(): R|KClassValue.Value| { + protected constructor(): R|KClassValue.Value| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.fir.txt index 823b6488df7c3de557de3b0005c3597c5c991cb0..dde4466903ed156585280296da8d5ba3366e5486 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/incompatibleModifiers.fir.txt @@ -30,13 +30,13 @@ FILE: incompatibleModifiers.kt } public final class F : R|kotlin/Any| { - private constructor(): R|F| { + protected constructor(): R|F| { super() } } public sealed class G : R|kotlin/Any| { - private constructor(): R|G| { + protected constructor(): R|G| { super() } @@ -57,7 +57,7 @@ FILE: incompatibleModifiers.kt } public sealed data class I : R|kotlin/Any| { - private constructor(i: R|kotlin/Int|): R|I| { + protected constructor(i: R|kotlin/Int|): R|I| { super() } @@ -126,7 +126,7 @@ FILE: incompatibleModifiers.kt } public sealed inner class Z : R|kotlin/Any| { - private constructor(): R|X.Z| { + protected constructor(): R|X.Z| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/redundantModifier.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/redundantModifier.fir.txt index d2716c234c6541d5dc33757e18c65fed63dc46ff..aea1166c7a2a93ffd529bee17cecf2f354e0ba29 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/redundantModifier.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/redundantModifier.fir.txt @@ -6,7 +6,7 @@ FILE: redundantModifier.kt } public sealed class B : R|kotlin/Any| { - private constructor(): R|B| { + protected constructor(): R|B| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.fir.txt index 6f593d2a8fc4807106bd88d1f7df3798b55f26ad..b6381cfa192178e3f1bd0570add6a635d597901e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.fir.txt @@ -1,9 +1,9 @@ FILE: sealedClassConstructorCall.kt public sealed class A : R|kotlin/Any| { - private constructor(): R|A| { + protected constructor(): R|A| { super() } } - public final val b: R|A| = R|/A.A|() + public final val b: R|A| = #() public get(): R|A| diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.kt index ae002614d513fd276d3a02700a75cc47629e6062..f0f7d5dc47336d16f50cf2b64ddd925edce9a2c5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedClassConstructorCall.kt @@ -1,3 +1,3 @@ sealed class A -val b = A() +val b = A() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.fir.txt index 80e01f0bf6d37a7b63b8b964c066a04638135d11..0ba1e44476efba992bfabed244d5028232151c60 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/sealedSupertype.fir.txt @@ -1,6 +1,6 @@ FILE: sealedSupertype.kt public sealed class A : R|kotlin/Any| { - private constructor(): R|A| { + protected constructor(): R|A| { super() } @@ -22,7 +22,7 @@ FILE: sealedSupertype.kt } public sealed class P : R|kotlin/Any| { - private constructor(): R|P| { + protected constructor(): R|P| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/negative/missingSealedInheritor.fir.txt b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/negative/missingSealedInheritor.fir.txt index 0d11593bd9b076b6dd2b08c40f01b033d5ed76e8..6cb8362f9d35ac259eba805f8b1fea519c8a16d1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/negative/missingSealedInheritor.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/negative/missingSealedInheritor.fir.txt @@ -1,6 +1,6 @@ FILE: a.kt public sealed class Base : R|kotlin/Any| { - private constructor(): R|Base| { + protected constructor(): R|Base| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedClass.fir.txt index 723c1e4b13ec45f545322c751d247ae57d4f5bf0..191f39b8b8b9ab70d82a82e59da8d6aaf7e58ebe 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedClass.fir.txt @@ -1,6 +1,6 @@ FILE: exhaustiveness_sealedClass.kt public sealed class Base : R|kotlin/Any| { - private constructor(): R|Base| { + protected constructor(): R|Base| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedObject.fir.txt b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedObject.fir.txt index ac004e4505b461744409c07bf1b808cbe60ea16f..e2c59d3190fae9d0ecde532957b9489c3e85bf04 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedObject.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedObject.fir.txt @@ -1,6 +1,6 @@ FILE: exhaustiveness_sealedObject.kt public sealed class A : R|kotlin/Any| { - private constructor(): R|A| { + protected constructor(): R|A| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt index db6cbd744a59811a3b69a4b0d542b307c9861426..0eebe0a863ebed3f95db57aeb9e496eb61654e51 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt @@ -1,12 +1,12 @@ FILE: exhaustiveness_sealedSubClass.kt public sealed class A : R|kotlin/Any| { - private constructor(): R|A| { + protected constructor(): R|A| { super() } } public sealed class B : R|A| { - private constructor(): R|B| { + protected constructor(): R|B| { super() } @@ -18,13 +18,13 @@ FILE: exhaustiveness_sealedSubClass.kt } public sealed class D : R|B| { - private constructor(): R|D| { + protected constructor(): R|D| { super() } } public sealed class E : R|B| { - private constructor(): R|E| { + protected constructor(): R|E| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/classifierAccessFromCompanion.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/classifierAccessFromCompanion.fir.txt index 809328821d28cf470d1a7a030c86878877a42b27..96ce52c79ebd33bcb77975a51eec05e1c21f39b3 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/classifierAccessFromCompanion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/classifierAccessFromCompanion.fir.txt @@ -5,7 +5,7 @@ FILE: classifierAccessFromCompanion.kt } public sealed class Function : R|kotlin/Any| { - private constructor(): R|Factory.Function| { + protected constructor(): R|Factory.Function| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt index 3d9510284c9de9903a8be9338f81671d1722afef..d2c4e79b4559ed6005ac55c852141aa4ab59f293 100644 --- a/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/extendedCheckers/RedundantVisibilityModifierChecker.fir.txt @@ -111,7 +111,7 @@ FILE: RedundantVisibilityModifierChecker.kt } public sealed class G : R|kotlin/Any| { - private constructor(y: R|kotlin/Int|): R|G| { + protected constructor(y: R|kotlin/Int|): R|G| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt b/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt index 5e81cbcc178738cde3480f9c8fd127d146c48e3f..3122e0aca97b076a977abdae43617651b5f11387 100644 --- a/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/multifile/sealedStarImport.fir.txt @@ -1,6 +1,6 @@ FILE: test.kt public sealed class Test : R|kotlin/Any| { - private constructor(): R|test/Test| { + protected constructor(): R|test/Test| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.fir.txt index 35ec125e8b5decf0892b1b85d483266755a8153a..92b335ce9db6b4ee933ba709deea3180eca27ad0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/recursiveCallOnWhenWithSealedClass.fir.txt @@ -1,6 +1,6 @@ FILE: recursiveCallOnWhenWithSealedClass.kt public sealed class Maybe : R|kotlin/Any| { - private constructor(): R|Maybe| { + protected constructor(): R|Maybe| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/sealedClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/sealedClass.fir.txt index 0f0589d2813b52033f6d5b33fcb18fcadee32302..6b8b7de14182d81d8bfec27006052173138b99ff 100644 --- a/compiler/fir/analysis-tests/testData/resolve/sealedClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/sealedClass.fir.txt @@ -1,6 +1,6 @@ FILE: sealedClass.kt public sealed class Foo : R|kotlin/Any| { - private constructor(value: R|kotlin/String|): R|Foo| { + protected constructor(value: R|kotlin/String|): R|Foo| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt37327.fir.txt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt37327.fir.txt index 1aa8f2fa51e3e96585a239dfd00216a1534e42a1..dd498c79d991173c7a5ec30bd2b4ed0f9e8aa0d0 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt37327.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/kt37327.fir.txt @@ -2,7 +2,7 @@ FILE: kt37327.kt public abstract interface Q : R|kotlin/Any| { } public sealed class A : R|Q| { - private constructor(): R|A| { + protected constructor(): R|A| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.fir.txt b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.fir.txt index 30d59e0510e6418fc5bb0b1ea3e0b595a9e78746..a589aac53c91f1dcccb8264a224d2dd25721a2af 100644 --- a/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/smartcasts/lambdas/lambdaInWhenBranch.fir.txt @@ -1,6 +1,6 @@ FILE: lambdaInWhenBranch.kt private sealed class Sealed : R|kotlin/Any| { - private constructor(): R|Sealed| { + protected constructor(): R|Sealed| { super() } diff --git a/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt b/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt index 8b9a7d06ea780fa72d9857e81db1e5649a5f8a10..e0f12bbb40e5d553f00978b92640b1870e31c58e 100644 --- a/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/types/bareWithSubjectTypeAlias.fir.txt @@ -1,6 +1,6 @@ FILE: bareWithSubjectTypeAlias.kt public sealed class A : R|kotlin/Any| { - private constructor(): R|A| { + protected constructor(): R|A| { super() } diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 542e8bf46d35b3bd5bd1a08b2ee7204c5fb3a720..0295c7f5624464c5f686f7120d606903e989a7f0 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -88,7 +88,7 @@ val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList { val CONSTRUCTOR_IN_OBJECT by error(PositioningStrategy.DECLARATION_SIGNATURE) val CONSTRUCTOR_IN_INTERFACE by error(PositioningStrategy.DECLARATION_SIGNATURE) val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error() - val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by error() + val NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED by error() val CYCLIC_CONSTRUCTOR_DELEGATION_CALL by warning() val PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by warning() diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 3d8f70a05e28095a4295cac262e9235b302b9711..3c2f2f618f80370ba9e76682d323f074056c5958 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -95,7 +95,7 @@ object FirErrors { val CONSTRUCTOR_IN_OBJECT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val CONSTRUCTOR_IN_INTERFACE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error0() - val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by error0() + val NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED by error0() val CYCLIC_CONSTRUCTOR_DELEGATION_CALL by warning0() val PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED by warning0(SourceElementPositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by warning0() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt index 28532e3cc6390e9e9902c0b8fbb8b0e9991bb35a..3bf7cb9268ffb6bf2bfb2ec6c8a7f34acbb7ddcc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirConstructorAllowedChecker.kt @@ -14,6 +14,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.lexer.KtModifierKeywordToken +import org.jetbrains.kotlin.lexer.KtTokens object FirConstructorAllowedChecker : FirConstructorChecker() { override fun check(declaration: FirConstructor, context: CheckerContext, reporter: DiagnosticReporter) { @@ -30,10 +32,14 @@ object FirConstructorAllowedChecker : FirConstructorChecker() { ClassKind.ENUM_CLASS -> if (declaration.visibility != Visibilities.Private) { reporter.reportOn(source, FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_ENUM, context) } - ClassKind.CLASS -> if (containingClass is FirRegularClass && containingClass.modality == Modality.SEALED && - declaration.visibility != Visibilities.Private - ) { - reporter.reportOn(source, FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_SEALED, context) + ClassKind.CLASS -> if (containingClass is FirRegularClass && containingClass.modality == Modality.SEALED) { + val modifierList = with(FirModifierList) { source.getModifierList() } ?: return + val hasIllegalModifier = modifierList.modifiers.any { + it.token != KtTokens.PROTECTED_KEYWORD && it.token != KtTokens.PRIVATE_KEYWORD + } + if (hasIllegalModifier) { + reporter.reportOn(source, FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED, context) + } } ClassKind.ANNOTATION_CLASS -> { // DO NOTHING diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 8cde51292ccb40b3f1b4ecd4f33a5acb2a8548e5..e2bcc0e751cfc6fea2c7c1d1bbe374bee836b480 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -101,7 +101,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NONE_APPLICABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_MEMBER_FUNCTION_NO_BODY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_ENUM -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_SEALED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOTHING_TO_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_AN_ANNOTATION_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NOT_A_LOOP_LABEL @@ -247,7 +247,7 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { map.put(CONSTRUCTOR_IN_OBJECT, "Constructors are not allowed for objects") map.put(CONSTRUCTOR_IN_INTERFACE, "An interface may not have a constructor") map.put(NON_PRIVATE_CONSTRUCTOR_IN_ENUM, "Constructor must be private in enum class") - map.put(NON_PRIVATE_CONSTRUCTOR_IN_SEALED, "Constructor must be private in sealed class") + map.put(NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED, "Constructor must be private or protected in sealed class") map.put(CYCLIC_CONSTRUCTOR_DELEGATION_CALL, "There's a cycle in the delegation calls chain") map.put(PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED, "Primary constructor call expected") map.put(SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR, "Supertype initialization is impossible without primary constructor") diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt index e4acbaa0b716ea45bde9590cf089cbe78580ec94..2084418e5f4a72a0b13ad1fdae56523f10c65254 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/converter/DeclarationsConverter.kt @@ -740,7 +740,9 @@ class DeclarationsConverter( extractArgumentsFrom(classWrapper.superTypeCallEntry, stubMode) } - val explicitVisibility = if (primaryConstructor != null) modifiers.getVisibility() else null + val explicitVisibility = runIf(primaryConstructor != null) { + modifiers.getVisibility().takeUnless { it == Visibilities.Unknown } + } val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility, Modality.FINAL).apply { isExpect = modifiers.hasExpect() || classWrapper.hasExpect() isActual = modifiers.hasActual() diff --git a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt index 4aac25e54685d7950167cf532ca0a484d9dd53b9..c4263f867097921a604cfe85a9277f451bee1433 100644 --- a/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt +++ b/compiler/fir/raw-fir/light-tree2fir/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt @@ -64,7 +64,7 @@ class ClassWrapper( fun defaultConstructorVisibility(): Visibility { return when { isObject() || isEnum() || isEnumEntry() -> Visibilities.Private - isSealed() -> Visibilities.Private + isSealed() -> Visibilities.Protected else -> Visibilities.Unknown } } diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index e45a001a55716f70b84ef3859dfd4d1f3538debb..7b47a505f95732aecdd6335c4a2f9e544e172875 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -657,11 +657,11 @@ class RawFirBuilder( // See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors fun defaultVisibility() = when { owner is KtObjectDeclaration || owner.hasModifier(ENUM_KEYWORD) || owner is KtEnumEntry -> Visibilities.Private - owner.hasModifier(SEALED_KEYWORD) -> Visibilities.Private + owner.hasModifier(SEALED_KEYWORD) -> Visibilities.Protected else -> Visibilities.Unknown } - val explicitVisibility = this?.visibility + val explicitVisibility = this?.visibility?.takeUnless { it == Visibilities.Unknown } val status = FirDeclarationStatusImpl(explicitVisibility ?: defaultVisibility(), Modality.FINAL).apply { isExpect = this@toFirConstructor?.hasExpectModifier() == true || owner.hasExpectModifier() isActual = this@toFirConstructor?.hasActualModifier() == true diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt index eaddd535657664d742a3c0e34ff0fe2ed256b054..f67532f6a2421a90da9b9ad36cc3eb9199661fa9 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.lazyBodies.txt @@ -15,7 +15,7 @@ FILE: enums.kt } public? final? enum class Planet : R|kotlin/Enum| { - public? constructor(m: Double, r: Double): R|Planet| { + private constructor(m: Double, r: Double): R|Planet| { super|>() } @@ -75,7 +75,7 @@ FILE: enums.kt } public? final? enum class PseudoInsn : R|kotlin/Enum| { - public? constructor(signature: String = String(()V)): R|PseudoInsn| { + private constructor(signature: String = String(()V)): R|PseudoInsn| { super|>() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.txt index fcad62ee318d804915d819cf7b205cae009a9c21..c66710a551ee41cbad388027a4f0506999f81021 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums.txt @@ -15,7 +15,7 @@ FILE: enums.kt } public? final? enum class Planet : R|kotlin/Enum| { - public? constructor(m: Double, r: Double): R|Planet| { + private constructor(m: Double, r: Double): R|Planet| { super|>() } @@ -81,7 +81,7 @@ FILE: enums.kt } public? final? enum class PseudoInsn : R|kotlin/Enum| { - public? constructor(signature: String = String(()V)): R|PseudoInsn| { + private constructor(signature: String = String(()V)): R|PseudoInsn| { super|>() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt index cc70152eafd244f10a785aa137c843bde74f90cb..345d0dbdfdab0d23a95d3b9ad8307c81475b95bf 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.lazyBodies.txt @@ -14,7 +14,7 @@ FILE: enums2.kt } public? final? enum class SomeEnum : R|kotlin/Enum| { - public? constructor(x: Some): R|SomeEnum| { + private constructor(x: Some): R|SomeEnum| { super|>() } diff --git a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.txt b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.txt index 708f4462eee15698e2cf9cab4f30f261ed454118..a56c4c8077bd9f265cc78f13243292e9350a5a41 100644 --- a/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.txt +++ b/compiler/fir/raw-fir/psi2fir/testData/rawBuilder/declarations/enums2.txt @@ -14,7 +14,7 @@ FILE: enums2.kt } public? final? enum class SomeEnum : R|kotlin/Enum| { - public? constructor(x: Some): R|SomeEnum| { + private constructor(x: Some): R|SomeEnum| { super|>() } diff --git a/compiler/testData/asJava/ultraLightClasses/classModifiers.java b/compiler/testData/asJava/ultraLightClasses/classModifiers.java index 4773eae146595b88601e11b8bd291ad6965a9920..7f4697c5aed253b02529d67ad9a0e9a919b00126 100644 --- a/compiler/testData/asJava/ultraLightClasses/classModifiers.java +++ b/compiler/testData/asJava/ultraLightClasses/classModifiers.java @@ -38,7 +38,7 @@ final class TopLevelPrivate /* pkg.TopLevelPrivate*/ { } public abstract class Season /* pkg.Season*/ { - private Season();// .ctor() + protected Season();// .ctor() class Nested ... @@ -53,8 +53,8 @@ public static final class Nested /* pkg.Season.Nested*/ extends pkg.Season { public abstract class SealedWithArgs /* pkg.SealedWithArgs*/ { private final int a; - private SealedWithArgs(int);// .ctor(int) + protected SealedWithArgs(int);// .ctor(int) public final int getA();// getA() -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/tests/sealed/MultipleFiles_enabled.fir.kt b/compiler/testData/diagnostics/tests/sealed/MultipleFiles_enabled.fir.kt index 455e7591ddec026d917eb263b2b2d08e6cd408ce..4dd5bed6c9c88fb18d2f1703b04183ba60161637 100644 --- a/compiler/testData/diagnostics/tests/sealed/MultipleFiles_enabled.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/MultipleFiles_enabled.fir.kt @@ -37,4 +37,4 @@ package bar import foo.Base -class E : Base() +class E : Base() diff --git a/compiler/testData/diagnostics/tests/sealed/NonPrivateConstructor.fir.kt b/compiler/testData/diagnostics/tests/sealed/NonPrivateConstructor.fir.kt index e6e1f2e7bc52993288c94438c5948ea982266731..5e21295629e5c9271537973ab025f51830e6315a 100644 --- a/compiler/testData/diagnostics/tests/sealed/NonPrivateConstructor.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/NonPrivateConstructor.fir.kt @@ -1,7 +1,7 @@ -sealed class Sealed protected constructor(val x: Int) { +sealed class Sealed protected constructor(val x: Int) { object FIRST : Sealed() - public constructor(): this(42) + public constructor(): this(42) constructor(y: Int, z: Int): this(y + z) } diff --git a/compiler/testData/diagnostics/tests/sealed/inheritorInDifferentModule.fir.kt b/compiler/testData/diagnostics/tests/sealed/inheritorInDifferentModule.fir.kt index 28c559c77349c1d175063fdf8d0d3aa3b04bedbe..6f9e7f1470517357710768435a7e9553a7b40fe6 100644 --- a/compiler/testData/diagnostics/tests/sealed/inheritorInDifferentModule.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/inheritorInDifferentModule.fir.kt @@ -14,4 +14,4 @@ class A : Base() package a -class B : Base() +class B : Base() diff --git a/compiler/testData/diagnostics/tests/sealed/kt44861.fir.kt b/compiler/testData/diagnostics/tests/sealed/kt44861.fir.kt deleted file mode 100644 index 9e13166b1cea898d25c2aaffd318fa32be4cb16b..0000000000000000000000000000000000000000 --- a/compiler/testData/diagnostics/tests/sealed/kt44861.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// ISSUE: KT-44861 -// DIAGNOSTICS: -UNUSED_VARIABLE - -sealed class Foo() { - class A : Foo() - class B : Foo() -} - -fun Foo(kind: String = "A"): Foo = when (kind) { - "A" -> Foo.A() - "B" -> Foo.B() - else -> throw Exception() -} - -fun main() { - val foo = Foo() -} diff --git a/compiler/testData/diagnostics/tests/sealed/kt44861.kt b/compiler/testData/diagnostics/tests/sealed/kt44861.kt index 72198eaf079b03ae8d3feb767cff475a1a254f69..24cae5790b2823dca329a23edadf9cb5500e787d 100644 --- a/compiler/testData/diagnostics/tests/sealed/kt44861.kt +++ b/compiler/testData/diagnostics/tests/sealed/kt44861.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ISSUE: KT-44861 // DIAGNOSTICS: -UNUSED_VARIABLE diff --git a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt index 1cf4934b52cafb909e147b31a54a19f3f92fdb8f..09d0542dfd546e63bdb0cf5407e9a6fe134365f4 100644 --- a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt @@ -2,21 +2,21 @@ // DIAGNOSTICS: -UNUSED_PARAMETER sealed class Case1(val x: Int) { - protected constructor(s: String) : this(s.length) + protected constructor(s: String) : this(s.length) class Inheritor1 : Case1(10) class Inheritor2 : Case1("Hello") } -sealed class Case2 protected constructor(val x: Int) { - protected constructor(s: String) : this(s.length) +sealed class Case2 protected constructor(val x: Int) { + protected constructor(s: String) : this(s.length) class Inheritor1 : Case2(10) class Inheritor2 : Case2("Hello") } sealed class Case3 private constructor(val x: Int) { - protected constructor(s: String) : this(s.length) + protected constructor(s: String) : this(s.length) class Inheritor1 : Case3(10) // should OK class Inheritor2 : Case3("Hello") @@ -25,8 +25,8 @@ sealed class Case3 private constructor(val x: Int) { class Case3Inheritor3 : Case3(20) // should be an error in 1.6 (?) sealed class Case4 { - protected constructor(x: Int) - protected constructor(s: String) : this(s.length) + protected constructor(x: Int) + protected constructor(s: String) : this(s.length) class Inheritor1 : Case4(10) class Inheritor2 : Case4("Hello") @@ -34,8 +34,8 @@ sealed class Case4 { sealed class Case5() { private constructor(x: Int) : this() - protected constructor(x: Byte) : this() - internal constructor(x: Short) : this() - public constructor(x: Long) : this() + protected constructor(x: Byte) : this() + internal constructor(x: Short) : this() + public constructor(x: Long) : this() constructor(x: Double) : this() } diff --git a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt index f8993d384b764298f0e5677518d0f362002bbd04..c601bf18f43ac54e243d4263b9d4ddd5daaa6a39 100644 --- a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt @@ -2,21 +2,21 @@ // DIAGNOSTICS: -UNUSED_PARAMETER sealed class Case1(val x: Int) { - protected constructor(s: String) : this(s.length) + protected constructor(s: String) : this(s.length) class Inheritor1 : Case1(10) class Inheritor2 : Case1("Hello") } -sealed class Case2 protected constructor(val x: Int) { // should be REDUNDANT_MODIFIER - protected constructor(s: String) : this(s.length) +sealed class Case2 protected constructor(val x: Int) { // should be REDUNDANT_MODIFIER + protected constructor(s: String) : this(s.length) class Inheritor1 : Case2(10) class Inheritor2 : Case2("Hello") } sealed class Case3 private constructor(val x: Int) { - protected constructor(s: String) : this(s.length) + protected constructor(s: String) : this(s.length) class Inheritor1 : Case3(10) // should OK class Inheritor2 : Case3("Hello") @@ -25,8 +25,8 @@ sealed class Case3 private constructor(val x: Int) { class Case3Inheritor3 : Case3(20) // should be an error in 1.6 (?) sealed class Case4 { - protected constructor(x: Int) - protected constructor(s: String) : this(s.length) + protected constructor(x: Int) + protected constructor(s: String) : this(s.length) class Inheritor1 : Case4(10) class Inheritor2 : Case4("Hello") @@ -34,8 +34,8 @@ sealed class Case4 { sealed class Case5() { private constructor(x: Int) : this() - protected constructor(x: Byte) : this() - internal constructor(x: Short) : this() - public constructor(x: Long) : this() + protected constructor(x: Byte) : this() + internal constructor(x: Short) : this() + public constructor(x: Long) : this() constructor(x: Double) : this() } diff --git a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt index 66c2df6df985041b9bfa025188a68b685df62927..10b76eeffe55cdaa8636316f9528fe3c0e73c630 100644 --- a/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt +++ b/compiler/testData/diagnostics/tests/typealias/typeAliasConstructorWrongClass.fir.kt @@ -17,8 +17,8 @@ val test3a = EnumClass() sealed class SealedClass typealias Test4 = SealedClass -val test4 = Test4() -val test4a = SealedClass() +val test4 = Test4() +val test4a = SealedClass() class Outer { inner class Inner diff --git a/compiler/testData/ir/irText/classes/sealedClasses.fir.kt.txt b/compiler/testData/ir/irText/classes/sealedClasses.fir.kt.txt index 2c148f51ccbbdc4f435dd6a74f9f223350e22538..4bb99510fdfca00b87d3232c0a1a3cf8626991a7 100644 --- a/compiler/testData/ir/irText/classes/sealedClasses.fir.kt.txt +++ b/compiler/testData/ir/irText/classes/sealedClasses.fir.kt.txt @@ -1,5 +1,5 @@ sealed class Expr { - private constructor() /* primary */ { + protected constructor() /* primary */ { super/*Any*/() /* () */ diff --git a/compiler/testData/ir/irText/classes/sealedClasses.fir.txt b/compiler/testData/ir/irText/classes/sealedClasses.fir.txt index 0fc219b4df4342f84926b6eec569ba19bf659f4a..5b19df65239a01f219ad9ec08cfad1bf3a9fb1c9 100644 --- a/compiler/testData/ir/irText/classes/sealedClasses.fir.txt +++ b/compiler/testData/ir/irText/classes/sealedClasses.fir.txt @@ -1,7 +1,7 @@ FILE fqName: fileName:/sealedClasses.kt CLASS CLASS name:Expr modality:SEALED visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Expr - CONSTRUCTOR visibility:private <> () returnType:.Expr [primary] + CONSTRUCTOR visibility:protected <> () returnType:.Expr [primary] BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Expr modality:SEALED visibility:public superTypes:[kotlin.Any]' @@ -10,7 +10,7 @@ FILE fqName: fileName:/sealedClasses.kt CONSTRUCTOR visibility:public <> (number:kotlin.Double) returnType:.Expr.Const [primary] VALUE_PARAMETER name:number index:0 type:kotlin.Double BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .Expr' + DELEGATING_CONSTRUCTOR_CALL 'protected constructor () [primary] declared in .Expr' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Const modality:FINAL visibility:public superTypes:[.Expr]' PROPERTY name:number visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:number type:kotlin.Double visibility:private [final] @@ -42,7 +42,7 @@ FILE fqName: fileName:/sealedClasses.kt VALUE_PARAMETER name:e1 index:0 type:.Expr VALUE_PARAMETER name:e2 index:1 type:.Expr BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .Expr' + DELEGATING_CONSTRUCTOR_CALL 'protected constructor () [primary] declared in .Expr' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Sum modality:FINAL visibility:public superTypes:[.Expr]' PROPERTY name:e1 visibility:public modality:FINAL [val] FIELD PROPERTY_BACKING_FIELD name:e1 type:.Expr visibility:private [final] @@ -83,7 +83,7 @@ FILE fqName: fileName:/sealedClasses.kt $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Expr.NotANumber CONSTRUCTOR visibility:private <> () returnType:.Expr.NotANumber [primary] BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .Expr' + DELEGATING_CONSTRUCTOR_CALL 'protected constructor () [primary] declared in .Expr' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:NotANumber modality:FINAL visibility:public superTypes:[.Expr]' FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: diff --git a/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.kt.txt b/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.kt.txt index c409b307440bd4d363d9f32ab2dbf20021a8f11d..28ca0eeb57d31b0308da262e05e0581914d25079 100644 --- a/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.kt.txt +++ b/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.kt.txt @@ -1,5 +1,5 @@ expect sealed class Ops { - private expect constructor() /* primary */ + protected expect constructor() /* primary */ } @@ -9,7 +9,7 @@ expect class Add : Ops { } sealed class Ops { - private constructor() /* primary */ { + protected constructor() /* primary */ { super/*Any*/() /* () */ diff --git a/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.txt b/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.txt index 17cb04499194c34faab9dcf71b5825f062dc3cb0..9f4ae6998810c42d21e58c72e5fe97375ea7a45d 100644 --- a/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.txt +++ b/compiler/testData/ir/irText/declarations/multiplatform/expectedSealedClass.fir.txt @@ -1,7 +1,7 @@ FILE fqName: fileName:/expectedSealedClass.kt CLASS CLASS name:Ops modality:SEALED visibility:public [expect] superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Ops - CONSTRUCTOR visibility:private <> () returnType:.Ops [primary,expect] + CONSTRUCTOR visibility:protected <> () returnType:.Ops [primary,expect] FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [expect,fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any @@ -33,7 +33,7 @@ FILE fqName: fileName:/expectedSealedClass.kt $this: VALUE_PARAMETER name: type:kotlin.Any CLASS CLASS name:Ops modality:SEALED visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Ops - CONSTRUCTOR visibility:private <> () returnType:.Ops [primary] + CONSTRUCTOR visibility:protected <> () returnType:.Ops [primary] BLOCK_BODY DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Ops modality:SEALED visibility:public superTypes:[kotlin.Any]' @@ -54,7 +54,7 @@ FILE fqName: fileName:/expectedSealedClass.kt $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Add CONSTRUCTOR visibility:public <> () returnType:.Add [primary] BLOCK_BODY - DELEGATING_CONSTRUCTOR_CALL 'private constructor () [primary] declared in .Ops' + DELEGATING_CONSTRUCTOR_CALL 'protected constructor () [primary] declared in .Ops' INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Add modality:FINAL visibility:public superTypes:[.Ops]' FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 97feba597ca775423cdc338f06016f811f8ffcf3..31da6df9c5a290e5afc1e574e8f74b58a4af904f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -260,8 +260,8 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirErrors.NON_PRIVATE_CONSTRUCTOR_IN_SEALED) { firDiagnostic -> - NonPrivateConstructorInSealedImpl( + add(FirErrors.NON_PRIVATE_OR_PROTECTED_CONSTRUCTOR_IN_SEALED) { firDiagnostic -> + NonPrivateOrProtectedConstructorInSealedImpl( firDiagnostic as FirPsiDiagnostic<*>, token, ) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 723cec5ae4ba1f8fb66f7b9cca4d4abc35b396df..7a6b74440a166c08992f62ed760f7f4ac95cad72 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -190,8 +190,8 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = NonPrivateConstructorInEnum::class } - abstract class NonPrivateConstructorInSealed : KtFirDiagnostic() { - override val diagnosticClass get() = NonPrivateConstructorInSealed::class + abstract class NonPrivateOrProtectedConstructorInSealed : KtFirDiagnostic() { + override val diagnosticClass get() = NonPrivateOrProtectedConstructorInSealed::class } abstract class CyclicConstructorDelegationCall : KtFirDiagnostic() { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 7a52c4f2f37409183691b93f78b70a60367440bf..cef054dea64ea95732cbedab8f00390afc87364c 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -299,10 +299,10 @@ internal class NonPrivateConstructorInEnumImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } -internal class NonPrivateConstructorInSealedImpl( +internal class NonPrivateOrProtectedConstructorInSealedImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.NonPrivateConstructorInSealed(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.NonPrivateOrProtectedConstructorInSealed(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) }