diff --git a/js/js.tests/test/org/jetbrains/k2js/test/ClassInheritanceTest.java b/js/js.tests/test/org/jetbrains/k2js/test/ClassInheritanceTest.java index 6ade4a83576..bc1c96ffa65 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/ClassInheritanceTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/ClassInheritanceTest.java @@ -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"); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java index b0b745f85b4..206de65642d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/StaticContext.java @@ -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 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); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java index c0110039fc4..e40673995ad 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/DescriptorUtils.java @@ -219,5 +219,27 @@ public final class DescriptorUtils { return classDescriptors; } + @Nullable + public static FunctionDescriptor getOverriddenDescriptor(@NotNull FunctionDescriptor functionDescriptor) { + Set 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; +// } +// } } diff --git a/js/js.translator/testFiles/inheritance/cases/abstractVarOverride.kt b/js/js.translator/testFiles/inheritance/cases/abstractVarOverride.kt new file mode 100644 index 00000000000..19e92f0cf7e --- /dev/null +++ b/js/js.translator/testFiles/inheritance/cases/abstractVarOverride.kt @@ -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 +} \ No newline at end of file