001 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
002 // for details. All rights reserved. Use of this source code is governed by a
003 // BSD-style license that can be found in the LICENSE file.
004
005 package com.google.dart.compiler.backend.js.ast;
006
007 import com.google.dart.compiler.common.Symbol;
008 import com.google.dart.compiler.util.AstUtil;
009 import org.jetbrains.annotations.NotNull;
010
011 /**
012 * Represents a JavaScript label statement.
013 */
014 public class JsLabel extends SourceInfoAwareJsNode implements JsStatement, HasName {
015 private final JsName label;
016
017 private JsStatement statement;
018
019 public JsLabel(JsName label) {
020 this.label = label;
021 }
022
023 public JsLabel(JsName label, JsStatement statement) {
024 this.label = label;
025 this.statement = statement;
026 }
027
028 @Override
029 public JsName getName() {
030 return label;
031 }
032
033 @Override
034 public Symbol getSymbol() {
035 return label;
036 }
037
038 public JsStatement getStatement() {
039 return statement;
040 }
041
042 public void setStatement(JsStatement statement) {
043 this.statement = statement;
044 }
045
046 @Override
047 public void accept(JsVisitor v) {
048 v.visitLabel(this);
049 }
050
051 @Override
052 public void acceptChildren(JsVisitor visitor) {
053 visitor.accept(statement);
054 }
055
056 @Override
057 public void traverse(JsVisitorWithContext v, JsContext ctx) {
058 if (v.visit(this, ctx)) {
059 statement = v.acceptStatement(statement);
060 }
061 v.endVisit(this, ctx);
062 }
063
064 @NotNull
065 @Override
066 public JsLabel deepCopy() {
067 return new JsLabel(label, AstUtil.deepCopy(statement.deepCopy())).withMetadataFrom(this);
068 }
069 }