From f7164c5bfd0ce7c5c42d5ea7a032eeac2e55f3a9 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Mon, 12 Oct 2015 14:02:37 +0300 Subject: [PATCH] Don't rename class property with JvmField annotation, report clashing --- .../codegen/context/FieldOwnerContext.java | 5 ++++- .../jvmField/clashWithCompanionObjectField.kt | 8 ++++++++ .../jvmField/clashWithCompanionObjectField.txt | 17 +++++++++++++++++ .../JetDiagnosticsTestWithStdLibGenerated.java | 6 ++++++ 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.txt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/FieldOwnerContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/FieldOwnerContext.java index 4ad9d01c377..d36f6d14f6d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/FieldOwnerContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/FieldOwnerContext.java @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.codegen.state.JetTypeMapper; import org.jetbrains.kotlin.descriptors.ClassDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.PropertyDescriptor; +import org.jetbrains.kotlin.resolve.jvm.annotations.AnnotationsPackage; import java.util.HashMap; import java.util.Map; @@ -64,7 +65,9 @@ public abstract class FieldOwnerContext extends String actualName = descriptor2Name.get(descriptor); if (actualName != null) return actualName; - String newName = descriptor2Name.isEmpty() ? defaultPropertyName : defaultPropertyName + "$" + descriptor2Name.size(); + String newName = descriptor2Name.isEmpty() || AnnotationsPackage.hasJvmFieldAnnotation(descriptor) + ? defaultPropertyName + : defaultPropertyName + "$" + descriptor2Name.size(); descriptor2Name.put(descriptor, newName); return newName; } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.kt new file mode 100644 index 00000000000..68cf38def67 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.kt @@ -0,0 +1,8 @@ +class A { + + @JvmField val clash = 1; + + companion object { + val clash = 1; + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.txt new file mode 100644 index 00000000000..46f070e6847 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.txt @@ -0,0 +1,17 @@ +package + +public final class A { + public constructor A() + @kotlin.jvm.JvmField() public final val clash: kotlin.Int = 1 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public companion object Companion { + private constructor Companion() + public final val clash: kotlin.Int = 1 + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java index c61d40ac201..8c66268f1db 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithStdLibGenerated.java @@ -330,6 +330,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("clashWithCompanionObjectField.kt") + public void testClashWithCompanionObjectField() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/clashWithCompanionObjectField.kt"); + doTest(fileName); + } + @TestMetadata("inMultiFileFacade.kt") public void testInMultiFileFacade() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/jvmField/inMultiFileFacade.kt");