createNamespace: don't produce empty object literal if properties are empty or empty function if there is no initializer

This commit is contained in:
develar
2012-06-19 16:14:52 +04:00
parent c7c7fda31e
commit cd067cb32c
2 changed files with 12 additions and 10 deletions
@@ -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<JsPropertyInitializer> 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<JsExpression> expressions,
@NotNull JsFunction initializer,
@NotNull List<JsPropertyInitializer> 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<JsPropertyInitializer> getNestedNamespaceDeclarations() {
if (DescriptorUtils.isRootNamespace(descriptor)) {
return Lists.newArrayList();
return Collections.emptyList();
}
List<JsPropertyInitializer> result = Lists.newArrayList();
List<NamespaceDescriptor> nestedNamespaces = JsDescriptorUtils.getNestedNamespaces(descriptor);
@@ -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];