From de77bd526bdfdcbc6193e225640e0d6fc87efd03 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 5 Dec 2019 10:42:04 +0300 Subject: [PATCH] [FIR] Change default visibility for sealed class constructors from `private` to `public` --- .../kotlin/fir/backend/Fir2IrDeclarationStorage.kt | 6 +++++- .../kotlin/fir/lightTree/fir/ClassWrapper.kt | 9 +++++---- .../jetbrains/kotlin/fir/builder/RawFirBuilder.kt | 12 ++++++------ .../testData/resolve/exhaustiveness_sealedClass.txt | 2 +- .../testData/resolve/multifile/sealedStarImport.txt | 2 +- .../resolve/recursiveCallOnWhenWithSealedClass.txt | 2 +- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index caf7e84eb96..4824ad70be9 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -444,11 +444,15 @@ class Fir2IrDeclarationStorage( val descriptor = WrappedClassConstructorDescriptor() val origin = IrDeclarationOrigin.DEFINED val isPrimary = constructor.isPrimary + val visibility = when { + irParent is IrClass && irParent.modality == Modality.SEALED -> Visibilities.PRIVATE + else -> constructor.visibility + } val created = constructor.convertWithOffsets { startOffset, endOffset -> irSymbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol -> IrConstructorImpl( startOffset, endOffset, origin, symbol, - constructor.name, constructor.visibility, + constructor.name, visibility, constructor.returnTypeRef.toIrType(session, this), isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = false ).bindAndDeclareParameters(constructor, descriptor, irParent, isStatic = true, shouldLeaveScope = shouldLeaveScope) diff --git a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt index 359b54bb7bb..3c9fc01f32d 100644 --- a/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt +++ b/compiler/fir/lightTree/src/org/jetbrains/kotlin/fir/lightTree/fir/ClassWrapper.kt @@ -53,10 +53,11 @@ class ClassWrapper( } fun defaultConstructorVisibility(): Visibility { - return if (isObject() || isSealed() || isEnum()) - Visibilities.PRIVATE - else - Visibilities.UNKNOWN + return when { + isObject() || isEnum() -> Visibilities.PRIVATE + isSealed() -> Visibilities.PUBLIC + else -> Visibilities.UNKNOWN + } } fun getFirUserTypeFromClassName(): FirUserTypeRef { diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 938a5f41d6c..838508be884 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt @@ -405,12 +405,12 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder } } - fun defaultVisibility() = - if (owner is KtObjectDeclaration || owner.hasModifier(SEALED_KEYWORD) || owner.hasModifier(ENUM_KEYWORD)) - // TODO: sealed is FILE_PRIVATE (?) object / enum is HIDDEN (?) - Visibilities.PRIVATE - else - Visibilities.UNKNOWN + fun defaultVisibility() = when { + // TODO: object / enum is HIDDEN (?) + owner is KtObjectDeclaration || owner.hasModifier(ENUM_KEYWORD) -> Visibilities.PRIVATE + owner.hasModifier(SEALED_KEYWORD) -> Visibilities.PUBLIC + else -> Visibilities.UNKNOWN + } val status = FirDeclarationStatusImpl(this?.visibility ?: defaultVisibility(), Modality.FINAL).apply { isExpect = this@toFirConstructor?.hasExpectModifier() ?: false diff --git a/compiler/fir/resolve/testData/resolve/exhaustiveness_sealedClass.txt b/compiler/fir/resolve/testData/resolve/exhaustiveness_sealedClass.txt index 723c1e4b13e..e27263f5452 100644 --- a/compiler/fir/resolve/testData/resolve/exhaustiveness_sealedClass.txt +++ b/compiler/fir/resolve/testData/resolve/exhaustiveness_sealedClass.txt @@ -1,6 +1,6 @@ FILE: exhaustiveness_sealedClass.kt public sealed class Base : R|kotlin/Any| { - private constructor(): R|Base| { + public constructor(): R|Base| { super() } diff --git a/compiler/fir/resolve/testData/resolve/multifile/sealedStarImport.txt b/compiler/fir/resolve/testData/resolve/multifile/sealedStarImport.txt index 5e5a02551f7..bad021bab08 100644 --- a/compiler/fir/resolve/testData/resolve/multifile/sealedStarImport.txt +++ b/compiler/fir/resolve/testData/resolve/multifile/sealedStarImport.txt @@ -1,6 +1,6 @@ FILE: test.kt public sealed class Test : R|kotlin/Any| { - private constructor(): R|test/Test| { + public constructor(): R|test/Test| { super() } diff --git a/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt b/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt index 5c3c2d941ad..31543588203 100644 --- a/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt +++ b/compiler/fir/resolve/testData/resolve/recursiveCallOnWhenWithSealedClass.txt @@ -1,6 +1,6 @@ FILE: recursiveCallOnWhenWithSealedClass.kt public sealed class Maybe : R|kotlin/Any| { - private constructor(): R|Maybe| { + public constructor(): R|Maybe| { super() }