Test and fix for abstract var overriding.

This commit is contained in:
pTalanov
2012-03-01 16:22:41 +04:00
parent 60732c734d
commit 256b813edb
4 changed files with 59 additions and 13 deletions
@@ -55,6 +55,10 @@ public final class ClassInheritanceTest extends TranslationTest {
public void testDefinitionOrder() throws Exception {
checkFooBoxIsTrue("definitionOrder.kt");
}
public void testAbstractVarOverride() throws Exception {
checkFooBoxIsTrue("abstractVarOverride.kt");
}
}
@@ -30,7 +30,6 @@ import org.jetbrains.k2js.translate.utils.AnnotationsUtils;
import org.jetbrains.k2js.translate.utils.PredefinedAnnotation;
import java.util.Map;
import java.util.Set;
import static org.jetbrains.k2js.translate.utils.AnnotationsUtils.*;
import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*;
@@ -258,18 +257,14 @@ public final class StaticContext {
@Override
public JsName apply(@NotNull DeclarationDescriptor descriptor) {
//TODO: refactor
if (descriptor instanceof FunctionDescriptor) {
Set<? extends FunctionDescriptor> overriddenDescriptors = ((FunctionDescriptor) descriptor).getOverriddenDescriptors();
if (overriddenDescriptors.isEmpty()) {
return null;
}
else {
//assert overriddenDescriptors.size() == 1;
//TODO: for now translator can't deal with multiple inheritance good enough
return getNameForDescriptor(overriddenDescriptors.iterator().next());
}
if (!(descriptor instanceof FunctionDescriptor)) {
return null;
}
return null;
FunctionDescriptor overriddenDescriptor = getOverriddenDescriptor((FunctionDescriptor) descriptor);
if (overriddenDescriptor == null) {
return null;
}
return getNameForDescriptor(overriddenDescriptor);
}
};
addRule(namesForStandardClasses);
@@ -278,8 +273,8 @@ public final class StaticContext {
addRule(toStringHack);
addRule(propertiesCorrespondToSpeciallyTreatedBackingFieldNames);
addRule(namespacesShouldBeDefinedInRootScope);
addRule(accessorsHasNamesWithSpecialPrefixes);
addRule(overridingDescriptorsReferToOriginalName);
addRule(accessorsHasNamesWithSpecialPrefixes);
addRule(memberDeclarationsInsideParentsScope);
}
}
@@ -219,5 +219,27 @@ public final class DescriptorUtils {
return classDescriptors;
}
@Nullable
public static FunctionDescriptor getOverriddenDescriptor(@NotNull FunctionDescriptor functionDescriptor) {
Set<? extends FunctionDescriptor> overriddenDescriptors = functionDescriptor.getOverriddenDescriptors();
if (overriddenDescriptors.isEmpty()) {
return null;
}
else {
//TODO: for now translator can't deal with multiple inheritance good enough
return overriddenDescriptors.iterator().next();
}
}
//TODO:?
// @NotNull
// public static FunctionDescriptor getOverriddenOrThis(@NotNull FunctionDescriptor functionDescriptor) {
// FunctionDescriptor overriddenDescriptor = getOverriddenDescriptor(functionDescriptor);
// if (overriddenDescriptor != null) {
// return overriddenDescriptor;
// }
// else {
// return functionDescriptor;
// }
// }
}
@@ -0,0 +1,25 @@
package foo
open abstract class A() {
abstract var pos : Int;
}
class B() : A() {
override var pos : Int = 2
}
fun box() : Boolean {
val a : A = B()
if (a.pos != 2) {
return false;
}
if (B().pos != 2) {
return false;
}
a.pos = 3;
if (a.pos != 3) {
return false
}
return true
}