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
This commit is contained in:
Dmitry Petrov
2018-03-01 17:58:19 +03:00
parent 8e8c5fae01
commit 31996f1139
4 changed files with 32 additions and 2 deletions
@@ -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
}
@@ -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");
@@ -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() {
@@ -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);
}
}
}