diff --git a/js/src/com/google/dart/compiler/util/AstUtil.java b/js/src/com/google/dart/compiler/util/AstUtil.java index 0b3e8768205..2ea618c8bea 100644 --- a/js/src/com/google/dart/compiler/util/AstUtil.java +++ b/js/src/com/google/dart/compiler/util/AstUtil.java @@ -262,4 +262,10 @@ public class AstUtil { result.setQualifier(new JsThisRef()); return result; } + + public static JsBlock newBlock(List statements) { + JsBlock result = new JsBlock(); + result.setStatements(statements); + return result; + } } diff --git a/translator/src/org/jetbrains/k2js/translate/BindingUtils.java b/translator/src/org/jetbrains/k2js/translate/BindingUtils.java index 8fb2688aea4..5e936dca416 100644 --- a/translator/src/org/jetbrains/k2js/translate/BindingUtils.java +++ b/translator/src/org/jetbrains/k2js/translate/BindingUtils.java @@ -101,6 +101,10 @@ public final class BindingUtils { return superClassDescriptors; } + static public boolean hasAncestor(@NotNull BindingContext context, @NotNull JetClass classDeclaration) { + return !getSuperclassDescriptors(context, classDeclaration).isEmpty(); + } + static public boolean isStatement(@NotNull BindingContext context, @NotNull JetExpression expression) { return context.get(BindingContext.STATEMENT, expression); } diff --git a/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java b/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java index d17cdb011a8..0695a0e8577 100644 --- a/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java +++ b/translator/src/org/jetbrains/k2js/translate/ClassTranslator.java @@ -73,6 +73,7 @@ public final class ClassTranslator extends AbstractTranslator { return new JsObjectLiteral(propertyList); } + // TODO: names are inconsistent @NotNull private JsPropertyInitializer generateInitializeMethod(@NotNull JetClass classDeclaration) { JsPropertyInitializer initializer = new JsPropertyInitializer(); diff --git a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java index b3879ed68cd..a58867ffb57 100644 --- a/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java +++ b/translator/src/org/jetbrains/k2js/translate/InitializerVisitor.java @@ -43,10 +43,22 @@ public class InitializerVisitor extends TranslatorVisitor> { @NotNull private JsBlock generateInitializerMethodBody(@NotNull JetClass classDeclaration, @NotNull TranslationContext context) { - List initializerStatements = classDeclaration.accept(this, context); - JsBlock block = new JsBlock(); - block.setStatements(initializerStatements); - return block; + + List initializerStatements = generateCallToSuperMethod(classDeclaration, context); + initializerStatements.addAll(classDeclaration.accept(this, context)); + return AstUtil.newBlock(initializerStatements); + } + + @NotNull + private List generateCallToSuperMethod(@NotNull JetClass classDeclaration, + @NotNull TranslationContext context) { + List result = new ArrayList(); + if (BindingUtils.hasAncestor(context.bindingContext(), classDeclaration)) { + JsName superMethodName = initializerMethodScope.declareName(Namer.SUPER_METHOD_NAME); + result.add(AstUtil.convertToStatement + (AstUtil.newInvocation(AstUtil.thisQualifiedReference(superMethodName)))); + } + return result; } diff --git a/translator/src/org/jetbrains/k2js/translate/Namer.java b/translator/src/org/jetbrains/k2js/translate/Namer.java index f2e1ce99d50..c792d03fd70 100644 --- a/translator/src/org/jetbrains/k2js/translate/Namer.java +++ b/translator/src/org/jetbrains/k2js/translate/Namer.java @@ -22,6 +22,7 @@ public final class Namer { private static final String SETTER_PREFIX = "set_"; private static final String GETTER_PREFIX = "get_"; private static final String BACKING_FIELD_PREFIX = "$"; + public static final String SUPER_METHOD_NAME = "super_init"; // public static final String DEFAULT_SETTER_PARAM_NAME = "val"; public static String getClassObjectName() { diff --git a/translator/src/org/jetbrains/k2js/translate/OperatorTable.java b/translator/src/org/jetbrains/k2js/translate/OperatorTable.java index 0e8e8b7e064..d9970e7122a 100644 --- a/translator/src/org/jetbrains/k2js/translate/OperatorTable.java +++ b/translator/src/org/jetbrains/k2js/translate/OperatorTable.java @@ -37,7 +37,7 @@ public final class OperatorTable { binaryOperatorsMap.put(JetTokens.GTEQ, JsBinaryOperator.GTE); binaryOperatorsMap.put(JetTokens.LT, JsBinaryOperator.LT); binaryOperatorsMap.put(JetTokens.LTEQ, JsBinaryOperator.LTE); - binaryOperatorsMap.put(JetTokens.EQEQ, JsBinaryOperator.EQ); + binaryOperatorsMap.put(JetTokens.EQEQ, JsBinaryOperator.REF_EQ); binaryOperatorsMap.put(JetTokens.ANDAND, JsBinaryOperator.AND); binaryOperatorsMap.put(JetTokens.EXCLEQ, JsBinaryOperator.NEQ); binaryOperatorsMap.put(JetTokens.PERC, JsBinaryOperator.MOD); diff --git a/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java b/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java index 958c506686a..e041b04c3b0 100644 --- a/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java +++ b/translator/test/org/jetbrains/k2js/test/ClassInheritanceTest.java @@ -23,6 +23,11 @@ public final class ClassInheritanceTest extends AbstractClassTest { public void methodOverride() throws Exception { testFooBoxIsTrue("methodOverride.kt"); } + + @Test + public void initializationOrder() throws Exception { + testFooBoxIsTrue("initializationOrder.kt"); + } } diff --git a/translator/testFiles/inheritance/cases/initializationOrder.kt b/translator/testFiles/inheritance/cases/initializationOrder.kt new file mode 100644 index 00000000000..8fdf3da6347 --- /dev/null +++ b/translator/testFiles/inheritance/cases/initializationOrder.kt @@ -0,0 +1,26 @@ +namespace foo + +open class A() { + + var order = "" + { + order = order + "A" + } +} + +open class B() : A() { + { + order = order + "B" + } + +} + +class C() : B() { + { + order = order + "C" + } +} + +fun box() : Boolean { + return (C().order == "ABC") && (B().order == "AB") && (A().order == "A") +} \ No newline at end of file diff --git a/translator/testFiles/kotlin_lib.js b/translator/testFiles/kotlin_lib.js index c9b45fdd90e..f0b131b734b 100644 --- a/translator/testFiles/kotlin_lib.js +++ b/translator/testFiles/kotlin_lib.js @@ -24,9 +24,7 @@ var Class = (function() { parent = properties.shift(); function klass() { - if (parent != null) { - parent.prototype.initialize.apply(this) - } + this.initializing = klass; this.initialize.apply(this, arguments); } @@ -40,6 +38,19 @@ var Class = (function() { parent.subclasses.push(klass); } + + if (parent != null) { + klass.addMethods( + { + 'super_init' : function () { + //if (this.initializing != null) { + this.initializing = this.initializing.superclass; + this.initializing.prototype.initialize.apply(this, arguments) + // } + } + }); + } + for (var i = 0, length = properties.length; i < length; i++) klass.addMethods(properties[i]);