[FIR] Change default visibility for sealed class constructors from private to public
This commit is contained in:
+5
-1
@@ -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
-1
@@ -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|>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user