diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java index 9aeab9dc4eb..6d1308ed709 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyCodegen.java @@ -114,7 +114,7 @@ public class PropertyCodegen { assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.DEFAULT_IMPLS : "Generating property with a wrong kind (" + kind + "): " + descriptor; - if (CodegenContextUtil.isImplClassOwner(context)) { + if (isBackingFieldOwner(descriptor)) { assert declaration != null : "Declaration is null for different context: " + context; genBackingFieldAndAnnotations(declaration, descriptor, false); @@ -128,6 +128,13 @@ public class PropertyCodegen { } } + private boolean isBackingFieldOwner(@NotNull PropertyDescriptor descriptor) { + if (descriptor.isConst()) { + return !(context instanceof MultifileClassPartContext); + } + return CodegenContextUtil.isImplClassOwner(context); + } + private void genBackingFieldAndAnnotations(@NotNull KtNamedDeclaration declaration, @NotNull PropertyDescriptor descriptor, boolean isParameter) { boolean hasBackingField = hasBackingField(declaration, descriptor); boolean hasDelegate = declaration instanceof KtProperty && ((KtProperty) declaration).hasDelegate(); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java index c35e581a5cd..6038fbf6d04 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/JetTypeMapper.java @@ -159,7 +159,7 @@ public class JetTypeMapper { if (file != null) { Visibility visibility = descriptor.getVisibility(); if (!publicFacade || - descriptor instanceof PropertyDescriptor || + isNonConstProperty(descriptor) || Visibilities.isPrivate(visibility) || isAccessor/*Cause of KT-9603*/ ) { @@ -181,6 +181,12 @@ public class JetTypeMapper { " in package fragment " + descriptor.getContainingDeclaration()); } + private static boolean isNonConstProperty(@NotNull CallableMemberDescriptor descriptor) { + if (!(descriptor instanceof PropertyDescriptor)) return false; + PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor; + return !propertyDescriptor.isConst(); + } + public static class ContainingClassesInfo { private final ClassId facadeClassId; private final ClassId implClassId; diff --git a/compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.1.kt b/compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.1.kt new file mode 100644 index 00000000000..5209a8c94e9 --- /dev/null +++ b/compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.1.kt @@ -0,0 +1,3 @@ +import a.OK + +fun box(): String = OK \ No newline at end of file diff --git a/compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.2.kt b/compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.2.kt new file mode 100644 index 00000000000..4d04d8f62b4 --- /dev/null +++ b/compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.2.kt @@ -0,0 +1,4 @@ +@file:[JvmName("MultifileClass") JvmMultifileClass] +package a + +const val OK: String = "OK" \ No newline at end of file diff --git a/compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.1.kt b/compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.1.kt new file mode 100644 index 00000000000..91ed9e2a3db --- /dev/null +++ b/compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.1.kt @@ -0,0 +1,14 @@ +import a.OK + +fun box(): String { + val okRef = ::OK + + // TODO +// val annotations = okRef.annotations +// val numAnnotations = annotations.size +// if (numAnnotations != 1) { +// return "Failed, annotations: $annotations" +// } + + return okRef.get() +} \ No newline at end of file diff --git a/compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.2.kt b/compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.2.kt new file mode 100644 index 00000000000..d3e44105b0c --- /dev/null +++ b/compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.2.kt @@ -0,0 +1,7 @@ +@file:[JvmName("MultifileClass") JvmMultifileClass] +package a + +annotation class A + +@A +const val OK: String = "OK" \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/BlackBoxMultifileClassKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/BlackBoxMultifileClassKotlinTestGenerated.java index 3c4106ae703..263808acba7 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/BlackBoxMultifileClassKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/BlackBoxMultifileClassKotlinTestGenerated.java @@ -49,6 +49,12 @@ public class BlackBoxMultifileClassKotlinTestGenerated extends AbstractBlackBoxM doTestMultifileClassAgainstSources(fileName); } + @TestMetadata("constFromOtherPackage.1.kt") + public void testConstFromOtherPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.1.kt"); + doTestMultifileClassAgainstSources(fileName); + } + @TestMetadata("valFromOtherPackage.1.kt") public void testValFromOtherPackage() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultifileClasses/calls/valFromOtherPackage.1.kt"); @@ -61,4 +67,19 @@ public class BlackBoxMultifileClassKotlinTestGenerated extends AbstractBlackBoxM doTestMultifileClassAgainstSources(fileName); } } + + @TestMetadata("compiler/testData/codegen/boxMultifileClasses/reflection") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Reflection extends AbstractBlackBoxMultifileClassCodegenTest { + public void testAllFilesPresentInReflection() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxMultifileClasses/reflection"), Pattern.compile("^(.+)\\.1.kt$"), true); + } + + @TestMetadata("constFromMultifileClass.1.kt") + public void testConstFromMultifileClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.1.kt"); + doTestMultifileClassAgainstSources(fileName); + } + } } diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstMultifileKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstMultifileKotlinTestGenerated.java index 449bb1a2a72..6452fa4083f 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstMultifileKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/CompileKotlinAgainstMultifileKotlinTestGenerated.java @@ -49,6 +49,12 @@ public class CompileKotlinAgainstMultifileKotlinTestGenerated extends AbstractCo doBoxTest(fileName); } + @TestMetadata("constFromOtherPackage.1.kt") + public void testConstFromOtherPackage() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultifileClasses/calls/constFromOtherPackage.1.kt"); + doBoxTest(fileName); + } + @TestMetadata("valFromOtherPackage.1.kt") public void testValFromOtherPackage() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultifileClasses/calls/valFromOtherPackage.1.kt"); @@ -61,4 +67,19 @@ public class CompileKotlinAgainstMultifileKotlinTestGenerated extends AbstractCo doBoxTest(fileName); } } + + @TestMetadata("compiler/testData/codegen/boxMultifileClasses/reflection") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Reflection extends AbstractCompileKotlinAgainstMultifileKotlinTest { + public void testAllFilesPresentInReflection() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/boxMultifileClasses/reflection"), Pattern.compile("^(.+)\\.1.kt$"), true); + } + + @TestMetadata("constFromMultifileClass.1.kt") + public void testConstFromMultifileClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxMultifileClasses/reflection/constFromMultifileClass.1.kt"); + doBoxTest(fileName); + } + } }