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:
committed by
Zalim Bashorov
parent
915f8734c5
commit
d27b7b793f
+3
-3
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user