From d27b7b793fbf2b59e1ec74fd700f2cf95b6b0aec Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 7 Aug 2014 13:01:58 +0400 Subject: [PATCH] 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. --- .../js/JsToStringGenerationVisitor.java | 6 +++--- .../dart/compiler/backend/js/ast/JsBreak.java | 9 +++++++-- .../compiler/backend/js/ast/JsContinue.java | 20 +++++++++++++++---- .../expression/ExpressionVisitor.java | 4 ++-- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java index 39649dd0ee0..fe8735cba8f 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/JsToStringGenerationVisitor.java @@ -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()); } } diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java index e046b2b2695..135fb4f629d 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsBreak.java @@ -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); } } diff --git a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java index d3705244642..9fd01c61fcd 100644 --- a/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java +++ b/js/js.dart-ast/src/com/google/dart/compiler/backend/js/ast/JsContinue.java @@ -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); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java index 897c88c548a..dd4bb9cc9c6 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/expression/ExpressionVisitor.java @@ -359,7 +359,7 @@ public final class ExpressionVisitor extends TranslatorVisitor { .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 { else { JsName name = context.scope().findName(getReferencedName(labelElement)); assert name != null; - return name.getIdent(); + return name.makeRef(); } }