diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 3fffcd23a7f..6e3d16e280e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -839,11 +839,18 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Nullable KtObjectDeclaration companionObject = CollectionsKt.firstOrNull(myClass.getCompanionObjects()); int properFieldVisibilityFlag = getVisibilityAccessFlag(companionObjectDescriptor); + boolean deprecatedFieldForInvisibleCompanionObject = + state.getLanguageVersionSettings().supportsFeature(LanguageFeature.DeprecatedFieldForInvisibleCompanionObject); + boolean properVisibilityForCompanionObjectInstanceField = + state.getLanguageVersionSettings().supportsFeature(LanguageFeature.ProperVisibilityForCompanionObjectInstanceField); boolean fieldShouldBeDeprecated = - state.getLanguageVersionSettings().supportsFeature(LanguageFeature.DeprecatedFieldForInvisibleCompanionObject) && + deprecatedFieldForInvisibleCompanionObject && + !properVisibilityForCompanionObjectInstanceField && (properFieldVisibilityFlag & (ACC_PRIVATE | ACC_PROTECTED)) != 0; - // TODO generate field with proper visibility in language version 1.3 int fieldAccessFlags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; + if (properVisibilityForCompanionObjectInstanceField) { + fieldAccessFlags |= properFieldVisibilityFlag; + } if (fieldShouldBeDeprecated) { fieldAccessFlags |= ACC_DEPRECATED; } diff --git a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.kt b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.kt index 3f11dd6987c..6e3c1703d24 100644 --- a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.kt +++ b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.kt @@ -1,4 +1,4 @@ -// LANGUAGE_VERSION: 1.2 +// LANGUAGE_VERSION: 1.3 class TestPrivateCompanion { private companion object Test diff --git a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.txt b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.txt index e2b445a099c..63766a8377d 100644 --- a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.txt +++ b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.txt @@ -22,7 +22,7 @@ final class TestPrivateCompanion$Test { @kotlin.Metadata public final class TestPrivateCompanion { - public deprecated final static @java.lang.Deprecated field Test: TestPrivateCompanion$Test + public private final static field Test: TestPrivateCompanion$Test inner class TestPrivateCompanion$Test static method (): void public method (): void @@ -37,7 +37,7 @@ public final class TestProtectedCompanion$Test { @kotlin.Metadata public class TestProtectedCompanion { - public deprecated final static @java.lang.Deprecated field Test: TestProtectedCompanion$Test + public protected final static field Test: TestProtectedCompanion$Test inner class TestProtectedCompanion$Test static method (): void public method (): void diff --git a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.kt b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.kt new file mode 100644 index 00000000000..3f11dd6987c --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.kt @@ -0,0 +1,13 @@ +// LANGUAGE_VERSION: 1.2 + +class TestPrivateCompanion { + private companion object Test +} + +open class TestProtectedCompanion { + protected companion object Test +} + +class TestInternalCompanion { + internal companion object Test +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.txt b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.txt new file mode 100644 index 00000000000..e2b445a099c --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.txt @@ -0,0 +1,44 @@ +@kotlin.Metadata +public final class TestInternalCompanion$Test { + inner class TestInternalCompanion$Test + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void +} + +@kotlin.Metadata +public final class TestInternalCompanion { + public final static field Test: TestInternalCompanion$Test + inner class TestInternalCompanion$Test + static method (): void + public method (): void +} + +@kotlin.Metadata +final class TestPrivateCompanion$Test { + inner class TestPrivateCompanion$Test + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void +} + +@kotlin.Metadata +public final class TestPrivateCompanion { + public deprecated final static @java.lang.Deprecated field Test: TestPrivateCompanion$Test + inner class TestPrivateCompanion$Test + static method (): void + public method (): void +} + +@kotlin.Metadata +public final class TestProtectedCompanion$Test { + inner class TestProtectedCompanion$Test + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void +} + +@kotlin.Metadata +public class TestProtectedCompanion { + public deprecated final static @java.lang.Deprecated field Test: TestProtectedCompanion$Test + inner class TestProtectedCompanion$Test + static method (): void + public method (): void +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 3adebec2f1a..4982bb4beba 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -108,6 +108,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { doTest(fileName); } + @TestMetadata("invisibleCompanionObject_lv12.kt") + public void testInvisibleCompanionObject_lv12() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/invisibleCompanionObject_lv12.kt"); + doTest(fileName); + } + @TestMetadata("jvmOverloadsAndParametersAnnotations.kt") public void testJvmOverloadsAndParametersAnnotations() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/jvmOverloadsAndParametersAnnotations.kt"); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index a8e8c18ce17..b953548a0f9 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -74,6 +74,7 @@ enum class LanguageFeature( ProhibitDataClassesOverridingCopy(KOTLIN_1_3), RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes(KOTLIN_1_3), ProhibitInnerClassesOfGenericClassExtendingThrowable(KOTLIN_1_3), + ProperVisibilityForCompanionObjectInstanceField(KOTLIN_1_3), StrictJavaNullabilityAssertions(sinceVersion = null, defaultState = State.DISABLED),