From da02d25278a494239c7fd74b04cf21fa93def954 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 16 Nov 2021 17:21:47 +0300 Subject: [PATCH] [FE 1.0] Implement deprecation warning for private constructors of sealed classes ^KT-44866 ^KT-49729 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 12 +++++ ...irOldFrontendDiagnosticsTestGenerated.java | 12 +++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 +++++ .../jetbrains/kotlin/diagnostics/Errors.java | 2 + .../rendering/DefaultErrorMessages.java | 2 + .../resolve/PlatformConfiguratorBase.kt | 1 + ...oPrivateConstructorOfSealedClassChecker.kt | 30 +++++++++++ .../privateSealedConstructors_error.fir.kt | 21 ++++++++ .../sealed/privateSealedConstructors_error.kt | 21 ++++++++ .../privateSealedConstructors_error.txt | 53 +++++++++++++++++++ .../privateSealedConstructors_warning.fir.kt | 21 ++++++++ .../privateSealedConstructors_warning.kt | 21 ++++++++ .../privateSealedConstructors_warning.txt | 53 +++++++++++++++++++ .../protectedConstructors_disabled.fir.kt | 2 +- .../sealed/protectedConstructors_disabled.kt | 2 +- .../protectedConstructors_enabled.fir.kt | 2 +- .../sealed/protectedConstructors_enabled.kt | 2 +- .../test/runners/DiagnosticTestGenerated.java | 12 +++++ 18 files changed, 277 insertions(+), 4 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ResolutionToPrivateConstructorOfSealedClassChecker.kt create mode 100644 compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.fir.kt create mode 100644 compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt create mode 100644 compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.txt create mode 100644 compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.fir.kt create mode 100644 compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt create mode 100644 compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 244e9466ded..fb2004dcc15 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -26407,6 +26407,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/sealed/OperationWhen.kt"); } + @Test + @TestMetadata("privateSealedConstructors_error.kt") + public void testPrivateSealedConstructors_error() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt"); + } + + @Test + @TestMetadata("privateSealedConstructors_warning.kt") + public void testPrivateSealedConstructors_warning() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt"); + } + @Test @TestMetadata("privateTypeInConstructor.kt") public void testPrivateTypeInConstructor() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 8ee1d405e82..713ff1a60e7 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -26407,6 +26407,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/sealed/OperationWhen.kt"); } + @Test + @TestMetadata("privateSealedConstructors_error.kt") + public void testPrivateSealedConstructors_error() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt"); + } + + @Test + @TestMetadata("privateSealedConstructors_warning.kt") + public void testPrivateSealedConstructors_warning() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt"); + } + @Test @TestMetadata("privateTypeInConstructor.kt") public void testPrivateTypeInConstructor() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 82ea5420cc2..b252487d249 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -26407,6 +26407,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/sealed/OperationWhen.kt"); } + @Test + @TestMetadata("privateSealedConstructors_error.kt") + public void testPrivateSealedConstructors_error() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt"); + } + + @Test + @TestMetadata("privateSealedConstructors_warning.kt") + public void testPrivateSealedConstructors_warning() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt"); + } + @Test @TestMetadata("privateTypeInConstructor.kt") public void testPrivateTypeInConstructor() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index f72706d2a9e..3ef3b7e78b5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -810,6 +810,8 @@ public interface Errors { DiagnosticFactory0 PARENTHESIZED_COMPANION_LHS_DEPRECATION = DiagnosticFactory0.create(WARNING); + DiagnosticFactory0 RESOLUTION_TO_PRIVATE_CONSTRUCTOR_OF_SEALED_CLASS = DiagnosticFactory0.create(WARNING); + // Type inference DiagnosticFactory0 CANNOT_INFER_PARAMETER_TYPE = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 1679c1ae2e5..fa7967933a3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -450,6 +450,8 @@ public class DefaultErrorMessages { MAP.put(PARENTHESIZED_COMPANION_LHS_DEPRECATION, "Access to companion object through parenthesized class name is deprecated. Please, add explicit Companion qualifier."); + MAP.put(RESOLUTION_TO_PRIVATE_CONSTRUCTOR_OF_SEALED_CLASS, "Resolution to private constructor of sealed class. In future it will be allowed to use this constructor only inside declaring sealed class"); + MAP.put(LOCAL_EXTENSION_PROPERTY, "Local extension properties are not allowed"); MAP.put(LOCAL_VARIABLE_WITH_GETTER, "Local variables are not allowed to have getters"); MAP.put(LOCAL_VARIABLE_WITH_SETTER, "Local variables are not allowed to have setters"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt index 996c27e2678..23f5f63fb9c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt @@ -63,6 +63,7 @@ private val DEFAULT_CALL_CHECKERS = listOf( UnitConversionCallChecker, FunInterfaceConstructorReferenceChecker, NullableExtensionOperatorWithSafeCallChecker, ReferencingToUnderscoreNamedParameterOfCatchBlockChecker, VarargWrongExecutionOrderChecker, SelfCallInNestedObjectConstructorChecker, NewSchemeOfIntegerOperatorResolutionChecker, EnumEntryVsCompanionPriorityCallChecker, CompanionInParenthesesLHSCallChecker, + ResolutionToPrivateConstructorOfSealedClassChecker, ) private val DEFAULT_TYPE_CHECKERS = emptyList() private val DEFAULT_CLASSIFIER_USAGE_CHECKERS = listOf( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ResolutionToPrivateConstructorOfSealedClassChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ResolutionToPrivateConstructorOfSealedClassChecker.kt new file mode 100644 index 00000000000..965cfce2c92 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/ResolutionToPrivateConstructorOfSealedClassChecker.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2021 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.resolve.calls.checkers + +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.descriptors.ConstructorDescriptor +import org.jetbrains.kotlin.descriptors.DescriptorVisibilities +import org.jetbrains.kotlin.descriptors.isSealed +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall + +object ResolutionToPrivateConstructorOfSealedClassChecker : CallChecker { + override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { + // If AllowSealedInheritorsInDifferentFilesOfSamePackage disabled then all sealed constructors are private by default + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.AllowSealedInheritorsInDifferentFilesOfSamePackage)) return + if (context.languageVersionSettings.supportsFeature(LanguageFeature.UseConsistentRulesForPrivateConstructorsOfSealedClasses)) return + val descriptor = resolvedCall.resultingDescriptor as? ConstructorDescriptor ?: return + if (descriptor.visibility != DescriptorVisibilities.PRIVATE) return + if (!descriptor.constructedClass.isSealed()) return + val containingDescriptor = context.scope.ownerDescriptor + val receiver = resolvedCall.dispatchReceiver ?: DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER + if (DescriptorVisibilities.findInvisibleMember(receiver, descriptor, containingDescriptor, false) != null) { + context.trace.report(Errors.RESOLUTION_TO_PRIVATE_CONSTRUCTOR_OF_SEALED_CLASS.on(reportOn)) + } + } +} diff --git a/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.fir.kt b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.fir.kt new file mode 100644 index 00000000000..e8b2b43353b --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.fir.kt @@ -0,0 +1,21 @@ +// LANGUAGE: +UseConsistentRulesForPrivateConstructorsOfSealedClasses +// ISSUE: KT-44866, KT-49729 + +// FILE: base.kt +sealed class SealedBase(x: Int) { + private constructor(y: String) : this(y.length) + + class SealedNested : SealedBase("nested") +} +class SealedOuter : SealedBase("outer") + +abstract class RegularBase(x: Int) { + private constructor(y: String) : this(y.length) + + class RegularNested : RegularBase("nested") +} +class RegularOuter : RegularBase("outer") + +// FILE: derived.kt + +class SealedOuterInDifferentFile : SealedBase("other file") diff --git a/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt new file mode 100644 index 00000000000..cb9f3d5f34e --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt @@ -0,0 +1,21 @@ +// LANGUAGE: +UseConsistentRulesForPrivateConstructorsOfSealedClasses +// ISSUE: KT-44866, KT-49729 + +// FILE: base.kt +sealed class SealedBase(x: Int) { + private constructor(y: String) : this(y.length) + + class SealedNested : SealedBase("nested") +} +class SealedOuter : SealedBase("outer") + +abstract class RegularBase(x: Int) { + private constructor(y: String) : this(y.length) + + class RegularNested : RegularBase("nested") +} +class RegularOuter : RegularBase("outer") + +// FILE: derived.kt + +class SealedOuterInDifferentFile : SealedBase("other file") diff --git a/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.txt b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.txt new file mode 100644 index 00000000000..389647711c1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.txt @@ -0,0 +1,53 @@ +package + +public abstract class RegularBase { + public constructor RegularBase(/*0*/ x: kotlin.Int) + private constructor RegularBase(/*0*/ y: kotlin.String) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class RegularNested : RegularBase { + public constructor RegularNested() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public final class RegularOuter : RegularBase { + public constructor RegularOuter() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public sealed class SealedBase { + protected constructor SealedBase(/*0*/ x: kotlin.Int) + private constructor SealedBase(/*0*/ y: kotlin.String) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class SealedNested : SealedBase { + public constructor SealedNested() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public final class SealedOuter : SealedBase { + public constructor SealedOuter() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class SealedOuterInDifferentFile : SealedBase { + public constructor SealedOuterInDifferentFile() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + diff --git a/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.fir.kt b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.fir.kt new file mode 100644 index 00000000000..11ec3ec4690 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.fir.kt @@ -0,0 +1,21 @@ +// LANGUAGE: -UseConsistentRulesForPrivateConstructorsOfSealedClasses +// ISSUE: KT-44866, KT-49729 + +// FILE: base.kt +sealed class SealedBase(x: Int) { + private constructor(y: String) : this(y.length) + + class SealedNested : SealedBase("nested") +} +class SealedOuter : SealedBase("outer") + +abstract class RegularBase(x: Int) { + private constructor(y: String) : this(y.length) + + class RegularNested : RegularBase("nested") +} +class RegularOuter : RegularBase("outer") + +// FILE: derived.kt + +class SealedOuterInDifferentFile : SealedBase("other file") diff --git a/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt new file mode 100644 index 00000000000..8067583c5a4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt @@ -0,0 +1,21 @@ +// LANGUAGE: -UseConsistentRulesForPrivateConstructorsOfSealedClasses +// ISSUE: KT-44866, KT-49729 + +// FILE: base.kt +sealed class SealedBase(x: Int) { + private constructor(y: String) : this(y.length) + + class SealedNested : SealedBase("nested") +} +class SealedOuter : SealedBase("outer") + +abstract class RegularBase(x: Int) { + private constructor(y: String) : this(y.length) + + class RegularNested : RegularBase("nested") +} +class RegularOuter : RegularBase("outer") + +// FILE: derived.kt + +class SealedOuterInDifferentFile : SealedBase("other file") diff --git a/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.txt b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.txt new file mode 100644 index 00000000000..389647711c1 --- /dev/null +++ b/compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.txt @@ -0,0 +1,53 @@ +package + +public abstract class RegularBase { + public constructor RegularBase(/*0*/ x: kotlin.Int) + private constructor RegularBase(/*0*/ y: kotlin.String) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class RegularNested : RegularBase { + public constructor RegularNested() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public final class RegularOuter : RegularBase { + public constructor RegularOuter() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public sealed class SealedBase { + protected constructor SealedBase(/*0*/ x: kotlin.Int) + private constructor SealedBase(/*0*/ y: kotlin.String) + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public final class SealedNested : SealedBase { + public constructor SealedNested() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +public final class SealedOuter : SealedBase { + public constructor SealedOuter() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class SealedOuterInDifferentFile : SealedBase { + public constructor SealedOuterInDifferentFile() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + diff --git a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt index 68a31c07293..431489a5bfb 100644 --- a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.fir.kt @@ -22,7 +22,7 @@ sealed class Case3 private constructor(val x: Int) { class Inheritor2 : Case3("Hello") } -class Case3Inheritor3 : Case3(20) // should be an error in 1.6 (?) +class Case3Inheritor3 : Case3(20) // should be an error in 1.8 sealed class Case4 { protected constructor(x: Int) diff --git a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.kt b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.kt index 441c2ade829..2f508283cc3 100644 --- a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.kt +++ b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_disabled.kt @@ -22,7 +22,7 @@ sealed class Case3 private constructor(val x: Int) { class Inheritor2 : Case3("Hello") } -class Case3Inheritor3 : Case3(20) // should be an error in 1.6 (?) +class Case3Inheritor3 : Case3(20) // should be an error in 1.8 sealed class Case4 { protected constructor(x: Int) diff --git a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt index f905104e112..fa7dfe31465 100644 --- a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt +++ b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.fir.kt @@ -22,7 +22,7 @@ sealed class Case3 private constructor(val x: Int) { class Inheritor2 : Case3("Hello") } -class Case3Inheritor3 : Case3(20) // should be an error in 1.6 (?) +class Case3Inheritor3 : Case3(20) // should be an error in 1.8 sealed class Case4 { protected constructor(x: Int) diff --git a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.kt b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.kt index 6cec7e5a60f..892f5d0bda0 100644 --- a/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.kt +++ b/compiler/testData/diagnostics/tests/sealed/protectedConstructors_enabled.kt @@ -22,7 +22,7 @@ sealed class Case3 private constructor(val x: Int) { class Inheritor2 : Case3("Hello") } -class Case3Inheritor3 : Case3(20) // should be an error in 1.6 (?) +class Case3Inheritor3 : Case3(20) // should be an error in 1.8 sealed class Case4 { protected constructor(x: Int) diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index e9a8e39608a..ec09934f0b2 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -26497,6 +26497,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/sealed/OperationWhen.kt"); } + @Test + @TestMetadata("privateSealedConstructors_error.kt") + public void testPrivateSealedConstructors_error() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_error.kt"); + } + + @Test + @TestMetadata("privateSealedConstructors_warning.kt") + public void testPrivateSealedConstructors_warning() throws Exception { + runTest("compiler/testData/diagnostics/tests/sealed/privateSealedConstructors_warning.kt"); + } + @Test @TestMetadata("privateTypeInConstructor.kt") public void testPrivateTypeInConstructor() throws Exception {