From 79904a9b963fe5f6a0f7879b0f6c38bde7a29d36 Mon Sep 17 00:00:00 2001 From: Erokhin Stanislav Date: Fri, 6 Sep 2013 08:26:04 +0400 Subject: [PATCH] JS backend: refactor: extract DefineInvocation --- .../declaration/DefineInvocation.java | 98 +++++++++++++++++++ .../NamespaceDeclarationTranslator.java | 27 +---- .../declaration/NamespaceTranslator.java | 46 +++++---- 3 files changed, 125 insertions(+), 46 deletions(-) create mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/declaration/DefineInvocation.java diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DefineInvocation.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DefineInvocation.java new file mode 100644 index 00000000000..6fbf09056d8 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/DefineInvocation.java @@ -0,0 +1,98 @@ +/* + * Copyright 2010-2013 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.declaration; + +import com.google.dart.compiler.backend.js.ast.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; +import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.utils.JsAstUtils; + +import java.util.AbstractList; +import java.util.List; + +public class DefineInvocation { + + /* package */ + @NotNull + static DefineInvocation createDefineInvocation( + @NotNull NamespaceDescriptor descriptor, + @Nullable JsExpression initializer, + @NotNull JsObjectLiteral members, + @NotNull TranslationContext context + ) { + return new DefineInvocation(initializer == null ? JsLiteral.NULL : initializer, + new JsDocComment(JsAstUtils.LENDS_JS_DOC_TAG, context.getQualifiedReference(descriptor)), + members); + } + + @NotNull + private JsExpression initializer; + @NotNull + private final JsDocComment jsDocComment; + @NotNull + private final JsObjectLiteral membersObjectLiteral; + + private DefineInvocation( + @NotNull JsExpression initializer, + @NotNull JsDocComment jsDocComment, + @NotNull JsObjectLiteral membersObjectLiteral + ) { + this.initializer = initializer; + this.jsDocComment = jsDocComment; + this.membersObjectLiteral = membersObjectLiteral; + } + + @NotNull + public JsExpression getInitializer() { + return initializer; + } + + public void setInitializer(@NotNull JsExpression initializer) { + this.initializer = initializer; + } + + @NotNull + public List getMembers() { + return membersObjectLiteral.getPropertyInitializers(); + } + + @NotNull + public List asList() { + return new AbstractList() { // because initializer is mutable + @Override + public JsExpression get(int index) { + switch (index) { + case 0: + return initializer; + case 1: + return jsDocComment; + case 2: + return membersObjectLiteral; + } + throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size()); + } + + @Override + public int size() { + return 3; + } + }; + } + +} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java index f57ac34285e..d83e4b4d767 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/declaration/NamespaceDeclarationTranslator.java @@ -19,7 +19,6 @@ package org.jetbrains.k2js.translate.declaration; import com.google.dart.compiler.backend.js.ast.*; import gnu.trove.THashMap; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -27,11 +26,11 @@ import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.k2js.translate.context.Namer; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; -import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.*; import static com.google.dart.compiler.backend.js.ast.JsVars.JsVar; +import static org.jetbrains.k2js.translate.declaration.DefineInvocation.createDefineInvocation; public final class NamespaceDeclarationTranslator extends AbstractTranslator { private final Iterable files; @@ -51,7 +50,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator { @NotNull private List translate() { // predictable order - Map> descriptorToDefineInvocation = new THashMap>(); + Map descriptorToDefineInvocation = new THashMap(); NamespaceDescriptor rootNamespaceDescriptor = null; for (JetFile file : files) { @@ -95,7 +94,7 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator { @NotNull private NamespaceDescriptor getRootPackageDescriptor( - @NotNull Map> descriptorToDefineInvocation, + @NotNull Map descriptorToDefineInvocation, @NotNull NamespaceDescriptor descriptor ) { NamespaceDescriptor rootNamespace = descriptor; @@ -107,24 +106,8 @@ public final class NamespaceDeclarationTranslator extends AbstractTranslator { return rootNamespace; } - static List createDefineInvocation( - @NotNull NamespaceDescriptor descriptor, - @Nullable JsExpression initializer, - @NotNull JsObjectLiteral members, - @NotNull TranslationContext context - ) { - if (context.isEcma5()) { - return Arrays.asList(initializer == null ? JsLiteral.NULL : initializer, - new JsDocComment(JsAstUtils.LENDS_JS_DOC_TAG, context.getQualifiedReference(descriptor)), - members); - } - else { - return Collections.singletonList(members); - } - } - - private JsVar getRootPackageDeclaration(@NotNull List defineInvocation) { - JsExpression rootPackageVar = new JsInvocation(context().namer().rootPackageDefinitionMethodReference(), defineInvocation); + private JsVar getRootPackageDeclaration(@NotNull DefineInvocation defineInvocation) { + JsExpression rootPackageVar = new JsInvocation(context().namer().rootPackageDefinitionMethodReference(), defineInvocation.asList()); return new JsVar(context().scope().declareName(Namer.getRootNamespaceName()), rootPackageVar); } } 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 cae80e1f35c..cb8bbd76c99 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 @@ -39,7 +39,7 @@ import org.jetbrains.k2js.translate.utils.JsAstUtils; import java.util.List; import java.util.Map; -import static org.jetbrains.k2js.translate.declaration.NamespaceDeclarationTranslator.createDefineInvocation; +import static org.jetbrains.k2js.translate.declaration.DefineInvocation.createDefineInvocation; import static org.jetbrains.k2js.translate.expression.LiteralFunctionTranslator.createPlace; import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForDelegate; import static org.jetbrains.k2js.translate.initializer.InitializerUtils.generateInitializerForProperty; @@ -55,7 +55,7 @@ final class NamespaceTranslator extends AbstractTranslator { NamespaceTranslator( @NotNull final NamespaceDescriptor descriptor, - @NotNull final Map> descriptorToDefineInvocation, + @NotNull final Map descriptorToDefineInvocation, @NotNull TranslationContext context ) { super(context.newDeclaration(descriptor)); @@ -68,12 +68,12 @@ final class NamespaceTranslator extends AbstractTranslator { @Override @NotNull public Trinity, LabelGenerator, JsExpression> compute() { - List defineInvocation = descriptorToDefineInvocation.get(descriptor); + DefineInvocation defineInvocation = descriptorToDefineInvocation.get(descriptor); if (defineInvocation == null) { defineInvocation = createDefinitionPlace(null, descriptorToDefineInvocation); } - return createPlace(getListFromPlace(defineInvocation), context().getQualifiedReference(descriptor)); + return createPlace(defineInvocation.getMembers(), context().getQualifiedReference(descriptor)); } }; } @@ -88,15 +88,17 @@ final class NamespaceTranslator extends AbstractTranslator { context().literalFunctionTranslator().setDefinitionPlace(null); } - private List createDefinitionPlace(@Nullable JsExpression initializer, - Map> descriptorToDefineInvocation) { - List place = createDefineInvocation(descriptor, initializer, new JsObjectLiteral(visitor.getResult(), true), context()); + private DefineInvocation createDefinitionPlace( + @Nullable JsExpression initializer, + Map descriptorToDefineInvocation + ) { + DefineInvocation place = createDefineInvocation(descriptor, initializer, new JsObjectLiteral(visitor.getResult(), true), context()); descriptorToDefineInvocation.put(descriptor, place); addToParent((NamespaceDescriptor) descriptor.getContainingDeclaration(), getEntry(descriptor, place), descriptorToDefineInvocation); return place; } - public void add(@NotNull Map> descriptorToDefineInvocation, + public void add(@NotNull Map descriptorToDefineInvocation, @NotNull List initializers) { JsExpression initializer; if (visitor.initializerStatements.isEmpty()) { @@ -110,19 +112,19 @@ final class NamespaceTranslator extends AbstractTranslator { } } - List defineInvocation = descriptorToDefineInvocation.get(descriptor); + DefineInvocation defineInvocation = descriptorToDefineInvocation.get(descriptor); if (defineInvocation == null) { if (initializer != null || !visitor.getResult().isEmpty()) { createDefinitionPlace(initializer, descriptorToDefineInvocation); } } else { - if (context().isEcma5() && initializer != null) { - assert defineInvocation.get(0) == JsLiteral.NULL; - defineInvocation.set(0, initializer); + if (initializer != null) { + assert defineInvocation.getInitializer() == JsLiteral.NULL; + defineInvocation.setInitializer(initializer); } - List listFromPlace = getListFromPlace(defineInvocation); + List listFromPlace = defineInvocation.getMembers(); // if equals, so, inner functions was added if (listFromPlace != visitor.getResult()) { listFromPlace.addAll(visitor.getResult()); @@ -130,21 +132,17 @@ final class NamespaceTranslator extends AbstractTranslator { } } - private List getListFromPlace(List defineInvocation) { - return ((JsObjectLiteral) defineInvocation.get(context().isEcma5() ? 2 : 0)).getPropertyInitializers(); - } - - private JsPropertyInitializer getEntry(@NotNull NamespaceDescriptor descriptor, List defineInvocation) { + private JsPropertyInitializer getEntry(@NotNull NamespaceDescriptor descriptor, DefineInvocation defineInvocation) { return new JsPropertyInitializer(context().getNameForDescriptor(descriptor).makeRef(), - new JsInvocation(context().namer().packageDefinitionMethodReference(), defineInvocation)); + new JsInvocation(context().namer().packageDefinitionMethodReference(), defineInvocation.asList())); } private boolean addEntryIfParentExists(NamespaceDescriptor parentDescriptor, JsPropertyInitializer entry, - Map> descriptorToDeclarationPlace) { - List parentDefineInvocation = descriptorToDeclarationPlace.get(parentDescriptor); + Map descriptorToDeclarationPlace) { + DefineInvocation parentDefineInvocation = descriptorToDeclarationPlace.get(parentDescriptor); if (parentDefineInvocation != null) { - getListFromPlace(parentDefineInvocation).add(entry); + parentDefineInvocation.getMembers().add(entry); return true; } return false; @@ -152,10 +150,10 @@ final class NamespaceTranslator extends AbstractTranslator { private void addToParent(NamespaceDescriptor parentDescriptor, JsPropertyInitializer entry, - Map> descriptorToDefineInvocation) { + Map descriptorToDefineInvocation) { while (!addEntryIfParentExists(parentDescriptor, entry, descriptorToDefineInvocation)) { JsObjectLiteral members = new JsObjectLiteral(new SmartList(entry), true); - List defineInvocation = createDefineInvocation(parentDescriptor, null, members, context()); + DefineInvocation defineInvocation = createDefineInvocation(parentDescriptor, null, members, context()); entry = getEntry(parentDescriptor, defineInvocation); descriptorToDefineInvocation.put(parentDescriptor, defineInvocation);