/*
* 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 Software Foundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Scott Ferguson
*/
package com.caucho.quercus.expr;
import com.caucho.quercus.Location;
import com.caucho.quercus.QuercusContext;
import com.caucho.quercus.env.*;
import com.caucho.quercus.parser.QuercusParser;
import com.caucho.quercus.program.*;
import com.caucho.quercus.statement.*;
import com.caucho.util.L10N;
import com.caucho.vfs.Path;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Factory for creating PHP expressions and statements
*/
public class ExprFactory {
private static final L10N L = new L10N(ExprFactory.class);
private static final Logger log
= Logger.getLogger(ExprFactory.class.getName());
private static boolean _isPro = true;
public ExprFactory()
{
}
public static ExprFactory create()
{
if (! _isPro)
return new ExprFactory();
try {
Class cl = Class.forName("com.caucho.quercus.expr.ExprFactoryPro");
return (ExprFactory) cl.newInstance();
} catch (Exception e) {
log.log(Level.FINEST, e.toString(), e);
_isPro = false;
return new ExprFactory();
}
}
/**
* Creates a null literal expression.
*/
public Expr createNull()
{
return LiteralNullExpr.NULL;
}
/**
* Creates a string (php5) literal expression.
*/
public Expr createString(String lexeme)
{
return new LiteralStringExpr(lexeme);
}
/**
* Creates a string literal expression.
*/
public Expr createUnicode(String lexeme)
{
return new LiteralUnicodeExpr(lexeme);
}
/**
* Creates a binary literal expression.
*/
public Expr createBinary(byte []bytes)
{
return new LiteralBinaryStringExpr(bytes);
}
/**
* Creates a long literal expression.
*/
public Expr createLong(long value)
{
return new LiteralLongExpr(value);
}
/**
* Creates a string literal expression.
*/
public Expr createLiteral(Value literal)
{
return new LiteralExpr(literal);
}
/**
* Creates a var expression.
*/
public VarExpr createVar(VarInfo var)
{
return new VarExpr(var);
}
/**
* Creates a var expression.
*/
public VarVarExpr createVarVar(Expr var)
{
return new VarVarExpr(var);
}
//
// constants
//
/**
* Creates a __FILE__ expression.
*/
public ConstFileExpr createFileNameExpr(String fileName)
{
return new ConstFileExpr(fileName);
}
/**
* Creates a __DIR__ expression.
*/
public ConstDirExpr createDirExpr(String dirName)
{
return new ConstDirExpr(dirName);
}
/**
* Creates a const expression.
*/
public ConstExpr createConst(String name)
{
return new ConstExpr(name);
}
//
// array deref
//
/**
* Creates an array get 'a[0]' expression.
* @param location
*/
public ArrayGetExpr createArrayGet(Location location,
Expr base,
Expr index)
{
/* XXX:
if (base instanceof ArrayGetExpr
|| base instanceof ObjectFieldExpr
|| base instanceof ObjectFieldVarExpr)
return new ArrayGetGetExpr(location, base, index);
else
return new ArrayGetExpr(location, base, index);
*/
return new ArrayGetExpr(location, base, index);
}
/**
* Creates an array tail 'a[]' expression.
* @param location TODO
*/
public ArrayTailExpr createArrayTail(Location location, Expr base)
{
return new ArrayTailExpr(location, base);
}
//
// field deref
//
/**
* Creates an object get '$a->b' expression.
*/
public Expr createFieldGet(Expr base,
StringValue name)
{
return new ObjectFieldExpr(base, name);
}
/**
* Creates an object get '$a->$b' expression.
*/
public Expr createFieldVarGet(Expr base,
Expr name)
{
return new ObjectFieldVarExpr(base, name);
}
//
// $this expressions
//
/**
* Creates a this expression.
*/
public ThisExpr createThis(InterpretedClassDef cl)
{
return new ThisExpr(cl);
}
/**
* Creates a "$this->foo" expression.
*/
public ThisFieldExpr createThisField(ThisExpr qThis,
StringValue name)
{
return new ThisFieldExpr(qThis, name);
}
/**
* Creates a "$this->$foo" expression.
*/
public ThisFieldVarExpr createThisField(ThisExpr qThis, Expr name)
{
return new ThisFieldVarExpr(qThis, name);
}
/**
* Creates a $this method call $this->foo(...).
*/
public Expr createThisMethod(Location loc,
ThisExpr qThis,
String methodName,
ArrayList<Expr> args)
{
return new ThisMethodExpr(loc, qThis, methodName, args);
}
/**
* Creates a $this method call $this->foo(...).
*/
public Expr createThisMethod(Location loc,
ThisExpr qThis,
Expr methodName,
ArrayList<Expr> args)
{
return new ThisMethodVarExpr(loc, qThis, methodName, args);
}
//
// class scope foo::bar
//
/**
* Creates a class const expression.
*/
public ClassConstExpr createClassConst(String className, String name)
{
return new ClassConstExpr(className, name);
}
/**
* Creates an expression class const expression ($class::FOO).
*/
public Expr createClassConst(Expr className, String name)
{
return new ClassVarConstExpr(className, name);
}
/**
* Creates a class const expression (static::FOO).
*/
public ClassVirtualConstExpr createClassVirtualConst(String name)
{
return new ClassVirtualConstExpr(name);
}
//
// class fields
//
/**
* Creates an class static field 'a::$b' expression.
*/
public Expr createClassField(String className,
String name)
{
return new ClassFieldExpr(className, name);
}
/**
* Creates an class static field '$a::$b' expression.
*/
public Expr createClassField(Expr className,
String name)
{
return new ClassVarFieldExpr(className, name);
}
/**
* Creates a class static field 'static::$b' expression.
*/
public Expr createClassVirtualField(String name)
{
return new ClassVirtualFieldExpr(name);
}
/**
* Creates an class static field 'a::${b}' expression.
*/
public Expr createClassField(String className,
Expr name)
{
return new ClassFieldVarExpr(className, name);
}
/**
* Creates an class static field '$class::$b' expression.
*/
public Expr createClassField(Expr className,
Expr name)
{
return new ClassVarFieldVarExpr(className, name);
}
/**
* Creates a class static field 'static::${b}' expression.
*/
public Expr createClassVirtualField(Expr name)
{
return new ClassVirtualFieldVarExpr(name);
}
//
// unary expressions
//
/**
* Creates an unset '$a' expression.
*/
public Expr createUnsetVar(AbstractVarExpr var)
{
return new VarUnsetExpr(var);
}
/**
* Creates a char at 'a{0}' expression.
*/
public BinaryCharAtExpr createCharAt(Expr base, Expr index)
{
return new BinaryCharAtExpr(base, index);
}
/**
* Creates a post increment 'a++' expression.
*/
public UnaryPostIncrementExpr createPostIncrement(Expr expr, int incr)
{
return new UnaryPostIncrementExpr(expr, incr);
}
/**
* Creates a pre increment '++a' expression.
*/
public UnaryPreIncrementExpr createPreIncrement(Expr expr, int incr)
{
return new UnaryPreIncrementExpr(expr, incr);
}
/**
* Creates a unary minus '-a' expression.
*/
public Expr createMinus(Expr expr)
{
return new UnaryMinusExpr(expr);
}
/**
* Creates a unary plus '+a' expression.
*/
public Expr createPlus(Expr expr)
{
return new UnaryPlusExpr(expr);
}
/**
* Creates a unary not '!a' expression.
*/
public Expr createNot(Expr expr)
{
return new UnaryNotExpr(expr);
}
/**
* Creates a unary inversion '~a' expression.
*/
public Expr createBitNot(Expr expr)
{
return new UnaryBitNotExpr(expr);
}
/**
* Creates a clone 'clone a' expression.
*/
public Expr createClone(Expr expr)
{
return new FunCloneExpr(expr);
}
/**
* Creates a clone 'clone a' expression.
*/
public Expr createCopy(Expr expr)
{
return new UnaryCopyExpr(expr);
}
/**
* Creates an error suppression '@a' expression.
*/
public Expr createSuppress(Expr expr)
{
return new UnarySuppressErrorExpr(expr);
}
/**
* Creates a boolean cast
*/
public Expr createToBoolean(Expr expr)
{
return new ToBooleanExpr(expr);
}
/**
* Creates a long cast
*/
public Expr createToLong(Expr expr)
{
return new ToLongExpr(expr);
}
/**
* Creates a double cast
*/
public Expr createToDouble(Expr expr)
{
return new ToDoubleExpr(expr);
}
/**
* Creates a string cast
*/
public Expr createToString(Expr expr)
{
return new ToStringExpr(expr);
}
/**
* Creates a unicode cast
*/
public Expr createToUnicode(Expr expr)
{
return new ToUnicodeExpr(expr);
}
/**
* Creates a binary string cast
*/
public Expr createToBinary(Expr expr)
{
return new ToBinaryExpr(expr);
}
/**
* Creates an object cast
*/
public Expr createToObject(Expr expr)
{
return new ToObjectExpr(expr);
}
/**
* Creates an array cast
*/
public Expr createToArray(Expr expr)
{
return new ToArrayExpr(expr);
}
/**
* Creates a die 'die("msg")' expression.
*/
public Expr createDie(Expr expr)
{
return new FunDieExpr(expr);
}
/**
* Creates an exit 'exit("msg")' expression.
*/
public Expr createExit(Expr expr)
{
return new FunExitExpr(expr);
}
/**
* Creates a required
*/
public Expr createRequired()
{
return ParamRequiredExpr.REQUIRED;
}
/**
* Creates a default
*/
public Expr createDefault()
{
return new ParamDefaultExpr();
}
/**
* Creates an addition expression.
*/
public Expr createAdd(Expr left, Expr right)
{
return new BinaryAddExpr(left, right);
}
/**
* Creates a subtraction expression.
*/
public Expr createSub(Expr left, Expr right)
{
return new BinarySubExpr(left, right);
}
/**
* Creates a multiplication expression.
*/
public Expr createMul(Expr left, Expr right)
{
return new BinaryMulExpr(left, right);
}
/**
* Creates a division expression.
*/
public Expr createDiv(Expr left, Expr right)
{
return new BinaryDivExpr(left, right);
}
/**
* Creates a modulo expression.
*/
public Expr createMod(Expr left, Expr right)
{
return new BinaryModExpr(left, right);
}
/**
* Creates a left-shift expression.
*/
public Expr createLeftShift(Expr left, Expr right)
{
return new BinaryLeftShiftExpr(left, right);
}
/**
* Creates a right-shift expression.
*/
public Expr createRightShift(Expr left, Expr right)
{
return new BinaryRightShiftExpr(left, right);
}
/**
* Creates a bit-and expression.
*/
public Expr createBitAnd(Expr left, Expr right)
{
return new BinaryBitAndExpr(left, right);
}
/**
* Creates a bit-or expression.
*/
public Expr createBitOr(Expr left, Expr right)
{
return new BinaryBitOrExpr(left, right);
}
/**
* Creates a bit-xor expression.
*/
public Expr createBitXor(Expr left, Expr right)
{
return new BinaryBitXorExpr(left, right);
}
/**
* Creates an append expression
*/
public final Expr createAppend(Expr left, Expr right)
{
BinaryAppendExpr leftAppend;
// XXX: i18n binary vs unicode issues
/*
if (left instanceof ToStringExpr)
left = ((ToStringExpr) left).getExpr();
if (left instanceof StringLiteralExpr) {
StringLiteralExpr string = (StringLiteralExpr) left;
if (string.evalConstant().length() == 0)
return ToStringExpr.create(right);
}
*/
if (left instanceof BinaryAppendExpr)
leftAppend = (BinaryAppendExpr) left;
else
leftAppend = createAppendImpl(left, null);
BinaryAppendExpr next;
/*
if (right instanceof ToStringExpr)
right = ((ToStringExpr) right).getExpr();
if (right instanceof StringLiteralExpr) {
StringLiteralExpr string = (StringLiteralExpr) right;
if (string.evalConstant().length() == 0)
return ToStringExpr.create(left);
}
*/
if (right instanceof BinaryAppendExpr)
next = (BinaryAppendExpr) right;
else
next = createAppendImpl(right, null);
BinaryAppendExpr result = append(leftAppend, next);
if (result.getNext() != null)
return result;
else
return result.getValue();
}
/**
* Appends the tail to the current expression, combining
* constant literals.
*/
private BinaryAppendExpr append(BinaryAppendExpr left, BinaryAppendExpr tail)
{
if (left == null)
return tail;
tail = append(left.getNext(), tail);
if (left.getValue() instanceof LiteralBinaryStringExpr
&& tail.getValue() instanceof LiteralBinaryStringExpr) {
LiteralBinaryStringExpr leftString
= (LiteralBinaryStringExpr) left.getValue();
LiteralBinaryStringExpr rightString
= (LiteralBinaryStringExpr) tail.getValue();
try {
byte []bytes = (leftString.evalConstant().toString()
+ rightString.evalConstant().toString()).getBytes("ISO-8859-1");
Expr value = createBinary(bytes);
return createAppendImpl(value, tail.getNext());
} catch (java.io.UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
else if (left.getValue() instanceof LiteralBinaryStringExpr
|| tail.getValue() instanceof LiteralBinaryStringExpr) {
left.setNext(tail);
return left;
}
else if (left.getValue() instanceof LiteralStringExpr
&& tail.getValue() instanceof LiteralStringExpr) {
LiteralStringExpr leftString = (LiteralStringExpr) left.getValue();
LiteralStringExpr rightString = (LiteralStringExpr) tail.getValue();
Expr value = createString(leftString.evalConstant().toString()
+ rightString.evalConstant().toString());
return createAppendImpl(value, tail.getNext());
}
else if (left.getValue() instanceof LiteralUnicodeExpr
&& tail.getValue() instanceof LiteralUnicodeExpr) {
LiteralUnicodeExpr leftString = (LiteralUnicodeExpr) left.getValue();
LiteralUnicodeExpr rightString = (LiteralUnicodeExpr) tail.getValue();
Expr value = createUnicode(leftString.evalConstant().toString()
+ rightString.evalConstant().toString());
return createAppendImpl(value, tail.getNext());
}
else {
left.setNext(tail);
return left;
}
}
protected BinaryAppendExpr createAppendImpl(Expr left, BinaryAppendExpr right)
{
return new BinaryAppendExpr(left, right);
}
/**
* Creates a lt expression.
*/
public Expr createLt(Expr left, Expr right)
{
return new BinaryLtExpr(left, right);
}
/**
* Creates a leq expression.
*/
public Expr createLeq(Expr left, Expr right)
{
return new BinaryLeqExpr(left, right);
}
/**
* Creates a gt expression.
*/
public Expr createGt(Expr left, Expr right)
{
return new BinaryGtExpr(left, right);
}
/**
* Creates a geq expression.
*/
public Expr createGeq(Expr left, Expr right)
{
return new BinaryGeqExpr(left, right);
}
/**
* Creates an eq expression.
*/
public Expr createEq(Expr left, Expr right)
{
return new BinaryEqExpr(left, right);
}
/**
* Creates a neq expression.
*/
public Expr createNeq(Expr left, Expr right)
{
return new BinaryNeqExpr(left, right);
}
/**
* Creates an equals expression.
*/
public Expr createEquals(Expr left, Expr right)
{
return new BinaryEqualsExpr(left, right);
}
/**
* Creates an assignment expression.
*/
public Expr createAssign(AbstractVarExpr left, Expr right)
{
return new BinaryAssignExpr(left, right);
}
/**
* Creates an assignment expression.
*/
public Expr createAssignRef(AbstractVarExpr left, Expr right)
{
return new BinaryAssignRefExpr(left, right);
}
/**
* Creates a ref '&$a' expression.
*/
public UnaryRefExpr createRef(Expr base)
{
return new UnaryRefExpr(base);
}
/**
* Creates an and expression.
*/
public Expr createAnd(Expr left, Expr right)
{
return new BinaryAndExpr(left, right);
}
/**
* Creates an or expression.
*/
public Expr createOr(Expr left, Expr right)
{
return new BinaryOrExpr(left, right);
}
/**
* Creates an xor expression.
*/
public Expr createXor(Expr left, Expr right)
{
return new BinaryXorExpr(left, right);
}
/**
* Creates a comma expression.
*/
public Expr createComma(Expr left, Expr right)
{
return new BinaryCommaExpr(left, right);
}
/**
* Creates an instanceof expression.
*/
public Expr createInstanceOf(Expr expr, String name)
{
return new BinaryInstanceOfExpr(expr, name);
}
/**
* Creates an instanceof expression.
*/
public Expr createInstanceOfVar(Expr expr, Expr name)
{
return new BinaryInstanceOfVarExpr(expr, name);
}
/**
* Creates an each expression.
*/
public Expr createEach(Expr expr)
{
return new FunEachExpr(expr);
}
/**
* Creates a list expression.
*/
public final Expr createList(QuercusParser parser,
ListHeadExpr head, Expr value)
{
boolean isSuppress = value instanceof UnarySuppressErrorExpr;
if (isSuppress) {
UnarySuppressErrorExpr suppressExpr = (UnarySuppressErrorExpr) value;
value = suppressExpr.getExpr();
}
Expr expr;
if (value instanceof FunEachExpr) {
Expr arg = ((FunEachExpr) value).getExpr();
expr = createListEach(head, arg);
}
else
expr = createList(head, value);
if (isSuppress)
return createSuppress(expr);
else
return expr;
}
/**
* Creates a list expression.
*/
public ListHeadExpr createListHead(ArrayList<Expr> keys)
{
return new ListHeadExpr(keys);
}
/**
* Creates a list expression.
*/
public Expr createList(ListHeadExpr head, Expr value)
{
return new BinaryAssignListExpr(head, value);
}
/**
* Creates a list expression.
*/
public Expr createListEach(ListHeadExpr head, Expr value)
{
return new BinaryAssignListEachExpr(head, value);
}
/**
* Creates an conditional expression.
*/
public Expr createConditional(Expr test, Expr left, Expr right)
{
return new ConditionalExpr(test, left, right);
}
/**
* Creates an conditional expression.
*/
public Expr createShortConditional(Expr test, Expr right)
{
return new ConditionalShortExpr(test, right);
}
/**
* Creates a array() expression.
*/
public Expr createArrayFun(ArrayList<Expr> keys, ArrayList<Expr> values)
{
return new FunArrayExpr(keys, values);
}
/**
* Creates a new function call.
*/
public Expr createCall(QuercusParser parser,
String name,
ArrayList<Expr> args)
{
Location loc = parser.getLocation();
if ("isset".equals(name) && args.size() == 1)
return new FunIssetExpr(args.get(0));
else if ("get_called_class".equals(name) && args.size() == 0)
return new FunGetCalledClassExpr(loc);
else if ("get_class".equals(name) && args.size() == 0)
return new FunGetClassExpr(parser);
else if ("each".equals(name) && args.size() == 1) {
Expr arg = args.get(0);
if (! arg.isVar()) {
parser.error(L.l("each() argument must be a variable at '{0}'", arg));
}
return new FunEachExpr(arg);
}
else
return new CallExpr(loc, name, args);
}
/**
* Creates a new var function call.
*/
public CallVarExpr createVarFunction(Location loc,
Expr name,
ArrayList<Expr> args)
{
return new CallVarExpr(loc, name, args);
}
/**
* Creates a new closure.
*/
public ClosureExpr createClosure(Location loc,
Function fun,
ArrayList<VarExpr> useArgs)
{
return new ClosureExpr(loc, fun);
}
//
// methods
//
/**
* Creates a method call $a->foo(...).
*/
public Expr createMethodCall(Location loc,
Expr objExpr,
String methodName,
ArrayList<Expr> args)
{
return new ObjectMethodExpr(loc, objExpr, methodName, args);
}
/**
* Creates a variable method call $a->${"foo"}(...).
*/
public Expr createMethodCall(Location loc,
Expr objExpr,
Expr methodName,
ArrayList<Expr> args)
{
return new ObjectMethodVarExpr(loc, objExpr, methodName, args);
}
/**
* Creates a class method call A::foo(...)
*/
public Expr createClassMethodCall(Location loc,
String className,
String methodName,
ArrayList<Expr> args)
{
return new ClassMethodExpr(loc, className, methodName, args);
}
/**
* Creates a class method call ${class}::foo(...)
*/
public Expr createClassMethodCall(Location loc,
Expr className,
String methodName,
ArrayList<Expr> args)
{
return new ClassVarMethodExpr(loc, className, methodName, args);
}
/**
* Creates a new function call based on the class context.
*/
public Expr createClassVirtualMethodCall(Location loc,
String methodName,
ArrayList<Expr> args)
{
return new ClassVirtualMethodExpr(loc, methodName, args);
}
/**
* Creates a new method A::$f()
*/
public Expr createClassMethodCall(Location loc,
String className,
Expr methodName,
ArrayList<Expr> args)
{
return new ClassMethodVarExpr(loc, className, methodName, args);
}
/**
* Creates a new method ${class}::$f()
*/
public Expr createClassMethodCall(Location loc,
Expr className,
Expr methodName,
ArrayList<Expr> args)
{
return new ClassVarMethodVarExpr(loc, className, methodName, args);
}
/**
* Creates a new method static::$f()
*/
public Expr createClassVirtualMethodCall(Location loc,
Expr var,
ArrayList<Expr> args)
{
return new ClassVirtualMethodVarExpr(loc, var, args);
}
/**
* Creates a class method call A::foo(...)
*/
public Expr createClassConstructor(Location loc,
String className,
String methodName,
ArrayList<Expr> args)
{
return new ClassConstructorExpr(loc, className, methodName, args);
}
/**
* Creates a parent method call parent::foo(...)
*
* XXX: isn't this lexical?
*/
/*
public Expr createParentClassMethod(Location loc,
String parentName,
String name,
ArrayList<Expr> args)
{
return new ParentMethodExpr(loc, parentName, name, args);
}
*/
/**
* Creates a static function call.
*/
/*
public Expr createStaticMethod(Location loc,
String className,
String name,
ArrayList<Expr> args)
{
return new StaticMethodExpr(loc, className, name, args);
}
*/
/**
* Creates a static function call based on the calling class.
*/
/*
public Expr createLateStaticBindingStaticMethod(Location loc,
String name,
ArrayList<Expr> args)
{
return new LateStaticBindingStaticMethodExpr(loc, name, args);
}
*/
/**
* Creates a new function call new foo(...).
*/
public ObjectNewExpr createNew(Location loc,
String name,
ArrayList<Expr> args)
{
return new ObjectNewExpr(loc, name, args);
}
/**
* Creates a new function call.
*/
public ObjectNewVarExpr createVarNew(Location loc,
Expr name,
ArrayList<Expr> args)
{
return new ObjectNewVarExpr(loc, name, args);
}
/**
* Creates an include expr
*/
public Expr createInclude(Location loc,
Path source,
Expr expr)
{
return new FunIncludeExpr(loc, source, expr, false);
}
/**
* Creates an include expr
*/
public Expr createRequire(Location loc,
Path source,
Expr expr)
{
return new FunIncludeExpr(loc, source, expr, true);
}
/**
* Creates an include expr
*/
public Expr createIncludeOnce(Location loc,
Path source,
Expr expr)
{
return new FunIncludeOnceExpr(loc, source, expr, false);
}
/**
* Creates an include expr
*/
public Expr createRequireOnce(Location loc,
Path source,
Expr expr)
{
return new FunIncludeOnceExpr(loc, source, expr, true);
}
/**
* Creates a Quercus class import.
*/
public Expr createImport(Location loc,
String name,
boolean isWildcard)
{
return new ImportExpr(loc, name, isWildcard);
}
//
// statements
//
/**
* Creates a null literal expression.
*/
public Statement createNullStatement()
{
return NullStatement.NULL;
}
/**
* Creates an echo statement
*/
public Statement createEcho(Location loc, Expr expr)
{
return new EchoStatement(loc, expr);
}
/**
* Creates an expr statement
*/
public Statement createExpr(Location loc, Expr expr)
{
return new ExprStatement(loc, expr);
}
public final Statement createBlock(Location loc,
ArrayList<Statement> statementList)
{
if (statementList.size() == 1)
return statementList.get(0);
Statement []statements = new Statement[statementList.size()];
statementList.toArray(statements);
return createBlockImpl(loc, statements);
}
public final Statement createBlock(Location loc, Statement []statementList)
{
if (statementList.length == 1)
return statementList[0];
Statement []statements = new Statement[statementList.length];
System.arraycopy(statementList, 0, statements, 0, statementList.length);
return createBlockImpl(loc, statements);
}
/**
* Creates an expr statement
*/
public final BlockStatement createBlockImpl(Location loc,
ArrayList<Statement> statementList
)
{
Statement []statements = new Statement[statementList.size()];
statementList.toArray(statements);
return createBlockImpl(loc, statements);
}
/**
* Creates an expr statement
*/
public BlockStatement createBlockImpl(Location loc, Statement []statements)
{
return new BlockStatement(loc, statements);
}
/**
* Creates a text statement
*/
public Statement createText(Location loc, String text)
{
return new TextStatement(loc, text);
}
/**
* Creates an if statement
*/
public Statement createIf(Location loc,
Expr test,
Statement trueBlock,
Statement falseBlock)
{
return new IfStatement(loc, test, trueBlock, falseBlock);
}
/**
* Creates a switch statement
*/
public Statement createSwitch(Location loc,
Expr value,
ArrayList<Expr[]> caseList,
ArrayList<BlockStatement> blockList,
Statement defaultBlock,
String label)
{
return new SwitchStatement(loc, value, caseList, blockList,
defaultBlock, label);
}
/**
* Creates a for statement
*/
public Statement createFor(Location loc,
Expr init,
Expr test,
Expr incr,
Statement block,
String label)
{
return new ForStatement(loc, init, test, incr, block, label);
}
/**
* Creates a foreach statement
*/
public Statement createForeach(Location loc,
Expr objExpr,
AbstractVarExpr key,
AbstractVarExpr value,
boolean isRef,
Statement block,
String label)
{
return new ForeachStatement(loc, objExpr, key, value, isRef,
block, label);
}
/**
* Creates a while statement
*/
public Statement createWhile(Location loc,
Expr test,
Statement block,
String label)
{
return new WhileStatement(loc, test, block, label);
}
/**
* Creates a do-while statement
*/
public Statement createDo(Location loc,
Expr test,
Statement block,
String label)
{
return new DoStatement(loc, test, block, label);
}
/**
* Creates a break statement
*/
public BreakStatement createBreak(Location location,
Expr target,
ArrayList<String> loopLabelList)
{
return new BreakStatement(location, target, loopLabelList);
}
/**
* Creates a continue statement
*/
public ContinueStatement createContinue(Location location,
Expr target,
ArrayList<String> loopLabelList)
{
return new ContinueStatement(location, target, loopLabelList);
}
/**
* Creates a global statement
*/
public Statement createGlobal(Location loc,
VarExpr var)
{
return new GlobalStatement(loc, var);
}
/**
* Creates a global var statement
*/
public Statement createVarGlobal(Location loc,
VarVarExpr var)
{
return new VarGlobalStatement(loc, var);
}
/**
* Creates a static statement inside a class
*/
public Statement createClassStatic(Location loc,
String className,
VarExpr var,
Expr value)
{
return new ClassStaticStatement(loc, className, var, value);
}
/**
* Creates a static statement
*/
public Statement createStatic(Location loc,
VarExpr var,
Expr value)
{
return new StaticStatement(loc, var, value);
}
/**
* Creates a throw statement
*/
public Statement createThrow(Location loc,
Expr value)
{
return new ThrowStatement(loc, value);
}
/**
* Creates a try statement
*/
public TryStatement createTry(Location loc,
Statement block)
{
return new TryStatement(loc, block);
}
/**
* Creates a return statement
*/
public Statement createReturn(Location loc,
Expr value)
{
return new ReturnStatement(loc, value);
}
/**
* Creates a return ref statement
*/
public Statement createReturnRef(Location loc,
Expr value)
{
return new ReturnRefStatement(loc, value);
}
/**
* Creates a new function definition def.
*/
public Statement createFunctionDef(Location loc,
Function fun)
{
return new FunctionDefStatement(loc, fun);
}
/**
* Creates a new function def statement
*/
public Statement createClassDef(Location loc,
InterpretedClassDef cl)
{
return new ClassDefStatement(loc, cl);
}
//
// functions
//
/**
* Creates a new FunctionInfo
*/
public FunctionInfo createFunctionInfo(QuercusContext quercus,
ClassDef classDef,
String name)
{
return new FunctionInfo(quercus, classDef, name);
}
/**
* Creates a new function definition.
*/
public Function createFunction(Location loc,
String name,
FunctionInfo info,
Arg []argList,
Statement []statementList)
{
return new Function(this, loc, name, info, argList, statementList);
}
/**
* Creates a new object method definition.
*/
public Function createObjectMethod(Location loc,
InterpretedClassDef cl,
String name,
FunctionInfo info,
Arg []argList,
Statement []statementList)
{
return new ObjectMethod(this, loc, cl, name, info, argList, statementList);
}
/**
* Creates a new object method definition.
*/
public Function createMethodDeclaration(Location loc,
InterpretedClassDef cl,
String name,
FunctionInfo info,
Arg []argList)
{
return new MethodDeclaration(this, loc, cl, name, info, argList);
}
public InterpretedClassDef createClassDef(Location location,
String name,
String parentName,
String[] ifaceList,
int index)
{
return new InterpretedClassDef(location,
name, parentName, ifaceList,
index);
}
}