diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java index 42906d6e8ec..b79477df9e8 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/ClassInitializerTranslator.java @@ -64,7 +64,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { // for properties declared as constructor parameters setParameters(result, translatePrimaryConstructorParameters()); mayBeAddCallToSuperMethod(result); - initializerStatements.addAll(new InitializerVisitor().traverseClass(classDeclaration, context())); + (new InitializerVisitor(initializerStatements)).traverseClass(classDeclaration, context()); result.getBody().getStatements().addAll(initializerStatements); return result; } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java index 94af42771c9..6acbfc7434c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerUtils.java @@ -16,33 +16,30 @@ package org.jetbrains.k2js.translate.initializer; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsFunction; -import com.google.dart.compiler.backend.js.ast.JsPropertyInitializer; -import com.google.dart.compiler.backend.js.ast.JsStatement; +import com.google.dart.compiler.backend.js.ast.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.Named; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; -import org.jetbrains.k2js.translate.context.Namer; +import org.jetbrains.jet.lang.psi.JetObjectDeclaration; import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.declaration.ClassTranslator; import org.jetbrains.k2js.translate.utils.JsAstUtils; +import java.util.List; + +import static org.jetbrains.k2js.translate.utils.BindingUtils.getClassDescriptor; +import static org.jetbrains.k2js.translate.utils.JsAstUtils.assignment; import static org.jetbrains.k2js.translate.utils.TranslationUtils.assignmentToBackingField; /** * @author Pavel Talanov */ public final class InitializerUtils { - private InitializerUtils() { } - @NotNull - public static JsPropertyInitializer generateInitializeMethod(@NotNull JsFunction initializerFunction) { - JsPropertyInitializer initializer = new JsPropertyInitializer(Namer.initializeMethodReference()); - initializer.setValueExpr(initializerFunction); - return initializer; - } - @NotNull public static JsStatement generateInitializerForProperty(@NotNull TranslationContext context, @NotNull PropertyDescriptor descriptor, @@ -54,4 +51,38 @@ public final class InitializerUtils { return assignmentToBackingField(context, descriptor, value).makeStmt(); } } -} + + public static void generate(@NotNull JetObjectDeclaration declaration, + @NotNull List initializers, + @Nullable List definitions, + @NotNull TranslationContext context) { + ClassDescriptor descriptor = getClassDescriptor(context.bindingContext(), declaration); + JsExpression value = ClassTranslator.generateClassCreation(declaration, descriptor, context); + if (definitions != null && value instanceof JsLiteral) { + definitions.add(createPropertyInitializer(descriptor, value, context)); + } + else { + initializers.add(create(descriptor, value, context)); + } + } + + public static JsStatement create(Named named, JsExpression value, TranslationContext context) { + JsExpression expression; + if (context.isEcma5()) { + expression = JsAstUtils.defineProperty(named.getName().getName(), JsAstUtils.createDataDescriptor(value), context); + } + else { + expression = assignment(new JsNameRef(named.getName().getName(), JsLiteral.THIS), value); + } + return expression.makeStmt(); + } + + + public static JsExpression toDataDescriptor(JsExpression value, TranslationContext context) { + return context.isEcma5() ? JsAstUtils.createDataDescriptor(value) : value; + } + + public static JsPropertyInitializer createPropertyInitializer(Named named, JsExpression value, TranslationContext context) { + return new JsPropertyInitializer(context.nameToLiteral(named), toDataDescriptor(value, context)); + } +} \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java index e37ec14b97c..2f9bc8d34b5 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/InitializerVisitor.java @@ -16,90 +16,69 @@ package org.jetbrains.k2js.translate.initializer; -import com.google.common.collect.Lists; -import com.google.dart.compiler.backend.js.ast.JsExpression; -import com.google.dart.compiler.backend.js.ast.JsInvocation; import com.google.dart.compiler.backend.js.ast.JsStatement; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; -import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.k2js.translate.context.TranslationContext; -import org.jetbrains.k2js.translate.declaration.ClassTranslator; import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.TranslatorVisitor; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import static org.jetbrains.k2js.translate.general.Translation.translateAsStatement; -import static org.jetbrains.k2js.translate.utils.BindingUtils.*; -import static org.jetbrains.k2js.translate.utils.PsiUtils.getObjectDeclarationForName; +import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty; +import static org.jetbrains.k2js.translate.utils.BindingUtils.getPropertyDescriptor; /** * @author Pavel Talanov */ -public final class InitializerVisitor extends TranslatorVisitor> { +public final class InitializerVisitor extends TranslatorVisitor { + private final List result; + + public InitializerVisitor(List result) { + this.result = result; + } + @Override - @NotNull - public final List visitProperty(@NotNull JetProperty property, @NotNull TranslationContext context) { + public final Void visitProperty(@NotNull JetProperty property, @NotNull TranslationContext context) { JetExpression initializer = property.getInitializer(); - if (initializer == null) { - return Collections.emptyList(); + if (initializer != null) { + result.add(generateInitializerForProperty(context, getPropertyDescriptor(context.bindingContext(), property), + Translation.translateAsExpression(initializer, context))); } - return generateInitializerForProperty(getPropertyDescriptor(context.bindingContext(), property), - Translation.translateAsExpression(initializer, context), context); - } - - @NotNull - private static List generateInitializerForProperty(@NotNull PropertyDescriptor descriptor, - @NotNull JsExpression value, @NotNull TranslationContext context) { - return Collections.singletonList(InitializerUtils.generateInitializerForProperty(context, descriptor, value)); + return null; } @Override - @NotNull - public List visitAnonymousInitializer(@NotNull JetClassInitializer initializer, - @NotNull TranslationContext context) { - return Arrays.asList(translateAsStatement(initializer.getBody(), context)); + public Void visitAnonymousInitializer(@NotNull JetClassInitializer initializer, @NotNull TranslationContext context) { + result.add(translateAsStatement(initializer.getBody(), context)); + return null; } @Override - @NotNull // Not interested in other types of declarations, they do not contain initializers. - public List visitDeclaration(@NotNull JetDeclaration expression, @NotNull TranslationContext context) { - return Collections.emptyList(); + public Void visitDeclaration(@NotNull JetDeclaration expression, @NotNull TranslationContext context) { + return null; } @Override - @NotNull - public final List visitObjectDeclarationName(@NotNull JetObjectDeclarationName objectName, - @NotNull TranslationContext context) { - PropertyDescriptor propertyDescriptor = getPropertyDescriptorForObjectDeclaration(context.bindingContext(), objectName); - JetObjectDeclaration objectDeclaration = getObjectDeclarationForName(objectName); - JsExpression objectValue = ClassTranslator.generateClassCreationExpression(objectDeclaration, context); - return generateInitializerForProperty(propertyDescriptor, objectValue, context); + public Void visitObjectDeclaration(@NotNull JetObjectDeclaration declaration, @NotNull TranslationContext context) { + InitializerUtils.generate(declaration, result, null, context); + return null; } @NotNull private List generateInitializerStatements(@NotNull List declarations, @NotNull TranslationContext context) { - List statements = Lists.newArrayList(); for (JetDeclaration declaration : declarations) { - statements.addAll(declaration.accept(this, context)); + declaration.accept(this, context); } - return statements; + return result; } @NotNull public final List traverseClass(@NotNull JetClassOrObject expression, @NotNull TranslationContext context) { return generateInitializerStatements(expression.getDeclarations(), context); } - - @NotNull - public final List traverseNamespace(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { - return generateInitializerStatements(getDeclarationsForNamespace(context.bindingContext(), namespace), context); - } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java deleted file mode 100644 index 0ca8475c9ef..00000000000 --- a/js/js.translator/src/org/jetbrains/k2js/translate/initializer/NamespaceInitializerTranslator.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2010-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.k2js.translate.initializer; - -import com.google.dart.compiler.backend.js.ast.JsFunction; -import com.google.dart.compiler.backend.js.ast.JsStatement; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; -import org.jetbrains.k2js.translate.context.TranslationContext; -import org.jetbrains.k2js.translate.utils.JsAstUtils; - -import java.util.List; - -/** - * @author Pavel Talanov - */ -public final class NamespaceInitializerTranslator { - - @NotNull - private final NamespaceDescriptor namespace; - @NotNull - private final TranslationContext namespaceContext; - - public NamespaceInitializerTranslator(@NotNull NamespaceDescriptor namespace, @NotNull TranslationContext context) { - this.namespace = namespace; - this.namespaceContext = context; - } - - @NotNull - public JsFunction generateInitializeMethod() { - JsFunction result = JsAstUtils.createFunctionWithEmptyBody(namespaceContext.scope()); - TranslationContext namespaceInitializerContext - = namespaceContext.innerContextWithGivenScopeAndBlock(result.getScope(), result.getBody()); - - List initializerStatements = new InitializerVisitor().traverseNamespace(namespace, namespaceInitializerContext); - result.getBody().getStatements().addAll(initializerStatements); - return result; - } -} \ No newline at end of file