diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java index 6b2659d9af9..6fadb01c8ea 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/context/Namer.java @@ -24,6 +24,8 @@ import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.plugin.JetLanguage; +import java.util.List; + /** * Encapuslates different types of constants and naming conventions. */ @@ -271,18 +273,18 @@ public final class Namer { } @NotNull - public JsInvocation classCreateInvocation(@NotNull ClassDescriptor descriptor) { + public JsInvocation classCreateInvocation(@NotNull ClassDescriptor descriptor, @NotNull List arguments) { switch (descriptor.getKind()) { case TRAIT: - return new JsInvocation(traitCreationMethodReference()); + return new JsInvocation(traitCreationMethodReference(), arguments); case OBJECT: case CLASS_OBJECT: case ENUM_ENTRY: - return new JsInvocation(objectCreationMethodReference()); + return new JsInvocation(objectCreationMethodReference(), arguments); default: - return new JsInvocation(classCreationMethodReference()); + return new JsInvocation(classCreationMethodReference(), arguments); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java index a8cfd323590..8f5732d0c1e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/ClassTranslator.java @@ -124,23 +124,17 @@ public final class ClassTranslator extends AbstractTranslator { @NotNull public JsInvocation translate(@NotNull TranslationContext declarationContext) { - JsInvocation createInvocation = context().namer().classCreateInvocation(descriptor); - translate(createInvocation, declarationContext); - return createInvocation; - } - - private void translate(@NotNull JsInvocation createInvocation, @NotNull TranslationContext context) { - addSuperclassReferences(createInvocation); - addClassOwnDeclarations(createInvocation.getArguments(), context); + return context().namer().classCreateInvocation(descriptor, getClassCreateInvocationArguments(declarationContext)); } private boolean isTrait() { return descriptor.getKind().equals(ClassKind.TRAIT); } - private void addClassOwnDeclarations(@NotNull List invocationArguments, @NotNull TranslationContext declarationContext) { - final List properties = new SmartList(); + private List getClassCreateInvocationArguments(@NotNull TranslationContext declarationContext) { + List invocationArguments = new ArrayList(); + final List properties = new SmartList(); final List staticProperties = new SmartList(); boolean isTopLevelDeclaration = context() == declarationContext; final JsNameRef qualifiedReference; @@ -170,6 +164,7 @@ public final class ClassTranslator extends AbstractTranslator { }); } + invocationArguments.add(getSuperclassReferences()); if (!isTrait()) { JsFunction initializer = new ClassInitializerTranslator(classDeclaration, declarationContext).generateInitializeMethod(); invocationArguments.add(initializer.getBody().getStatements().isEmpty() ? JsLiteral.NULL : initializer); @@ -201,6 +196,7 @@ public final class ClassTranslator extends AbstractTranslator { invocationArguments.add(new JsDocComment(JsAstUtils.LENDS_JS_DOC_TAG, qualifiedReference)); invocationArguments.add(new JsObjectLiteral(staticProperties, true)); } + return invocationArguments; } private void mayBeAddEnumEntry(@NotNull List enumEntryList, @@ -218,25 +214,16 @@ public final class ClassTranslator extends AbstractTranslator { } } - private void addSuperclassReferences(@NotNull JsInvocation jsClassDeclaration) { + private JsExpression getSuperclassReferences() { List superClassReferences = getSupertypesNameReferences(); if (superClassReferences.isEmpty()) { - jsClassDeclaration.getArguments().add(JsLiteral.NULL); - return; + return JsLiteral.NULL; } - - List expressions; - if (superClassReferences.size() > 1) { - JsArrayLiteral arrayLiteral = new JsArrayLiteral(); - jsClassDeclaration.getArguments().add(arrayLiteral); - expressions = arrayLiteral.getExpressions(); + else if (superClassReferences.size() == 1) { + return superClassReferences.get(0); } else { - expressions = jsClassDeclaration.getArguments(); - } - - for (JsExpression superClassReference : superClassReferences) { - expressions.add(superClassReference); + return new JsArrayLiteral(superClassReferences); } }