FIR: fix default constructor visibility for enum entry.

This commit is contained in:
Jinseong Jeon
2020-05-19 15:06:18 -07:00
committed by Mikhail Glukhikh
parent 0d3301b695
commit 7a947e8008
8 changed files with 23 additions and 24 deletions
@@ -520,16 +520,12 @@ class Fir2IrDeclarationStorage(
): IrConstructor { ): IrConstructor {
val descriptor = WrappedClassConstructorDescriptor() val descriptor = WrappedClassConstructorDescriptor()
val isPrimary = constructor.isPrimary val isPrimary = constructor.isPrimary
val visibility = when (irParent.modality) {
Modality.SEALED -> Visibilities.PRIVATE
else -> constructor.visibility
}
classifierStorage.preCacheTypeParameters(constructor) classifierStorage.preCacheTypeParameters(constructor)
val created = constructor.convertWithOffsets { startOffset, endOffset -> val created = constructor.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol -> symbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol ->
IrConstructorImpl( IrConstructorImpl(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
Name.special("<init>"), visibility, Name.special("<init>"), constructor.visibility,
constructor.returnTypeRef.toIrType(), constructor.returnTypeRef.toIrType(),
isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = false isInline = false, isExternal = false, isPrimary = isPrimary, isExpect = false
).apply { ).apply {
@@ -57,9 +57,10 @@ class ClassWrapper(
return modifiers.isInner() return modifiers.isInner()
} }
// See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors
fun defaultConstructorVisibility(): Visibility { fun defaultConstructorVisibility(): Visibility {
return when { return when {
isObject() || isEnum() -> Visibilities.PRIVATE isObject() || isEnum() || isEnumEntry() -> Visibilities.PRIVATE
isSealed() -> Visibilities.PRIVATE isSealed() -> Visibilities.PRIVATE
else -> Visibilities.UNKNOWN else -> Visibilities.UNKNOWN
} }
@@ -544,9 +544,9 @@ class RawFirBuilder(
} }
} }
// See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors
fun defaultVisibility() = when { fun defaultVisibility() = when {
// TODO: object / enum is HIDDEN (?) owner is KtObjectDeclaration || owner.hasModifier(ENUM_KEYWORD) || owner is KtEnumEntry -> Visibilities.PRIVATE
owner is KtObjectDeclaration || owner.hasModifier(ENUM_KEYWORD) -> Visibilities.PRIVATE
owner.hasModifier(SEALED_KEYWORD) -> Visibilities.PRIVATE owner.hasModifier(SEALED_KEYWORD) -> Visibilities.PRIVATE
else -> Visibilities.UNKNOWN else -> Visibilities.UNKNOWN
} }
@@ -30,14 +30,14 @@ FILE: annotation.kt
} }
public final static enum entry FIRST: R|My| = @base() object : R|My| { public final static enum entry FIRST: R|My| = @base() object : R|My| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|My|>() super<R|My|>()
} }
} }
public final static enum entry SECOND: R|My| = @base() object : R|My| { public final static enum entry SECOND: R|My| = @base() object : R|My| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|My|>() super<R|My|>()
} }
@@ -14,7 +14,7 @@ FILE: constructorInObject.kt
} }
public final static enum entry X: R|B| = object : R|B| { public final static enum entry X: R|B| = object : R|B| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|B|>() super<R|B|>()
} }
@@ -26,7 +26,7 @@ FILE: enums.kt
internal get(): Double internal get(): Double
public final static enum entry MERCURY: R|Planet| = object : R|Planet| { public final static enum entry MERCURY: R|Planet| = object : R|Planet| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|Planet|>(Double(1.0), Double(2.0)) super<R|Planet|>(Double(1.0), Double(2.0))
} }
@@ -37,7 +37,7 @@ FILE: enums.kt
} }
public final static enum entry VENERA: R|Planet| = object : R|Planet| { public final static enum entry VENERA: R|Planet| = object : R|Planet| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|Planet|>(Double(3.0), Double(4.0)) super<R|Planet|>(Double(3.0), Double(4.0))
} }
@@ -48,7 +48,7 @@ FILE: enums.kt
} }
public final static enum entry EARTH: R|Planet| = object : R|Planet| { public final static enum entry EARTH: R|Planet| = object : R|Planet| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|Planet|>(Double(5.0), Double(6.0)) super<R|Planet|>(Double(5.0), Double(6.0))
} }
@@ -89,49 +89,49 @@ FILE: enums.kt
public? get(): String public? get(): String
public final static enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry FIX_STACK_BEFORE_JUMP: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>() super<R|PseudoInsn|>()
} }
} }
public final static enum entry FAKE_ALWAYS_TRUE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry FAKE_ALWAYS_TRUE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>(String(()I)) super<R|PseudoInsn|>(String(()I))
} }
} }
public final static enum entry FAKE_ALWAYS_FALSE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry FAKE_ALWAYS_FALSE_IFEQ: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>(String(()I)) super<R|PseudoInsn|>(String(()I))
} }
} }
public final static enum entry SAVE_STACK_BEFORE_TRY: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry SAVE_STACK_BEFORE_TRY: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>() super<R|PseudoInsn|>()
} }
} }
public final static enum entry RESTORE_STACK_IN_TRY_CATCH: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry RESTORE_STACK_IN_TRY_CATCH: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>() super<R|PseudoInsn|>()
} }
} }
public final static enum entry STORE_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry STORE_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>() super<R|PseudoInsn|>()
} }
} }
public final static enum entry AS_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| { public final static enum entry AS_NOT_NULL: R|PseudoInsn| = object : R|PseudoInsn| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|PseudoInsn|>(String((Ljava/lang/Object;)Ljava/lang/Object;)) super<R|PseudoInsn|>(String((Ljava/lang/Object;)Ljava/lang/Object;))
} }
@@ -22,7 +22,7 @@ FILE: enums2.kt
public? get(): Some public? get(): Some
public final static enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| { public final static enum entry FIRST: R|SomeEnum| = object : R|SomeEnum| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|SomeEnum|>(O1#) super<R|SomeEnum|>(O1#)
} }
@@ -33,7 +33,7 @@ FILE: enums2.kt
} }
public final static enum entry SECOND: R|SomeEnum| = object : R|SomeEnum| { public final static enum entry SECOND: R|SomeEnum| = object : R|SomeEnum| {
public? constructor(): R|anonymous| { private constructor(): R|anonymous| {
super<R|SomeEnum|>(O2#) super<R|SomeEnum|>(O2#)
} }
@@ -213,9 +213,11 @@ fun FirDeclaration.resolveStatus(
} }
private fun FirDeclaration.resolveVisibility(containingClass: FirClass<*>?): Visibility { private fun FirDeclaration.resolveVisibility(containingClass: FirClass<*>?): Visibility {
// See DescriptorUtils#getDefaultConstructorVisibility in core.descriptors
if (this is FirConstructor) { if (this is FirConstructor) {
if (containingClass != null && if (containingClass != null &&
(containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.modality == Modality.SEALED) (containingClass.classKind == ClassKind.ENUM_CLASS || containingClass.classKind == ClassKind.ENUM_ENTRY ||
containingClass.modality == Modality.SEALED)
) { ) {
return Visibilities.PRIVATE return Visibilities.PRIVATE
} }