JS backend: break label should be JsNameRef, not String

The reason is to make it easier to distinguish
between different break labels (that's valid on same level).
JsNameRefs can be distinguished by their JsName.
This commit is contained in:
Alexey Tsvetkov
2014-08-07 13:01:58 +04:00
committed by Zalim Bashorov
parent 915f8734c5
commit d27b7b793f
4 changed files with 28 additions and 11 deletions
@@ -304,10 +304,10 @@ public class JsToStringGenerationVisitor extends JsVisitor {
}
private void continueOrBreakLabel(JsContinue x) {
String label = x.getLabel();
if (label != null) {
JsNameRef label = x.getLabel();
if (label != null && label.getIdent() != null) {
space();
p.print(label);
p.print(label.getIdent());
}
}
@@ -12,7 +12,7 @@ public final class JsBreak extends JsContinue {
super(null);
}
public JsBreak(String label) {
public JsBreak(JsNameRef label) {
super(label);
}
@@ -23,7 +23,12 @@ public final class JsBreak extends JsContinue {
@Override
public void traverse(JsVisitorWithContext v, JsContext ctx) {
v.visit(this, ctx);
if (v.visit(this, ctx)) {
if (label != null){
label = v.accept(label);
}
}
v.endVisit(this, ctx);
}
}
@@ -7,18 +7,18 @@ package com.google.dart.compiler.backend.js.ast;
import org.jetbrains.annotations.Nullable;
public class JsContinue extends SourceInfoAwareJsNode implements JsStatement {
protected final String label;
protected JsNameRef label;
public JsContinue() {
this(null);
}
public JsContinue(@Nullable String label) {
public JsContinue(@Nullable JsNameRef label) {
super();
this.label = label;
}
public String getLabel() {
public JsNameRef getLabel() {
return label;
}
@@ -27,9 +27,21 @@ public class JsContinue extends SourceInfoAwareJsNode implements JsStatement {
v.visitContinue(this);
}
@Override
public void acceptChildren(JsVisitor v) {
if (label != null){
v.accept(label);
}
}
@Override
public void traverse(JsVisitorWithContext v, JsContext ctx) {
v.visit(this, ctx);
if (v.visit(this, ctx)) {
if (label != null){
label = v.accept(label);
}
}
v.endVisit(this, ctx);
}
}
@@ -359,7 +359,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
.replaceAll("(?:^`(.*)`$)", "$1");
}
private static String getTargetLabel(JetExpressionWithLabel expression, TranslationContext context) {
private static JsNameRef getTargetLabel(JetExpressionWithLabel expression, TranslationContext context) {
JetSimpleNameExpression labelElement = expression.getTargetLabel();
if (labelElement == null) {
return null;
@@ -367,7 +367,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
else {
JsName name = context.scope().findName(getReferencedName(labelElement));
assert name != null;
return name.getIdent();
return name.makeRef();
}
}