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:
@@ -16,7 +16,6 @@
|
||||
|
||||
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.JsName;
|
||||
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.psi.JetExpression;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class AliasingContext {
|
||||
private static final AliasingContext ROOT = new AliasingContext(null) {
|
||||
@@ -46,36 +47,39 @@ public class AliasingContext {
|
||||
@Nullable
|
||||
private Map<DeclarationDescriptor, JsExpression> aliasesForDescriptors;
|
||||
|
||||
@NotNull
|
||||
private final Map<JetExpression, JsName> aliasesForExpressions = Maps.newHashMap();
|
||||
@Nullable
|
||||
private final Map<JetExpression, JsName> aliasesForExpressions;
|
||||
|
||||
@Nullable
|
||||
private final 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.aliasesForDescriptors = aliasesForDescriptors;
|
||||
this.aliasesForExpressions = aliasesForExpressions;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
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
|
||||
public AliasingContext withAliasesForExpressions(@NotNull Map<JetExpression, JsName> aliasesForExpressions) {
|
||||
AliasingContext newContext = new AliasingContext(this);
|
||||
newContext.aliasesForExpressions.putAll(aliasesForExpressions);
|
||||
return newContext;
|
||||
public AliasingContext withExpressionsAliased(@NotNull Map<JetExpression, JsName> aliasesForExpressions) {
|
||||
return new AliasingContext(this, null, aliasesForExpressions);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public AliasingContext withDescriptorsAliased(@NotNull Map<DeclarationDescriptor, JsExpression> aliases) {
|
||||
return new AliasingContext(this, aliases);
|
||||
return new AliasingContext(this, aliases, null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@@ -89,13 +93,17 @@ public class AliasingContext {
|
||||
return alias;
|
||||
}
|
||||
|
||||
if (parent == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return parent.getAliasForDescriptor(descriptor);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public JsName getAliasForExpression(@NotNull JetExpression element) {
|
||||
JsName alias = aliasesForExpressions.get(element);
|
||||
return alias != null ? alias : parent.getAliasForExpression(element);
|
||||
JsName alias = aliasesForExpressions == null ? null : aliasesForExpressions.get(element);
|
||||
return alias != null || parent == null ? alias : parent.getAliasForExpression(element);
|
||||
}
|
||||
|
||||
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()));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public JsVar createTemporaryVar(@NotNull JsExpression initExpression) {
|
||||
return new JsVar(currentScope.declareTemporary(), initExpression);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public JsScope getScope() {
|
||||
return currentScope;
|
||||
|
||||
@@ -121,7 +121,7 @@ public class TranslationContext {
|
||||
|
||||
@NotNull
|
||||
public TranslationContext innerContextWithAliasesForExpressions(@NotNull Map<JetExpression, JsName> aliases) {
|
||||
return new TranslationContext(this, aliasingContext.withAliasesForExpressions(aliases));
|
||||
return new TranslationContext(this, aliasingContext.withExpressionsAliased(aliases));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
+9
-6
@@ -16,17 +16,18 @@
|
||||
|
||||
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.JsName;
|
||||
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.jet.lang.psi.JetExpression;
|
||||
import org.jetbrains.k2js.translate.context.TemporaryVariable;
|
||||
import org.jetbrains.k2js.translate.context.TranslationContext;
|
||||
import org.jetbrains.k2js.translate.general.AbstractTranslator;
|
||||
import org.jetbrains.k2js.translate.general.Translation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -55,13 +56,15 @@ public final class DangerousTranslator extends AbstractTranslator {
|
||||
|
||||
@NotNull
|
||||
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) {
|
||||
JsExpression translatedExpression = Translation.translateAsExpression(expression, context());
|
||||
TemporaryVariable aliasForExpression = context().declareTemporary(translatedExpression);
|
||||
context().addStatementToCurrentBlock(aliasForExpression.assignmentExpression().makeStmt());
|
||||
aliasesForExpressions.put(expression, aliasForExpression.name());
|
||||
JsVars.JsVar aliasForExpression = context().dynamicContext().createTemporaryVar(translatedExpression);
|
||||
vars.add(aliasForExpression);
|
||||
aliasesForExpressions.put(expression, aliasForExpression.getName());
|
||||
}
|
||||
context().addStatementToCurrentBlock(new JsVars(vars, true));
|
||||
return aliasesForExpressions;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user