From 71c2a6e7927de3447511bf4ab43d3052f919ef27 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 1 Feb 2016 17:26:05 +0300 Subject: [PATCH] Generate package private visibility in bytecode for private classes --- .../org/jetbrains/kotlin/codegen/AsmUtil.java | 3 +-- .../KtLightClassForExplicitDeclaration.kt | 9 ++++----- .../class/visibility/private/class.kt | 2 +- .../class/visibility/private/enum.kt | 2 +- .../class/visibility/private/object.kt | 2 +- .../class/visibility/private/trait.kt | 2 +- .../asJava/KotlinLightClassStructureTest.java | 3 ++- .../jvm/internal/PrimitiveCompanionObjects.kt | 18 +++++++++--------- 8 files changed, 20 insertions(+), 21 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index f65a8400fd3..c17aaa7e83f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -257,8 +257,7 @@ public class AsmUtil { Classes in byte code should be public or package private */ public static int getVisibilityAccessFlagForClass(ClassDescriptor descriptor) { - if (DescriptorUtils.isTopLevelDeclaration(descriptor) || - descriptor.getVisibility() == Visibilities.PUBLIC || + if (descriptor.getVisibility() == Visibilities.PUBLIC || // TODO: should be package private, but for now Kotlin's reflection can't access members of such classes descriptor.getVisibility() == Visibilities.LOCAL || descriptor.getVisibility() == Visibilities.INTERNAL) { diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt index 398a2e84696..a669cbb422b 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt @@ -284,13 +284,12 @@ open class KtLightClassForExplicitDeclaration( } if (classOrObject.hasModifier(PRIVATE_KEYWORD)) { - // Top-level private class has PUBLIC visibility in Java + // Top-level private class has PACKAGE_LOCAL visibility in Java // Nested private class has PRIVATE visibility - psiModifiers.add(if (classOrObject.isTopLevel()) PsiModifier.PUBLIC else PsiModifier.PRIVATE) + psiModifiers.add(if (classOrObject.isTopLevel()) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE) } - - if (!psiModifiers.contains(PsiModifier.PRIVATE) && !psiModifiers.contains(PsiModifier.PROTECTED)) { - psiModifiers.add(PsiModifier.PUBLIC) // For internal (default) visibility + else if (!psiModifiers.contains(PsiModifier.PROTECTED)) { + psiModifiers.add(PsiModifier.PUBLIC) } diff --git a/compiler/testData/writeFlags/class/visibility/private/class.kt b/compiler/testData/writeFlags/class/visibility/private/class.kt index 4258c6c5ccb..44075cf4bb0 100644 --- a/compiler/testData/writeFlags/class/visibility/private/class.kt +++ b/compiler/testData/writeFlags/class/visibility/private/class.kt @@ -4,4 +4,4 @@ private class MyClass() { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: MyClass -// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER +// FLAGS: ACC_FINAL, ACC_SUPER diff --git a/compiler/testData/writeFlags/class/visibility/private/enum.kt b/compiler/testData/writeFlags/class/visibility/private/enum.kt index 37996ae9afe..f828907646d 100644 --- a/compiler/testData/writeFlags/class/visibility/private/enum.kt +++ b/compiler/testData/writeFlags/class/visibility/private/enum.kt @@ -3,4 +3,4 @@ private enum class MyClass() { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: MyClass -// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER, ACC_ENUM +// FLAGS: ACC_FINAL, ACC_SUPER, ACC_ENUM diff --git a/compiler/testData/writeFlags/class/visibility/private/object.kt b/compiler/testData/writeFlags/class/visibility/private/object.kt index 05a134efb1e..40e3dfc571e 100644 --- a/compiler/testData/writeFlags/class/visibility/private/object.kt +++ b/compiler/testData/writeFlags/class/visibility/private/object.kt @@ -3,4 +3,4 @@ private object MyClass { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: MyClass -// FLAGS: ACC_FINAL, ACC_PUBLIC, ACC_SUPER +// FLAGS: ACC_FINAL, ACC_SUPER diff --git a/compiler/testData/writeFlags/class/visibility/private/trait.kt b/compiler/testData/writeFlags/class/visibility/private/trait.kt index ae929a2a14a..3ca4044c22b 100644 --- a/compiler/testData/writeFlags/class/visibility/private/trait.kt +++ b/compiler/testData/writeFlags/class/visibility/private/trait.kt @@ -3,4 +3,4 @@ private interface MyClass { // TESTED_OBJECT_KIND: class // TESTED_OBJECTS: MyClass -// FLAGS: ACC_ABSTRACT, ACC_INTERFACE, ACC_PUBLIC +// FLAGS: ACC_ABSTRACT, ACC_INTERFACE diff --git a/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassStructureTest.java b/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassStructureTest.java index f9e81434ced..9204130fade 100644 --- a/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassStructureTest.java +++ b/compiler/tests/org/jetbrains/kotlin/asJava/KotlinLightClassStructureTest.java @@ -54,7 +54,7 @@ public abstract class KotlinLightClassStructureTest extends KotlinAsJavaTestBase public void testTopLevelVisibilities() { checkModifiers("test.Public", PUBLIC, FINAL); - checkModifiers("test.Private", PUBLIC, FINAL); + checkModifiers("test.Private", PACKAGE_LOCAL, FINAL); checkModifiers("test.Internal", PUBLIC, FINAL); } @@ -253,6 +253,7 @@ public abstract class KotlinLightClassStructureTest extends KotlinAsJavaTestBase enum ClassProperty { PUBLIC(PsiModifier.PUBLIC), PROTECTED(PsiModifier.PROTECTED), + PACKAGE_LOCAL(PsiModifier.PACKAGE_LOCAL), PRIVATE(PsiModifier.PRIVATE), STATIC(PsiModifier.STATIC), ABSTRACT(PsiModifier.ABSTRACT), diff --git a/core/runtime.jvm/src/kotlin/jvm/internal/PrimitiveCompanionObjects.kt b/core/runtime.jvm/src/kotlin/jvm/internal/PrimitiveCompanionObjects.kt index 6a93a5c533d..763ae7ab02b 100644 --- a/core/runtime.jvm/src/kotlin/jvm/internal/PrimitiveCompanionObjects.kt +++ b/core/runtime.jvm/src/kotlin/jvm/internal/PrimitiveCompanionObjects.kt @@ -16,7 +16,7 @@ package kotlin.jvm.internal -private object DoubleCompanionObject { +internal object DoubleCompanionObject { val MIN_VALUE: Double = java.lang.Double.MIN_VALUE val MAX_VALUE: Double = java.lang.Double.MAX_VALUE val POSITIVE_INFINITY : Double = java.lang.Double.POSITIVE_INFINITY @@ -24,7 +24,7 @@ private object DoubleCompanionObject { val NaN : Double = java.lang.Double.NaN } -private object FloatCompanionObject { +internal object FloatCompanionObject { val MIN_VALUE: Float = java.lang.Float.MIN_VALUE val MAX_VALUE: Float = java.lang.Float.MAX_VALUE val POSITIVE_INFINITY : Float = java.lang.Float.POSITIVE_INFINITY @@ -32,28 +32,28 @@ private object FloatCompanionObject { val NaN : Float = java.lang.Float.NaN } -private object IntCompanionObject { +internal object IntCompanionObject { const val MIN_VALUE: Int = java.lang.Integer.MIN_VALUE const val MAX_VALUE: Int = java.lang.Integer.MAX_VALUE } -private object LongCompanionObject { +internal object LongCompanionObject { const val MIN_VALUE: Long = java.lang.Long.MIN_VALUE const val MAX_VALUE: Long = java.lang.Long.MAX_VALUE } -private object ShortCompanionObject { +internal object ShortCompanionObject { const val MIN_VALUE: Short = java.lang.Short.MIN_VALUE const val MAX_VALUE: Short = java.lang.Short.MAX_VALUE } -private object ByteCompanionObject { +internal object ByteCompanionObject { const val MIN_VALUE: Byte = java.lang.Byte.MIN_VALUE const val MAX_VALUE: Byte = java.lang.Byte.MAX_VALUE } -private object CharCompanionObject { +internal object CharCompanionObject { const val MIN_HIGH_SURROGATE: Char = '\uD800' const val MAX_HIGH_SURROGATE: Char = '\uDBFF' const val MIN_LOW_SURROGATE: Char = '\uDC00' @@ -62,5 +62,5 @@ private object CharCompanionObject { const val MAX_SURROGATE: Char = MAX_LOW_SURROGATE } -private object StringCompanionObject {} -private object EnumCompanionObject {} \ No newline at end of file +internal object StringCompanionObject {} +internal object EnumCompanionObject {} \ No newline at end of file