From bd2b01ac1c3ecbad123509226a70610e49317993 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 5 Nov 2015 12:34:21 +0300 Subject: [PATCH] Fix for KT-5150: Accessors for private methods are not generated for get/set conventions #KT-5150 Fixed --- .../kotlin/codegen/ExpressionCodegen.java | 2 +- .../jetbrains/kotlin/codegen/StackValue.java | 10 ++++----- .../codegen/box/private/arrayConvention.kt | 21 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 15 +++++++++++++ 4 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/codegen/box/private/arrayConvention.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index dcf30d235a7..18b50822bca 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -2357,7 +2357,7 @@ public class ExpressionCodegen extends KtVisitor impleme } @NotNull - private FunctionDescriptor accessibleFunctionDescriptor(@NotNull ResolvedCall resolvedCall) { + protected FunctionDescriptor accessibleFunctionDescriptor(@NotNull ResolvedCall resolvedCall) { FunctionDescriptor descriptor = (FunctionDescriptor) resolvedCall.getResultingDescriptor(); FunctionDescriptor originalIfSamAdapter = SamCodegenUtil.getOriginalIfSamAdapter(descriptor); if (originalIfSamAdapter != null) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java index 17ae92f2af8..875d3d24bbd 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/StackValue.java @@ -911,8 +911,6 @@ public abstract class StackValue { private final ExpressionCodegen codegen; private final ResolvedCall resolvedGetCall; private final ResolvedCall resolvedSetCall; - private final FunctionDescriptor setterDescriptor; - private final FunctionDescriptor getterDescriptor; public CollectionElement( @NotNull CollectionElementReceiver collectionElementReceiver, @@ -924,10 +922,10 @@ public abstract class StackValue { super(type, false, false, collectionElementReceiver, true); this.resolvedGetCall = resolvedGetCall; this.resolvedSetCall = resolvedSetCall; - this.setterDescriptor = resolvedSetCall == null ? null : resolvedSetCall.getResultingDescriptor(); - this.getterDescriptor = resolvedGetCall == null ? null : resolvedGetCall.getResultingDescriptor(); - this.setter = resolvedSetCall == null ? null : codegen.resolveToCallable(setterDescriptor, false, resolvedSetCall); - this.getter = resolvedGetCall == null ? null : codegen.resolveToCallable(getterDescriptor, false, resolvedGetCall); + this.setter = resolvedSetCall == null ? null : + codegen.resolveToCallable(codegen.accessibleFunctionDescriptor(resolvedSetCall), false, resolvedSetCall); + this.getter = resolvedGetCall == null ? null : + codegen.resolveToCallable(codegen.accessibleFunctionDescriptor(resolvedGetCall), false, resolvedGetCall); this.codegen = codegen; } diff --git a/compiler/testData/codegen/box/private/arrayConvention.kt b/compiler/testData/codegen/box/private/arrayConvention.kt new file mode 100644 index 00000000000..5d778552e83 --- /dev/null +++ b/compiler/testData/codegen/box/private/arrayConvention.kt @@ -0,0 +1,21 @@ +var result = "fail" + +private operator fun X.get(name: String) = name + "K" +private operator fun X.set(name: String, v: String) { + result = v +} + +class X { + fun test() : String { + if (this["O"] != "OK") return "fail 1: ${this["O"]}" + + this["O"] += "K" + if (result != "OKK") return "fail 2: ${result}" + + return "OK" + } +} + +fun box(): String { + return X().test() +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 9896bb533df..567a8c01032 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -6422,6 +6422,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } } + @TestMetadata("compiler/testData/codegen/box/private") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Private extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInPrivate() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/private"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("arrayConvention.kt") + public void testArrayConvention() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/private/arrayConvention.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/privateConstructors") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)