JS backend: improve js readability which generated in the Dangerous translator -- initialize temporary vars in declaration.

(cherry picked from commit 4d8355c)
This commit is contained in:
develar
2012-09-10 11:03:27 +04:00
committed by Zalim Bashorov
parent d4bf98de97
commit ddbea17e0f
4 changed files with 37 additions and 21 deletions
@@ -16,7 +16,6 @@
package org.jetbrains.k2js.translate.context; package org.jetbrains.k2js.translate.context;
import com.google.common.collect.Maps;
import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsName; import com.google.dart.compiler.backend.js.ast.JsName;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -24,7 +23,9 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import java.util.*; import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
public class AliasingContext { public class AliasingContext {
private static final AliasingContext ROOT = new AliasingContext(null) { private static final AliasingContext ROOT = new AliasingContext(null) {
@@ -46,36 +47,39 @@ public class AliasingContext {
@Nullable @Nullable
private Map<DeclarationDescriptor, JsExpression> aliasesForDescriptors; private Map<DeclarationDescriptor, JsExpression> aliasesForDescriptors;
@NotNull @Nullable
private final Map<JetExpression, JsName> aliasesForExpressions = Maps.newHashMap(); private final Map<JetExpression, JsName> aliasesForExpressions;
@Nullable @Nullable
private final AliasingContext parent; private final AliasingContext parent;
private AliasingContext(@Nullable AliasingContext parent) { private AliasingContext(@Nullable AliasingContext parent) {
this(parent, null); this(parent, null, null);
} }
private AliasingContext(@Nullable AliasingContext parent, @Nullable Map<DeclarationDescriptor, JsExpression> aliasesForDescriptors) { private AliasingContext(
@Nullable AliasingContext parent,
@Nullable Map<DeclarationDescriptor, JsExpression> aliasesForDescriptors,
@Nullable Map<JetExpression, JsName> aliasesForExpressions
) {
this.parent = parent; this.parent = parent;
this.aliasesForDescriptors = aliasesForDescriptors; this.aliasesForDescriptors = aliasesForDescriptors;
this.aliasesForExpressions = aliasesForExpressions;
} }
@NotNull @NotNull
public AliasingContext inner(@NotNull DeclarationDescriptor descriptor, @NotNull JsExpression alias) { public AliasingContext inner(@NotNull DeclarationDescriptor descriptor, @NotNull JsExpression alias) {
return new AliasingContext(this, Collections.singletonMap(descriptor, alias)); return new AliasingContext(this, Collections.singletonMap(descriptor, alias), null);
} }
@NotNull @NotNull
public AliasingContext withAliasesForExpressions(@NotNull Map<JetExpression, JsName> aliasesForExpressions) { public AliasingContext withExpressionsAliased(@NotNull Map<JetExpression, JsName> aliasesForExpressions) {
AliasingContext newContext = new AliasingContext(this); return new AliasingContext(this, null, aliasesForExpressions);
newContext.aliasesForExpressions.putAll(aliasesForExpressions);
return newContext;
} }
@NotNull @NotNull
public AliasingContext withDescriptorsAliased(@NotNull Map<DeclarationDescriptor, JsExpression> aliases) { public AliasingContext withDescriptorsAliased(@NotNull Map<DeclarationDescriptor, JsExpression> aliases) {
return new AliasingContext(this, aliases); return new AliasingContext(this, aliases, null);
} }
@Nullable @Nullable
@@ -89,13 +93,17 @@ public class AliasingContext {
return alias; return alias;
} }
if (parent == null) {
return null;
}
return parent.getAliasForDescriptor(descriptor); return parent.getAliasForDescriptor(descriptor);
} }
@Nullable @Nullable
public JsName getAliasForExpression(@NotNull JetExpression element) { public JsName getAliasForExpression(@NotNull JetExpression element) {
JsName alias = aliasesForExpressions.get(element); JsName alias = aliasesForExpressions == null ? null : aliasesForExpressions.get(element);
return alias != null ? alias : parent.getAliasForExpression(element); return alias != null || parent == null ? alias : parent.getAliasForExpression(element);
} }
public void registerAlias(@NotNull DeclarationDescriptor descriptor, @NotNull JsExpression alias) { public void registerAlias(@NotNull DeclarationDescriptor descriptor, @NotNull JsExpression alias) {
@@ -73,6 +73,11 @@ public final class DynamicContext {
return Pair.create(var, (JsExpression) new JsNameRef(var.getName())); return Pair.create(var, (JsExpression) new JsNameRef(var.getName()));
} }
@NotNull
public JsVar createTemporaryVar(@NotNull JsExpression initExpression) {
return new JsVar(currentScope.declareTemporary(), initExpression);
}
@NotNull @NotNull
public JsScope getScope() { public JsScope getScope() {
return currentScope; return currentScope;
@@ -121,7 +121,7 @@ public class TranslationContext {
@NotNull @NotNull
public TranslationContext innerContextWithAliasesForExpressions(@NotNull Map<JetExpression, JsName> aliases) { public TranslationContext innerContextWithAliasesForExpressions(@NotNull Map<JetExpression, JsName> aliases) {
return new TranslationContext(this, aliasingContext.withAliasesForExpressions(aliases)); return new TranslationContext(this, aliasingContext.withExpressionsAliased(aliases));
} }
@NotNull @NotNull
@@ -16,17 +16,18 @@
package org.jetbrains.k2js.translate.utils.dangerous; package org.jetbrains.k2js.translate.utils.dangerous;
import com.google.common.collect.Maps;
import com.google.dart.compiler.backend.js.ast.JsExpression; import com.google.dart.compiler.backend.js.ast.JsExpression;
import com.google.dart.compiler.backend.js.ast.JsName; import com.google.dart.compiler.backend.js.ast.JsName;
import com.google.dart.compiler.backend.js.ast.JsNode; import com.google.dart.compiler.backend.js.ast.JsNode;
import com.google.dart.compiler.backend.js.ast.JsVars;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetExpression;
import org.jetbrains.k2js.translate.context.TemporaryVariable;
import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.context.TranslationContext;
import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.AbstractTranslator;
import org.jetbrains.k2js.translate.general.Translation; import org.jetbrains.k2js.translate.general.Translation;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -55,13 +56,15 @@ public final class DangerousTranslator extends AbstractTranslator {
@NotNull @NotNull
private Map<JetExpression, JsName> translateAllExpressionsAndCreateAliasesForThem(@NotNull List<JetExpression> expressions) { private Map<JetExpression, JsName> translateAllExpressionsAndCreateAliasesForThem(@NotNull List<JetExpression> expressions) {
Map<JetExpression, JsName> aliasesForExpressions = Maps.newHashMap(); Map<JetExpression, JsName> aliasesForExpressions = new THashMap<JetExpression, JsName>(expressions.size());
List<JsVars.JsVar> vars = new ArrayList<JsVars.JsVar>(expressions.size());
for (JetExpression expression : expressions) { for (JetExpression expression : expressions) {
JsExpression translatedExpression = Translation.translateAsExpression(expression, context()); JsExpression translatedExpression = Translation.translateAsExpression(expression, context());
TemporaryVariable aliasForExpression = context().declareTemporary(translatedExpression); JsVars.JsVar aliasForExpression = context().dynamicContext().createTemporaryVar(translatedExpression);
context().addStatementToCurrentBlock(aliasForExpression.assignmentExpression().makeStmt()); vars.add(aliasForExpression);
aliasesForExpressions.put(expression, aliasForExpression.name()); aliasesForExpressions.put(expression, aliasForExpression.getName());
} }
context().addStatementToCurrentBlock(new JsVars(vars, true));
return aliasesForExpressions; return aliasesForExpressions;
} }
} }