Skip to content

Commit 6a68eb2

Browse files
committed
KT-16077 Redundant private getter for private var in a class within a JvmMultifileClass annotated file
1 parent c9df227 commit 6a68eb2

File tree

6 files changed

+57
-2
lines changed

6 files changed

+57
-2
lines changed

compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@
5757

5858
import static org.jetbrains.kotlin.codegen.AsmUtil.getDeprecatedAccessFlag;
5959
import static org.jetbrains.kotlin.codegen.AsmUtil.getVisibilityForBackingField;
60-
import static org.jetbrains.kotlin.codegen.AsmUtil.isPropertyWithBackingFieldCopyInOuterClass;
6160
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isConstOrHasJvmFieldAnnotation;
6261
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
6362
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.FIELD_FOR_PROPERTY;
@@ -189,7 +188,7 @@ private boolean isAccessorNeeded(
189188
if (isCompanionObject(descriptor.getContainingDeclaration())) return true;
190189

191190
// Non-const properties from multifile classes have accessors regardless of visibility
192-
if (!descriptor.isConst() && JvmFileClassUtilKt.isInsideJvmMultifileClassFile(declaration)) return true;
191+
if (isNonConstTopLevelPropertyInMultifileClass(declaration, descriptor)) return true;
193192

194193
// Private class properties have accessors only in cases when those accessors are non-trivial
195194
if (Visibilities.isPrivate(descriptor.getVisibility())) {
@@ -199,6 +198,15 @@ private boolean isAccessorNeeded(
199198
return true;
200199
}
201200

201+
private static boolean isNonConstTopLevelPropertyInMultifileClass(
202+
@NotNull KtProperty declaration,
203+
@NotNull PropertyDescriptor descriptor
204+
) {
205+
return !descriptor.isConst() &&
206+
descriptor.getContainingDeclaration() instanceof PackageFragmentDescriptor &&
207+
JvmFileClassUtilKt.isInsideJvmMultifileClassFile(declaration);
208+
}
209+
202210
private static boolean areAccessorsNeededForPrimaryConstructorProperty(
203211
@NotNull PropertyDescriptor descriptor
204212
) {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// IGNORE_BACKEND: JS
2+
// WITH_RUNTIME
3+
4+
@file:JvmMultifileClass
5+
6+
class A {
7+
private var r: String = "fail"
8+
public fun getR(): String = "OK"
9+
}
10+
11+
fun box() = A().getR()
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
@kotlin.Metadata
2+
public final class A {
3+
private field r: java.lang.String
4+
public method <init>(): void
5+
public final @org.jetbrains.annotations.NotNull method getR(): java.lang.String
6+
}
7+
8+
@kotlin.Metadata
9+
@kotlin.jvm.JvmMultifileClass
10+
public final class Kt16077Kt {
11+
public final static @org.jetbrains.annotations.NotNull method box(): java.lang.String
12+
}

compiler/tests-ir-jvm/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10787,6 +10787,12 @@ public void testInlineMultifileClassMemberFromOtherPackage() throws Exception {
1078710787
doTest(fileName);
1078810788
}
1078910789

10790+
@TestMetadata("kt16077.kt")
10791+
public void testKt16077() throws Exception {
10792+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/kt16077.kt");
10793+
doTest(fileName);
10794+
}
10795+
1079010796
@TestMetadata("multifileClassPartsInitialization.kt")
1079110797
public void testMultifileClassPartsInitialization() throws Exception {
1079210798
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt");

compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10787,6 +10787,12 @@ public void testInlineMultifileClassMemberFromOtherPackage() throws Exception {
1078710787
doTest(fileName);
1078810788
}
1078910789

10790+
@TestMetadata("kt16077.kt")
10791+
public void testKt16077() throws Exception {
10792+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/kt16077.kt");
10793+
doTest(fileName);
10794+
}
10795+
1079010796
@TestMetadata("multifileClassPartsInitialization.kt")
1079110797
public void testMultifileClassPartsInitialization() throws Exception {
1079210798
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt");

js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12366,6 +12366,18 @@ public void testInlineMultifileClassMemberFromOtherPackage() throws Exception {
1236612366
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
1236712367
}
1236812368

12369+
@TestMetadata("kt16077.kt")
12370+
public void testKt16077() throws Exception {
12371+
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/kt16077.kt");
12372+
try {
12373+
doTest(fileName);
12374+
}
12375+
catch (Throwable ignore) {
12376+
return;
12377+
}
12378+
throw new AssertionError("Looks like this test can be unmuted. Remove IGNORE_BACKEND directive for that.");
12379+
}
12380+
1236912381
@TestMetadata("multifileClassPartsInitialization.kt")
1237012382
public void testMultifileClassPartsInitialization() throws Exception {
1237112383
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/multifileClasses/multifileClassPartsInitialization.kt");

0 commit comments

Comments
 (0)