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 org.jetbrains.annotations.NotNull;
008
009 public abstract class JsLiteral extends JsExpressionImpl {
010 public static final JsValueLiteral THIS = new JsThisRef();
011 public static final JsNameRef UNDEFINED = new JsNameRef("undefined");
012
013 public static final JsNullLiteral NULL = new JsNullLiteral();
014
015 public static final JsBooleanLiteral TRUE = new JsBooleanLiteral(true);
016 public static final JsBooleanLiteral FALSE = new JsBooleanLiteral(false);
017
018 public static JsBooleanLiteral getBoolean(boolean truth) {
019 return truth ? TRUE : FALSE;
020 }
021
022 public static final class JsThisRef extends JsValueLiteral {
023 private JsThisRef() {
024 super();
025 }
026
027 @Override
028 public void accept(JsVisitor v) {
029 v.visitThis(this);
030 }
031
032 @Override
033 public void traverse(JsVisitorWithContext v, JsContext ctx) {
034 v.visit(this, ctx);
035 v.endVisit(this, ctx);
036 }
037 }
038
039 public static final class JsBooleanLiteral extends JsValueLiteral {
040 private final boolean value;
041
042 // Should be interned by JsProgram
043 private JsBooleanLiteral(boolean value) {
044 this.value = value;
045 }
046
047 public boolean getValue() {
048 return value;
049 }
050
051 @Override
052 public void accept(JsVisitor v) {
053 v.visitBoolean(this);
054 }
055
056 @Override
057 public void traverse(JsVisitorWithContext v, JsContext ctx) {
058 v.visit(this, ctx);
059 v.endVisit(this, ctx);
060 }
061 }
062
063 /**
064 * A JavaScript string literal expression.
065 */
066 public abstract static class JsValueLiteral extends JsLiteral {
067 protected JsValueLiteral() {
068 }
069
070 @Override
071 public final boolean isLeaf() {
072 return true;
073 }
074
075 @NotNull
076 @Override
077 public JsExpression deepCopy() {
078 return this;
079 }
080 }
081 }