createNamespace: don't produce empty object literal if properties are empty or empty function if there is no initializer
This commit is contained in:
+8
-9
@@ -29,6 +29,7 @@ import org.jetbrains.k2js.translate.initializer.InitializerUtils;
|
|||||||
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
|
import org.jetbrains.k2js.translate.utils.JsDescriptorUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.jetbrains.k2js.translate.utils.JsAstUtils.newObjectLiteral;
|
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());
|
JsFunction initializer = Translation.generateNamespaceInitializerMethod(descriptor, context());
|
||||||
List<JsPropertyInitializer> properties = new DeclarationBodyVisitor().traverseNamespace(descriptor, context());
|
List<JsPropertyInitializer> properties = new DeclarationBodyVisitor().traverseNamespace(descriptor, context());
|
||||||
if (context().isEcma5()) {
|
if (context().isEcma5()) {
|
||||||
addEcma5InitializersAndProperties(namespaceDeclaration, initializer, properties);
|
addEcma5InitializersAndProperties(namespaceDeclaration.getArguments(), initializer, properties);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
addEcma3InitializersAndProperties(namespaceDeclaration, initializer, properties);
|
addEcma3InitializersAndProperties(namespaceDeclaration, initializer, properties);
|
||||||
@@ -96,11 +97,11 @@ public final class NamespaceTranslator extends AbstractTranslator {
|
|||||||
namespaceDeclaration.getArguments().add(newObjectLiteral(propertyList));
|
namespaceDeclaration.getArguments().add(newObjectLiteral(propertyList));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addEcma5InitializersAndProperties(@NotNull JsInvocation namespaceDeclaration,
|
private void addEcma5InitializersAndProperties(@NotNull List<JsExpression> expressions,
|
||||||
@NotNull JsFunction initializer,
|
@NotNull JsFunction initializer,
|
||||||
@NotNull List<JsPropertyInitializer> properties) {
|
@NotNull List<JsPropertyInitializer> properties) {
|
||||||
namespaceDeclaration.getArguments().add(initializer);
|
expressions.add(initializer.getBody().getStatements().isEmpty() ? context().program().getNullLiteral() : initializer);
|
||||||
namespaceDeclaration.getArguments().add(newObjectLiteral(properties));
|
expressions.add(properties.isEmpty() ? context().program().getNullLiteral() : newObjectLiteral(properties));
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -111,10 +112,8 @@ public final class NamespaceTranslator extends AbstractTranslator {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private JsObjectLiteral getClassesAndNestedNamespaces() {
|
private JsObjectLiteral getClassesAndNestedNamespaces() {
|
||||||
JsObjectLiteral classesAndNestedNamespaces = new JsObjectLiteral();
|
JsObjectLiteral classesAndNestedNamespaces = new JsObjectLiteral();
|
||||||
classesAndNestedNamespaces.getPropertyInitializers()
|
classesAndNestedNamespaces.getPropertyInitializers().addAll(getClassesDefined());
|
||||||
.addAll(getClassesDefined());
|
classesAndNestedNamespaces.getPropertyInitializers().addAll(getNestedNamespaceDeclarations());
|
||||||
classesAndNestedNamespaces.getPropertyInitializers()
|
|
||||||
.addAll(getNestedNamespaceDeclarations());
|
|
||||||
return classesAndNestedNamespaces;
|
return classesAndNestedNamespaces;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +125,7 @@ public final class NamespaceTranslator extends AbstractTranslator {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private List<JsPropertyInitializer> getNestedNamespaceDeclarations() {
|
private List<JsPropertyInitializer> getNestedNamespaceDeclarations() {
|
||||||
if (DescriptorUtils.isRootNamespace(descriptor)) {
|
if (DescriptorUtils.isRootNamespace(descriptor)) {
|
||||||
return Lists.newArrayList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
List<JsPropertyInitializer> result = Lists.newArrayList();
|
List<JsPropertyInitializer> result = Lists.newArrayList();
|
||||||
List<NamespaceDescriptor> nestedNamespaces = JsDescriptorUtils.getNestedNamespaces(descriptor);
|
List<NamespaceDescriptor> nestedNamespaces = JsDescriptorUtils.getNestedNamespaces(descriptor);
|
||||||
|
|||||||
@@ -110,9 +110,12 @@ var Kotlin = {};
|
|||||||
return o;
|
return o;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function emptyFunction() {
|
||||||
|
}
|
||||||
|
|
||||||
Kotlin.createNamespace = function (initializer, properties, classesAndNestedNamespaces) {
|
Kotlin.createNamespace = function (initializer, properties, classesAndNestedNamespaces) {
|
||||||
var o = Object.create(null, properties || undefined);
|
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);
|
var keys = Object.keys(classesAndNestedNamespaces);
|
||||||
for (var i = 0, n = keys.length; i < n; i++) {
|
for (var i = 0, n = keys.length; i < n; i++) {
|
||||||
var name = keys[i];
|
var name = keys[i];
|
||||||
|
|||||||
Reference in New Issue
Block a user