From cd067cb32c0244a52700bf5fefdda1c6c48325ec Mon Sep 17 00:00:00 2001 From: develar Date: Tue, 19 Jun 2012 16:14:52 +0400 Subject: [PATCH] createNamespace: don't produce empty object literal if properties are empty or empty function if there is no initializer --- .../declaration/NamespaceTranslator.java | 17 ++++++++--------- js/js.translator/testFiles/kotlin_lib_ecma5.js | 5 ++++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java index c75ae866ba2..8c81898db1d 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceTranslator.java @@ -29,6 +29,7 @@ import org.jetbrains.k2js.translate.initializer.InitializerUtils; import org.jetbrains.k2js.translate.utils.JsDescriptorUtils; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.utils.JsAstUtils.newObjectLiteral; @@ -80,7 +81,7 @@ public final class NamespaceTranslator extends AbstractTranslator { JsFunction initializer = Translation.generateNamespaceInitializerMethod(descriptor, context()); List properties = new DeclarationBodyVisitor().traverseNamespace(descriptor, context()); if (context().isEcma5()) { - addEcma5InitializersAndProperties(namespaceDeclaration, initializer, properties); + addEcma5InitializersAndProperties(namespaceDeclaration.getArguments(), initializer, properties); } else { addEcma3InitializersAndProperties(namespaceDeclaration, initializer, properties); @@ -96,11 +97,11 @@ public final class NamespaceTranslator extends AbstractTranslator { namespaceDeclaration.getArguments().add(newObjectLiteral(propertyList)); } - private static void addEcma5InitializersAndProperties(@NotNull JsInvocation namespaceDeclaration, + private void addEcma5InitializersAndProperties(@NotNull List expressions, @NotNull JsFunction initializer, @NotNull List properties) { - namespaceDeclaration.getArguments().add(initializer); - namespaceDeclaration.getArguments().add(newObjectLiteral(properties)); + expressions.add(initializer.getBody().getStatements().isEmpty() ? context().program().getNullLiteral() : initializer); + expressions.add(properties.isEmpty() ? context().program().getNullLiteral() : newObjectLiteral(properties)); } @NotNull @@ -111,10 +112,8 @@ public final class NamespaceTranslator extends AbstractTranslator { @NotNull private JsObjectLiteral getClassesAndNestedNamespaces() { JsObjectLiteral classesAndNestedNamespaces = new JsObjectLiteral(); - classesAndNestedNamespaces.getPropertyInitializers() - .addAll(getClassesDefined()); - classesAndNestedNamespaces.getPropertyInitializers() - .addAll(getNestedNamespaceDeclarations()); + classesAndNestedNamespaces.getPropertyInitializers().addAll(getClassesDefined()); + classesAndNestedNamespaces.getPropertyInitializers().addAll(getNestedNamespaceDeclarations()); return classesAndNestedNamespaces; } @@ -126,7 +125,7 @@ public final class NamespaceTranslator extends AbstractTranslator { @NotNull private List getNestedNamespaceDeclarations() { if (DescriptorUtils.isRootNamespace(descriptor)) { - return Lists.newArrayList(); + return Collections.emptyList(); } List result = Lists.newArrayList(); List nestedNamespaces = JsDescriptorUtils.getNestedNamespaces(descriptor); diff --git a/js/js.translator/testFiles/kotlin_lib_ecma5.js b/js/js.translator/testFiles/kotlin_lib_ecma5.js index 7eb31c14ebc..b97c3e2800f 100644 --- a/js/js.translator/testFiles/kotlin_lib_ecma5.js +++ b/js/js.translator/testFiles/kotlin_lib_ecma5.js @@ -110,9 +110,12 @@ var Kotlin = {}; return o; }; + function emptyFunction() { + } + Kotlin.createNamespace = function (initializer, properties, classesAndNestedNamespaces) { var o = Object.create(null, properties || undefined); - Object.defineProperty(o, "initialize", {value: initializer}); + Object.defineProperty(o, "initialize", {value: initializer || emptyFunction}); var keys = Object.keys(classesAndNestedNamespaces); for (var i = 0, n = keys.length; i < n; i++) { var name = keys[i];