/* * Copyright (c) 1998-2011 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */ package com.caucho.es.parser; import com.caucho.es.ESBase; import com.caucho.es.ESBoolean; import com.caucho.es.ESNumber; import com.caucho.es.ESString; import java.io.IOException; /** * Represents a java literal. */ class LiteralExpr extends Expr { private ESBase value; LiteralExpr(Block block, ESBase value) { super(block); if (value == null) value = ESBase.esNull; this.value = value; if (value instanceof ESNumber) { double dv = 0; try { dv = value.toNum(); } catch (Throwable e) { } if ((double) ((int) dv) == dv) type = TYPE_INTEGER; else if ((double) ((long) dv) == dv) type = TYPE_LONG; else type = TYPE_NUMBER; } else if (value instanceof ESBoolean) type = TYPE_BOOLEAN; else if (value instanceof ESString) type = TYPE_STRING; else type = TYPE_ES; if (this.value == null) throw new RuntimeException(); } /** * Return the literal value. */ ESBase getLiteral() { return value; } boolean isSimple() { return true; } void printInt32Impl() throws IOException { try { cl.print(value.toInt32()); } catch (Throwable e) { } } void printNumImpl() throws IOException { try { double v = value.toNum(); if (Double.isInfinite(v)) cl.print("Double.POSITIVE_INFINITY"); else if (Double.isInfinite(-v)) cl.print("Double.NEGATIVE_INFINITY"); else if (Double.isNaN(v)) cl.print("Double.NaN"); else if ((long) v == v) cl.print("(" + (long) v + "L)"); else cl.print("(" + v + "D)"); } catch (Throwable e) { e.printStackTrace(); } } void printBooleanImpl() throws IOException { cl.print(value.toBoolean()); } /** * Prints the literal as a string. */ void printStringImpl() throws IOException { try { cl.print("\""); String s = value.toStr().toString(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); switch (ch) { case '"': cl.print("\\\""); break; case '\\': cl.print("\\\\"); break; case '\n': cl.print("\\n"); break; case '\r': cl.print("\\r"); break; default: cl.print(ch); break; } } cl.print("\""); } catch (Throwable e) { e.printStackTrace(); } } void printStr() throws IOException { try { printLiteral(value.toStr()); } catch (Throwable e) { e.printStackTrace(); } } void print() throws IOException { printLiteral(value); } void printImpl() throws IOException { printLiteral(value); } public String toString() { return "[LiteralExpr " + value.toString() + "]"; } }