From 6a68eb218f7dc96ba891b8fad6aa4126be1b4858 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 9 Mar 2017 09:49:19 +0300 Subject: [PATCH] KT-16077 Redundant private getter for private var in a class within a JvmMultifileClass annotated file --- .../jetbrains/kotlin/codegen/PropertyCodegen.java | 12 ++++++++++-- .../testData/codegen/box/multifileClasses/kt16077.kt | 11 +++++++++++ .../light-analysis/multifileClasses/kt16077.txt | 12 ++++++++++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 6 ++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 6 ++++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 12 ++++++++++++ 6 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/multifileClasses/kt16077.kt create mode 100644 compiler/testData/codegen/light-analysis/multifileClasses/kt16077.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index 2f2dc2204ba..967c65aaaed 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -57,7 +57,6 @@ import java.util.List; import static org.jetbrains.kotlin.codegen.AsmUtil.getDeprecatedAccessFlag; import static org.jetbrains.kotlin.codegen.AsmUtil.getVisibilityForBackingField; -import static org.jetbrains.kotlin.codegen.AsmUtil.isPropertyWithBackingFieldCopyInOuterClass; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface; import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.FIELD_FOR_PROPERTY; @@ -189,7 +188,7 @@ public class PropertyCodegen { if (isCompanionObject(descriptor.getContainingDeclaration())) return true; // Non-const properties from multifile classes have accessors regardless of visibility - if (!descriptor.isConst() && JvmFileClassUtilKt.isInsideJvmMultifileClassFile(declaration)) return true; + if (isNonConstTopLevelPropertyInMultifileClass(declaration, descriptor)) return true; // Private class properties have accessors only in cases when those accessors are non-trivial if (Visibilities.isPrivate(descriptor.getVisibility())) { @@ -199,6 +198,15 @@ public class PropertyCodegen { return true; } + private static boolean isNonConstTopLevelPropertyInMultifileClass( + @NotNull KtProperty declaration, + @NotNull PropertyDescriptor descriptor + ) { + return !descriptor.isConst() && + descriptor.getContainingDeclaration() instanceof PackageFragmentDescriptor && + JvmFileClassUtilKt.isInsideJvmMultifileClassFile(declaration); + } + private static boolean areAccessorsNeededForPrimaryConstructorProperty( @NotNull PropertyDescriptor descriptor ) { diff --git a/compiler/testData/codegen/box/multifileClasses/kt16077.kt b/compiler/testData/codegen/box/multifileClasses/kt16077.kt new file mode 100644 index 00000000000..1dd07252a9c --- /dev/null +++ b/compiler/testData/codegen/box/multifileClasses/kt16077.kt @@ -0,0 +1,11 @@ +// IGNORE_BACKEND: JS +// WITH_RUNTIME + +@file:JvmMultifileClass + +class A { + private var r: String = "fail" + public fun getR(): String = "OK" +} + +fun box() = A().getR() \ No newline at end of file diff --git a/compiler/testData/codegen/light-analysis/multifileClasses/kt16077.txt b/compiler/testData/codegen/light-analysis/multifileClasses/kt16077.txt new file mode 100644 index 00000000000..bcac81b3d8b --- /dev/null +++ b/compiler/testData/codegen/light-analysis/multifileClasses/kt16077.txt @@ -0,0 +1,12 @@ +@kotlin.Metadata +public final class A { + private field r: java.lang.String + public method (): void + public final @org.jetbrains.annotations.NotNull method getR(): java.lang.String +} + +@kotlin.Metadata +@kotlin.jvm.JvmMultifileClass +public final class Kt16077Kt { + public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String +} 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 40b4e0ba438..bdbd711a286 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 @@ -10787,6 +10787,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("kt16077.kt") + public void testKt16077() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); + doTest(fileName); + } + @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index fd4cacdd2da..256df83e345 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -10787,6 +10787,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt16077.kt") + public void testKt16077() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); + doTest(fileName); + } + @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt"); 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 542611661d3..bbad33a0d6e 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 @@ -12366,6 +12366,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); } + @TestMetadata("kt16077.kt") + public void testKt16077() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/kt16077.kt"); + try { + doTest(fileName); + } + catch (Throwable ignore) { + return; + } + throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that."); + } + @TestMetadata("multifileClassPartsInitialization.kt") public void testMultifileClassPartsInitialization() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt");