diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 9a6326a5cc9..64321be8af8 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1182,10 +1182,11 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes DeclarationDescriptor realOwner = getRealOwner(owner, scopeData, anyMember.getMember().isStatic()); + boolean isEnumEntry = DescriptorUtils.isEnumClassObject(realOwner); PropertyDescriptor propertyDescriptor = new PropertyDescriptor( realOwner, resolveAnnotations(anyMember.getMember().psiMember), - resolveModality(anyMember.getMember(), isFinal), + resolveModality(anyMember.getMember(), isFinal || isEnumEntry), visibility, isVar, propertyName, @@ -1194,7 +1195,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes //TODO: this is a hack to indicate that this enum entry is an object // class descriptor for enum entries is not used by backends so for now this should be safe to use // remove this when JavaDescriptorResolver gets rewritten - if (DescriptorUtils.isEnumClassObject(realOwner)) { + if (isEnumEntry) { ClassDescriptorImpl dummyClassDescriptorForEnumEntryObject = new ClassDescriptorImpl(realOwner, Collections.emptyList(), Modality.FINAL, propertyName); dummyClassDescriptorForEnumEntryObject.initialize( diff --git a/compiler/testData/loadKotlinCustom/enum/enumVisibility.kt b/compiler/testData/loadKotlinCustom/enum/enumVisibility.kt new file mode 100644 index 00000000000..f04a52503e9 --- /dev/null +++ b/compiler/testData/loadKotlinCustom/enum/enumVisibility.kt @@ -0,0 +1,14 @@ +package test + +private enum class Pr { + A +} + +internal enum class In { + A +} + +public enum class Pu { + A +} + diff --git a/compiler/testData/loadKotlinCustom/enum/enumVisibility.txt b/compiler/testData/loadKotlinCustom/enum/enumVisibility.txt new file mode 100644 index 00000000000..289fee8d9e0 --- /dev/null +++ b/compiler/testData/loadKotlinCustom/enum/enumVisibility.txt @@ -0,0 +1,35 @@ +namespace test + +internal final enum class test.In : jet.Enum { + public final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.In + public final override /*1*/ fun name(): jet.String + public final override /*1*/ fun ordinal(): jet.Int + internal final class object test.In. { + public final /*constructor*/ fun (): test.In. + public final val A: test.In + public final fun valueOf(/*0*/ value: jet.String): test.In + public final fun values(): jet.Array + } +} +private final enum class test.Pr : jet.Enum { + public final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.Pr + public final override /*1*/ fun name(): jet.String + public final override /*1*/ fun ordinal(): jet.Int + private final class object test.Pr. { + public final /*constructor*/ fun (): test.Pr. + public final val A: test.Pr + public final fun valueOf(/*0*/ value: jet.String): test.Pr + public final fun values(): jet.Array + } +} +public final enum class test.Pu : jet.Enum { + public final /*constructor*/ fun (/*0*/ p0: jet.String?, /*1*/ p1: jet.Int): test.Pu + public final override /*1*/ fun name(): jet.String + public final override /*1*/ fun ordinal(): jet.Int + public final class object test.Pu. { + public final /*constructor*/ fun (): test.Pu. + public final val A: test.Pu + public final fun valueOf(/*0*/ value: jet.String): test.Pu + public final fun values(): jet.Array + } +} diff --git a/compiler/testData/loadKotlinCustom/enum/simpleEnum.txt b/compiler/testData/loadKotlinCustom/enum/simpleEnum.txt index e185c70ebb4..86715d61faa 100644 --- a/compiler/testData/loadKotlinCustom/enum/simpleEnum.txt +++ b/compiler/testData/loadKotlinCustom/enum/simpleEnum.txt @@ -6,7 +6,7 @@ internal final enum class test.MyEnum : jet.Enum { public final override /*1*/ fun ordinal(): jet.Int internal final class object test.MyEnum. { public final /*constructor*/ fun (): test.MyEnum. - public open val ENTRY: test.MyEnum + public final val ENTRY: test.MyEnum public final fun valueOf(/*0*/ value: jet.String): test.MyEnum public final fun values(): jet.Array } diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinCustomTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinCustomTest.java index 3989db895f3..059e5ded803 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinCustomTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadCompiledKotlinCustomTest.java @@ -49,4 +49,10 @@ public final class LoadCompiledKotlinCustomTest extends TestCaseWithTmpdir { doTest(dir + "/simpleEnum.txt", dir + "/simpleEnum.kt"); } + + public void testEnumVisibility() throws Exception { + String dir = PATH + "/enum"; + doTest(dir + "/enumVisibility.txt", + dir + "/enumVisibility.kt"); + } } diff --git a/idea/testData/libraries/decompiled/Color.kt b/idea/testData/libraries/decompiled/Color.kt index 590243d36c5..27282ffdf72 100644 --- a/idea/testData/libraries/decompiled/Color.kt +++ b/idea/testData/libraries/decompiled/Color.kt @@ -5,11 +5,11 @@ package testData.libraries [public final enum class Color : jet.Enum { class object { - [public open val BLUE : testData.libraries.Color] /* compiled code */ + [public final val BLUE : testData.libraries.Color] /* compiled code */ - [public open val GREEN : testData.libraries.Color] /* compiled code */ + [public final val GREEN : testData.libraries.Color] /* compiled code */ - [public open val RED : testData.libraries.Color] /* compiled code */ + [public final val RED : testData.libraries.Color] /* compiled code */ public final fun valueOf(value : jet.String) : testData.libraries.Color { /* compiled code */ }