From 07ec70422804bb2b5cb7f201bf50661af9a09d91 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Thu, 22 Feb 2018 18:46:03 +0300 Subject: [PATCH] Fix modifiers generation for companion objects when language verion is 1.3 #KT-23002: Fixed --- .../kotlin/codegen/ImplementationBodyCodegen.java | 10 +++++++++- .../box/compatibility/privateCompanionObject.kt | 12 ++++++++++++ .../bytecodeListing/invisibleCompanionObject.txt | 4 ++-- .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../codegen/LightAnalysisModeTestGenerated.java | 6 ++++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 6 ++++++ 7 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/compatibility/privateCompanionObject.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 80c82401f16..7c9f68f82ab 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -897,7 +897,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { deprecatedFieldForInvisibleCompanionObject && !properVisibilityForCompanionObjectInstanceField && (properFieldVisibilityFlag & (ACC_PRIVATE | ACC_PROTECTED)) != 0; - int fieldAccessFlags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; + boolean doNotGeneratePublic = + properVisibilityForCompanionObjectInstanceField && (properFieldVisibilityFlag & (ACC_PRIVATE | ACC_PROTECTED)) != 0; + int fieldAccessFlags; + if (doNotGeneratePublic) { + fieldAccessFlags = ACC_STATIC | ACC_FINAL; + } + else { + fieldAccessFlags = ACC_PUBLIC | ACC_STATIC | ACC_FINAL; + } if (properVisibilityForCompanionObjectInstanceField) { fieldAccessFlags |= properFieldVisibilityFlag; } diff --git a/compiler/testData/codegen/box/compatibility/privateCompanionObject.kt b/compiler/testData/codegen/box/compatibility/privateCompanionObject.kt new file mode 100644 index 00000000000..76e0e56753c --- /dev/null +++ b/compiler/testData/codegen/box/compatibility/privateCompanionObject.kt @@ -0,0 +1,12 @@ +// LANGUAGE_VERSION: 1.3 + +class Test { + private companion object { + val res = "OK" + } + fun res() = res +} + +fun box(): String { + return Test().res() +} diff --git a/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.txt b/compiler/testData/codegen/bytecodeListing/invisibleCompanionObject.txt index 63766a8377d..b7ec6a88374 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 private final static field Test: TestPrivateCompanion$Test + 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 protected final static field Test: TestProtectedCompanion$Test + protected final static field Test: TestProtectedCompanion$Test inner class TestProtectedCompanion$Test static method (): void public method (): void diff --git a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 6b83b041b9f..a0e2c8ab364 100644 --- a/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -4454,6 +4454,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt"); doTest(fileName); } + + @TestMetadata("privateCompanionObject.kt") + public void testPrivateCompanionObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/privateCompanionObject.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/constants") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 81836cea482..a88743ee5e3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -4454,6 +4454,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt"); doTest(fileName); } + + @TestMetadata("privateCompanionObject.kt") + public void testPrivateCompanionObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/privateCompanionObject.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/constants") diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index ea2a6b8506c..1a9e093951f 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -4454,6 +4454,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt"); doTest(fileName); } + + @TestMetadata("privateCompanionObject.kt") + public void testPrivateCompanionObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/privateCompanionObject.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/constants") diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index b2983669a06..a45e8b78df2 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -5054,6 +5054,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/dataClassEqualsHashCodeToString.kt"); doTest(fileName); } + + @TestMetadata("privateCompanionObject.kt") + public void testPrivateCompanionObject() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/compatibility/privateCompanionObject.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/box/constants")