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    public abstract class JsLiteral extends JsExpressionImpl {
008        public static final JsValueLiteral THIS = new JsThisRef();
009        public static final JsNameRef UNDEFINED = new JsNameRef("undefined");
010    
011        public static final JsNullLiteral NULL = new JsNullLiteral();
012    
013        public static final JsBooleanLiteral TRUE = new JsBooleanLiteral(true);
014        public static final JsBooleanLiteral FALSE = new JsBooleanLiteral(false);
015    
016        public static JsBooleanLiteral getBoolean(boolean truth) {
017            return truth ? TRUE : FALSE;
018        }
019    
020        public static final class JsThisRef extends JsValueLiteral {
021            private JsThisRef() {
022                super();
023            }
024    
025            @Override
026            public void accept(JsVisitor v) {
027                v.visitThis(this);
028            }
029        }
030    
031        public static final class JsBooleanLiteral extends JsValueLiteral {
032          private final boolean value;
033    
034          // Should be interned by JsProgram
035          private JsBooleanLiteral(boolean value) {
036            this.value = value;
037          }
038    
039          public boolean getValue() {
040            return value;
041          }
042    
043          @Override
044          public void accept(JsVisitor v) {
045            v.visitBoolean(this);
046          }
047        }
048    
049        /**
050         * A JavaScript string literal expression.
051         */
052        public abstract static class JsValueLiteral extends JsLiteral {
053            protected JsValueLiteral() {
054            }
055    
056            @Override
057            public final boolean isLeaf() {
058                return true;
059            }
060        }
061    }