[FIR] Change default visibility for sealed class constructors from private to public

This commit is contained in:
Dmitriy Novozhilov
2019-12-05 10:42:04 +03:00
parent d840671620
commit de77bd526b
6 changed files with 19 additions and 14 deletions
@@ -444,11 +444,15 @@ class Fir2IrDeclarationStorage(
val descriptor = WrappedClassConstructorDescriptor() val descriptor = WrappedClassConstructorDescriptor()
val origin = IrDeclarationOrigin.DEFINED val origin = IrDeclarationOrigin.DEFINED
val isPrimary = constructor.isPrimary 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 -> val created = constructor.convertWithOffsets { startOffset, endOffset ->
irSymbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol -> irSymbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol ->
IrConstructorImpl( IrConstructorImpl(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
constructor.name, constructor.visibility, constructor.name, visibility,
constructor.returnTypeRef.toIrType(session, this), constructor.returnTypeRef.toIrType(session, this),
isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = false isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = false
).bindAndDeclareParameters(constructor, descriptor, irParent, isStatic = true, shouldLeaveScope = shouldLeaveScope) ).bindAndDeclareParameters(constructor, descriptor, irParent, isStatic = true, shouldLeaveScope = shouldLeaveScope)
@@ -53,10 +53,11 @@ class ClassWrapper(
} }
fun defaultConstructorVisibility(): Visibility { fun defaultConstructorVisibility(): Visibility {
return if (isObject() || isSealed() || isEnum()) return when {
Visibilities.PRIVATE isObject() || isEnum() -> Visibilities.PRIVATE
else isSealed() -> Visibilities.PUBLIC
Visibilities.UNKNOWN else -> Visibilities.UNKNOWN
}
} }
fun getFirUserTypeFromClassName(): FirUserTypeRef { fun getFirUserTypeFromClassName(): FirUserTypeRef {
@@ -405,12 +405,12 @@ class RawFirBuilder(session: FirSession, val stubMode: Boolean) : BaseFirBuilder
} }
} }
fun defaultVisibility() = fun defaultVisibility() = when {
if (owner is KtObjectDeclaration || owner.hasModifier(SEALED_KEYWORD) || owner.hasModifier(ENUM_KEYWORD)) // TODO: object / enum is HIDDEN (?)
// TODO: sealed is FILE_PRIVATE (?) object / enum is HIDDEN (?) owner is KtObjectDeclaration || owner.hasModifier(ENUM_KEYWORD) -> Visibilities.PRIVATE
Visibilities.PRIVATE owner.hasModifier(SEALED_KEYWORD) -> Visibilities.PUBLIC
else else -> Visibilities.UNKNOWN
Visibilities.UNKNOWN }
val status = FirDeclarationStatusImpl(this?.visibility ?: defaultVisibility(), Modality.FINAL).apply { val status = FirDeclarationStatusImpl(this?.visibility ?: defaultVisibility(), Modality.FINAL).apply {
isExpect = this@toFirConstructor?.hasExpectModifier() ?: false isExpect = this@toFirConstructor?.hasExpectModifier() ?: false
@@ -1,6 +1,6 @@
FILE: exhaustiveness_sealedClass.kt FILE: exhaustiveness_sealedClass.kt
public sealed class Base : R|kotlin/Any| { public sealed class Base : R|kotlin/Any| {
private constructor(): R|Base| { public constructor(): R|Base| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
@@ -1,6 +1,6 @@
FILE: test.kt FILE: test.kt
public sealed class Test : R|kotlin/Any| { public sealed class Test : R|kotlin/Any| {
private constructor(): R|test/Test| { public constructor(): R|test/Test| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }
@@ -1,6 +1,6 @@
FILE: recursiveCallOnWhenWithSealedClass.kt FILE: recursiveCallOnWhenWithSealedClass.kt
public sealed class Maybe<T> : R|kotlin/Any| { public sealed class Maybe<T> : R|kotlin/Any| {
private constructor<T>(): R|Maybe<T>| { public constructor<T>(): R|Maybe<T>| {
super<R|kotlin/Any|>() super<R|kotlin/Any|>()
} }