From 31996f11395467878482ab967942995ee3699d81 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Thu, 1 Mar 2018 17:58:19 +0300 Subject: [PATCH] Update "defaultness" for property accessor with inherited visibility Property accessor that overrides a non-default property accessor with visibility different from the property visibility was incorrectly considered "default". Corresponding metadata was written incorrectly, and 'internal' setter call caused NSME #KT-23044 Fixed Target versions 1.2.40 --- .../internalSetterOverridden.kt | 16 ++++++++++++++++ .../CompileKotlinAgainstKotlinTestGenerated.java | 6 ++++++ .../impl/PropertyAccessorDescriptorImpl.java | 6 +++++- .../jetbrains/kotlin/resolve/OverridingUtil.java | 6 +++++- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/compileKotlinAgainstKotlin/internalSetterOverridden.kt diff --git a/compiler/testData/compileKotlinAgainstKotlin/internalSetterOverridden.kt b/compiler/testData/compileKotlinAgainstKotlin/internalSetterOverridden.kt new file mode 100644 index 00000000000..fc975a74458 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/internalSetterOverridden.kt @@ -0,0 +1,16 @@ +// FILE: A.kt +abstract class Base { + abstract var x: String + internal set +} + +class Derived: Base() { + override var x: String = "Z" +} + +// FILE: B.kt +fun box(): String { + val d = Derived() + d.x = "OK" + return d.x +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index aafe089d2e1..cdba3946f33 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -133,6 +133,12 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl doTest(fileName); } + @TestMetadata("internalSetterOverridden.kt") + public void testInternalSetterOverridden() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/internalSetterOverridden.kt"); + doTest(fileName); + } + @TestMetadata("jvmField.kt") public void testJvmField() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java index 1aa60bbbf6c..6ceca0e4b35 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/PropertyAccessorDescriptorImpl.java @@ -29,7 +29,7 @@ import java.util.Collections; import java.util.List; public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescriptorNonRootImpl implements PropertyAccessorDescriptor { - private final boolean isDefault; + private boolean isDefault; private final boolean isExternal; private final Modality modality; private final PropertyDescriptor correspondingProperty; @@ -66,6 +66,10 @@ public abstract class PropertyAccessorDescriptorImpl extends DeclarationDescript return isDefault; } + public void setDefault(boolean aDefault) { + isDefault = aDefault; + } + @NotNull @Override public Kind getKind() { diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index b558d9e7bd6..8b055966b05 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -840,7 +840,11 @@ public class OverridingUtil { } else { assert memberDescriptor instanceof PropertyAccessorDescriptorImpl; - ((PropertyAccessorDescriptorImpl) memberDescriptor).setVisibility(visibilityToInherit); + PropertyAccessorDescriptorImpl propertyAccessorDescriptor = (PropertyAccessorDescriptorImpl) memberDescriptor; + propertyAccessorDescriptor.setVisibility(visibilityToInherit); + if (visibilityToInherit != propertyAccessorDescriptor.getCorrespondingProperty().getVisibility()) { + propertyAccessorDescriptor.setDefault(false); + } } }