From 17b4d4a9734ca0f120ccbc53f63303810ee68f4a Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Fri, 15 Dec 2017 16:15:52 +0300 Subject: [PATCH] Differentiate accessors by FieldAccessorKind Otherwise accessors for backing fields (as in '{ field }') clash with accessors for properties (as in '{ prop }'). #KT-21258 Fixed Target versions 1.2.30 --- .../kotlin/codegen/context/CodegenContext.java | 12 +++++++++--- .../box/syntheticAccessors/kt21258_indirect.kt | 8 ++++++++ .../codegen/box/syntheticAccessors/kt21258_simple.kt | 12 ++++++++++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../kotlin/codegen/BlackBoxCodegenTestGenerated.java | 12 ++++++++++++ .../codegen/LightAnalysisModeTestGenerated.java | 12 ++++++++++++ .../js/test/semantics/JsCodegenBoxTestGenerated.java | 12 ++++++++++++ 7 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt create mode 100644 compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java index c63772c8022..16296614fda 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/context/CodegenContext.java @@ -57,13 +57,16 @@ public abstract class CodegenContext { private static class AccessorKey { public final DeclarationDescriptor descriptor; public final ClassDescriptor superCallLabelTarget; + public final FieldAccessorKind fieldAccessorKind; public AccessorKey( @NotNull DeclarationDescriptor descriptor, - @Nullable ClassDescriptor superCallLabelTarget + @Nullable ClassDescriptor superCallLabelTarget, + @NotNull FieldAccessorKind fieldAccessorKind ) { this.descriptor = descriptor; this.superCallLabelTarget = superCallLabelTarget; + this.fieldAccessorKind = fieldAccessorKind; } @Override @@ -71,13 +74,16 @@ public abstract class CodegenContext { if (!(obj instanceof AccessorKey)) return false; AccessorKey other = (AccessorKey) obj; return descriptor.equals(other.descriptor) && + fieldAccessorKind == other.fieldAccessorKind && (superCallLabelTarget == null ? other.superCallLabelTarget == null : superCallLabelTarget.equals(other.superCallLabelTarget)); } @Override public int hashCode() { - return 31 * descriptor.hashCode() + (superCallLabelTarget == null ? 0 : superCallLabelTarget.hashCode()); + return 31 * descriptor.hashCode() + + fieldAccessorKind.hashCode() + + (superCallLabelTarget == null ? 0 : superCallLabelTarget.hashCode()); } @Override @@ -458,7 +464,7 @@ public abstract class CodegenContext { } D descriptor = (D) possiblySubstitutedDescriptor.getOriginal(); - AccessorKey key = new AccessorKey(descriptor, superCallTarget); + AccessorKey key = new AccessorKey(descriptor, superCallTarget, accessorKind); // NB should check for property accessor factory first (or change property accessor tracking under propertyAccessorFactory creation) if (propertyAccessorFactories.containsKey(key)) { diff --git a/compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt b/compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt new file mode 100644 index 00000000000..951d2ead0c9 --- /dev/null +++ b/compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt @@ -0,0 +1,8 @@ +class Foo { + private val fld: String = "O" + get() = { field }() + "K" + + val indirectFldGetter: () -> String = { fld } +} + +fun box() = Foo().indirectFldGetter() diff --git a/compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt b/compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt new file mode 100644 index 00000000000..df6d81ce1d2 --- /dev/null +++ b/compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt @@ -0,0 +1,12 @@ +class Foo { + private val fld: String = "O" + get() = { field }() + "K" + + val indirectFldGetter: () -> String = { fld } + + fun simpleFldGetter(): String { + return fld + } +} + +fun box() = Foo().simpleFldGetter() 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 56a1718d050..34ac5f6dd5c 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 @@ -20153,6 +20153,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes doTest(fileName); } + @TestMetadata("kt21258_indirect.kt") + public void testKt21258_indirect() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt"); + doTest(fileName); + } + + @TestMetadata("kt21258_simple.kt") + public void testKt21258_simple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt"); + doTest(fileName); + } + @TestMetadata("kt9717.kt") public void testKt9717() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 55cd45a07fa..3734990aab8 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -20153,6 +20153,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("kt21258_indirect.kt") + public void testKt21258_indirect() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt"); + doTest(fileName); + } + + @TestMetadata("kt21258_simple.kt") + public void testKt21258_simple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt"); + doTest(fileName); + } + @TestMetadata("kt9717.kt") public void testKt9717() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index eaf5febfcc0..15f2297f6de 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -20153,6 +20153,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes doTest(fileName); } + @TestMetadata("kt21258_indirect.kt") + public void testKt21258_indirect() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt"); + doTest(fileName); + } + + @TestMetadata("kt21258_simple.kt") + public void testKt21258_simple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt"); + doTest(fileName); + } + @TestMetadata("kt9717.kt") public void testKt9717() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.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 85e83aaf63d..c0d2725b018 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 @@ -23819,6 +23819,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { doTest(fileName); } + @TestMetadata("kt21258_indirect.kt") + public void testKt21258_indirect() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt"); + doTest(fileName); + } + + @TestMetadata("kt21258_simple.kt") + public void testKt21258_simple() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt"); + doTest(fileName); + } + @TestMetadata("kt9717.kt") public void testKt9717() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");