summaryrefslogblamecommitdiff
path: root/sources/scalac/atree/ATreeFactory.java
blob: 0c09650a16bf7c3438fe94b6963400f012f39ca8 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                                          

                                                        






                                                                              








                                                 
                                                                              
                                     
 
                              





                                             
                                  





                                                       
                              





                                                   
                               





                                                                 
                                

                                                                           



                         
























                                                                             
                               





                                                                     
                             





                                                                       
                                

                                                                           



                         
                                      





                                                                  
                               





                                                                               
                               





                                                                            
                              





                                                            
                                





                                                               
                               





                                              
                              






                                                                              






















































































































































































































































                                                                               
                                                    



























                                                                              























































































                                                                              
 
/*     ____ ____  ____ ____  ______                                     *\
**    / __// __ \/ __// __ \/ ____/    SOcos COmpiles Scala             **
**  __\_ \/ /_/ / /__/ /_/ /\_ \       (c) 2002, LAMP/EPFL              **
** /_____/\____/\___/\____/____/                                        **
\*                                                                      */

// $Id$

package scalac.atree;

import scalac.ast.Tree;
import scalac.symtab.Symbol;
import scalac.symtab.Type;

/** This class implements an attributed tree factory. */
public class ATreeFactory {

    //########################################################################
    // Public Fields

    /** The unique Void node */
    public final ACode Void = ACode.Void;

    /** The unique UNIT constant */
    public final AConstant UNIT = AConstant.UNIT;

    /** The unique NULL constant */
    public final AConstant NULL = AConstant.NULL;

    /** The unique ZERO constant */
    public final AConstant ZERO = AConstant.ZERO;

    //########################################################################
    // Public Methods - Building code

    /** Builds a This node. */
    public ACode This(Tree t, Symbol clasz) {
        ACode.This code = ACode.This(clasz);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Constant node. */
    public ACode Constant(Tree t, AConstant constant) {
        ACode.Constant code = ACode.Constant(constant);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Load node. */
    public ACode Load(Tree t, ALocation location) {
        ACode.Load code = ACode.Load(location);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Store node. */
    public ACode Store(Tree t, ALocation location, ACode value) {
        ACode.Store code = ACode.Store(location, value);
        code.pos = t.pos;
        return code;
    }

    /** Builds an Apply node. */
    public ACode Apply(Tree t, AFunction function, Type[] ts, ACode[] vs) {
        ACode.Apply code = ACode.Apply(function, ts, vs);
        code.pos = t.pos;
        return code;
    }

    /** Builds an Apply node. */
    public ACode Apply(Tree t, AFunction function, Type[] ts) {
        return Apply(t, function, ts, ACode.EMPTY_ARRAY);
    }

    /** Builds an Apply node. */
    public ACode Apply(Tree t, AFunction function, ACode[] vs) {
        return Apply(t, function, Type.EMPTY_ARRAY, vs);
    }

    /** Builds an Apply node. */
    public ACode Apply(Tree t, AFunction function) {
        return Apply(t, function, Type.EMPTY_ARRAY, ACode.EMPTY_ARRAY);
    }

    /** Builds an Apply node. */
    public ACode Apply(Tree t, APrimitive primitive, ACode v0) {
        return Apply(t, AFunction.Primitive(primitive), new ACode[] {v0});
    }

    /** Builds an Apply node. */
    public ACode Apply(Tree t, APrimitive primitive, ACode v0, ACode v1) {
        return Apply(t, AFunction.Primitive(primitive), new ACode[] {v0,v1});
    }

    /** Builds an IsAs node. */
    public ACode IsAs(Tree t, ACode value, Type type, boolean cast) {
        ACode.IsAs code = ACode.IsAs(value, type, cast);
        code.pos = t.pos;
        return code;
    }

    /** Builds an If node. */
    public ACode If(Tree t, ACode test, ACode success, ACode failure) {
        ACode.If code = ACode.If(test, success, failure);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Switch node. */
    public ACode Switch(Tree t, ACode test, int[][] tags, ACode[] bodies) {
        ACode.Switch code = ACode.Switch(test, tags, bodies);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Synchronized node. */
    public ACode Synchronized(Tree t, ACode lock, ACode value) {
        ACode.Synchronized code = ACode.Synchronized(lock, value);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Block node. */
    public ACode Block(Tree t, Symbol[] locals,ACode[] statements,ACode value){
        ACode.Block code = ACode.Block(locals, statements, value);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Label node. */
    public ACode Label(Tree t, Symbol label, Symbol[] locals, ACode value) {
        ACode.Label code = ACode.Label(label, locals, value);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Goto node. */
    public ACode Goto(Tree t, Symbol label, ACode[] vargs) {
        ACode.Goto code = ACode.Goto(label, vargs);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Return node. */
    public ACode Return(Tree t, Symbol function, ACode value) {
        ACode.Return code = ACode.Return(function, value);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Throw node. */
    public ACode Throw(Tree t, ACode value) {
        ACode.Throw code = ACode.Throw(value);
        code.pos = t.pos;
        return code;
    }

    /** Builds a Drop node. */
    public ACode Drop(Tree t, ACode value, Type type) {
        ACode.Drop code = ACode.Drop(value, type);
        code.pos = t.pos;
        return code;
    }

    //########################################################################
    // Public Methods - Building primitive operations

    /** Builds a negation operation */
    public ACode NOT(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, NOT(kind), v0);
    }

    /** Builds an EQ operation */
    public ACode EQ(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, EQ(kind, true), v0);
    }

    /** Builds a NE  operation */
    public ACode NE(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, NE(kind, true), v0);
    }

    /** Builds a LT operation */
    public ACode LT(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, LT(kind, true), v0);
    }

    /** Builds a GE operation */
    public ACode GE(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, GE(kind, true), v0);
    }

    /** Builds a LE operation */
    public ACode LE(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, LE(kind, true), v0);
    }

    /** Builds a GT operation */
    public ACode GT(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, GT(kind, true), v0);
    }

    /** Builds an EQ operation */
    public ACode EQ(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, EQ(kind, false), v0, v1);
    }

    /** Builds a NE  operation */
    public ACode NE(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, NE(kind, false), v0, v1);
    }

    /** Builds a LT operation */
    public ACode LT(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, LT(kind, false), v0, v1);
    }

    /** Builds a GE operation */
    public ACode GE(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, GE(kind, false), v0, v1);
    }

    /** Builds a LE operation */
    public ACode LE(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, LE(kind, false), v0, v1);
    }

    /** Builds a GT operation */
    public ACode GT(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, GT(kind, false), v0, v1);
    }

    /** Builds a CMPL operation */
    public ACode CMPL(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, CMPL(kind), v0, v1);
    }

    /** Builds a CMP operation */
    public ACode CMP(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, CMP(kind), v0, v1);
    }

    /** Builds a CMPG operation */
    public ACode CMPG(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, CMPG(kind), v0, v1);
    }

    /** Builds an ADD operation */
    public ACode ADD(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, ADD(kind), v0, v1);
    }

    /** Builds a SUB operation */
    public ACode SUB(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, SUB(kind), v0, v1);
    }

    /** Builds a MUL operation */
    public ACode MUL(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, MUL(kind), v0, v1);
    }

    /** Builds a DIV operation */
    public ACode DIV(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, DIV(kind), v0, v1);
    }

    /** Builds a REM operation */
    public ACode REM(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, REM(kind), v0, v1);
    }

    /** Builds an AND operation. */
    public ACode AND(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, AND(kind), v0, v1);
    }

    /** Builds an OR operation. */
    public ACode OR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, OR(kind), v0, v1);
    }

    /** Builds an XOR operation. */
    public ACode XOR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, XOR(kind), v0, v1);
    }

    /** Builds a LSL operation. */
    public ACode LSL(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, LSL(kind), v0, v1);
    }

    /** Builds a LSR operation. */
    public ACode LSR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, LSR(kind), v0, v1);
    }

    /** Builds an ASR operation. */
    public ACode ASR(Tree t, ATypeKind kind, ACode v0, ACode v1) {
        return Apply(t, ASR(kind), v0, v1);
    }

    /** Builds a value conversion operation. */
    public ACode CONVERT(Tree t, ATypeKind src, ATypeKind dst, ACode v0) {
        return Apply(t, CONVERT(src, dst), v0);
    }

    /** Builds an array length operation. */
    public ACode LENGTH(Tree t, ATypeKind kind, ACode v0) {
        return Apply(t, LENGTH(kind), v0);
    }

    /** Builds a string concatenation operation. */
    public ACode CONCAT(Tree t, ATypeKind lf, ATypeKind rg, ACode v0,ACode v1){
        return Apply(t, CONCAT(lf, rg), v0, v1);
    }

    //########################################################################
    // Public Methods - Building primitives

    /** Builds a negation primitive */
    public APrimitive NOT(ATypeKind kind) {
        return APrimitive.Negation(kind);
    }

    /** Builds an EQ primitive */
    public APrimitive EQ(ATypeKind kind, boolean zero) {
        return APrimitive.Test(ATestOp.EQ, kind, zero);
    }

    /** Builds a NE  primitive */
    public APrimitive NE(ATypeKind kind, boolean zero) {
        return APrimitive.Test(ATestOp.NE, kind, zero);
    }

    /** Builds a LT primitive */
    public APrimitive LT(ATypeKind kind, boolean zero) {
        return APrimitive.Test(ATestOp.LT, kind, zero);
    }

    /** Builds a GE primitive */
    public APrimitive GE(ATypeKind kind, boolean zero) {
        return APrimitive.Test(ATestOp.GE, kind, zero);
    }

    /** Builds a LE primitive */
    public APrimitive LE(ATypeKind kind, boolean zero) {
        return APrimitive.Test(ATestOp.LE, kind, zero);
    }

    /** Builds a GT primitive */
    public APrimitive GT(ATypeKind kind, boolean zero) {
        return APrimitive.Test(ATestOp.GT, kind, zero);
    }

    /** Builds a CMPL primitive */
    public APrimitive CMPL(ATypeKind kind) {
        return APrimitive.Comparison(AComparisonOp.CMPL, kind);
    }

    /** Builds a CMP primitive */
    public APrimitive CMP(ATypeKind kind) {
        return APrimitive.Comparison(AComparisonOp.CMP, kind);
    }

    /** Builds a CMPG primitive */
    public APrimitive CMPG(ATypeKind kind) {
        return APrimitive.Comparison(AComparisonOp.CMPG, kind);
    }

    /** Builds an ADD primitive */
    public APrimitive ADD(ATypeKind kind) {
        return APrimitive.Arithmetic(AArithmeticOp.ADD, kind);
    }

    /** Builds a SUB primitive */
    public APrimitive SUB(ATypeKind kind) {
        return APrimitive.Arithmetic(AArithmeticOp.SUB, kind);
    }

    /** Builds a MUL primitive */
    public APrimitive MUL(ATypeKind kind) {
        return APrimitive.Arithmetic(AArithmeticOp.MUL, kind);
    }

    /** Builds a DIV primitive */
    public APrimitive DIV(ATypeKind kind) {
        return APrimitive.Arithmetic(AArithmeticOp.DIV, kind);
    }

    /** Builds a REM primitive */
    public APrimitive REM(ATypeKind kind) {
        return APrimitive.Arithmetic(AArithmeticOp.REM, kind);
    }

    /** Builds an AND primitive. */
    public APrimitive AND(ATypeKind kind) {
        return APrimitive.Logical(ALogicalOp.AND, kind);
    }

    /** Builds an OR primitive. */
    public APrimitive OR(ATypeKind kind) {
        return APrimitive.Logical(ALogicalOp.OR, kind);
    }

    /** Builds an XOR primitive. */
    public APrimitive XOR(ATypeKind kind) {
        return APrimitive.Logical(ALogicalOp.XOR, kind);
    }

    /** Builds a LSL primitive. */
    public APrimitive LSL(ATypeKind kind) {
        return APrimitive.Shift(AShiftOp.LSL, kind);
    }

    /** Builds a LSR primitive. */
    public APrimitive LSR(ATypeKind kind) {
        return APrimitive.Shift(AShiftOp.LSR, kind);
    }

    /** Builds an ASR primitive. */
    public APrimitive ASR(ATypeKind kind) {
        return APrimitive.Shift(AShiftOp.ASR, kind);
    }

    /** Builds a value conversion primitive. */
    public APrimitive CONVERT(ATypeKind src, ATypeKind dst) {
        return APrimitive.Conversion(src, dst);
    }

    /** Builds an array length primitive. */
    public APrimitive LENGTH(ATypeKind kind) {
        return APrimitive.ArrayLength(kind);
    }

    /** Builds a string concatenation primitive. */
    public APrimitive CONCAT(ATypeKind lf, ATypeKind rg) {
        return APrimitive.StringConcat(lf, rg);
    }

    //########################################################################
    // Public Methods - Building constants

    /** Builds a BOOLEAN constant of given value. */
    public AConstant BOOLEAN(Boolean value) {
        return BOOLEAN(value.booleanValue());
    }

    /** Builds a BOOLEAN constant of given value. */
    public AConstant BOOLEAN(boolean value) {
        return AConstant.BOOLEAN(value);
    }

    /** Builds a BYTE constant of given value. */
    public AConstant BYTE(Byte value) {
        return BYTE(value.byteValue());
    }

    /** Builds a BYTE constant of given value. */
    public AConstant BYTE(byte value) {
        return AConstant.BYTE(value);
    }

    /** Builds a SHORT constant of given value. */
    public AConstant SHORT(Short value) {
        return SHORT(value.shortValue());
    }

    /** Builds a SHORT constant of given value. */
    public AConstant SHORT(short value) {
        return AConstant.SHORT(value);
    }

    /** Builds a CHAR constant of given value. */
    public AConstant CHAR(Character value) {
        return CHAR(value.charValue());
    }

    /** Builds a CHAR constant of given value. */
    public AConstant CHAR(char value) {
        return AConstant.CHAR(value);
    }

    /** Builds an INT constant of given value. */
    public AConstant INT(Integer value) {
        return INT(value.intValue());
    }

    /** Builds an INT constant of given value. */
    public AConstant INT(int value) {
        return AConstant.INT(value);
    }

    /** Builds a LONG constant of given value. */
    public AConstant LONG(Long value) {
        return LONG(value.longValue());
    }

    /** Builds a LONG constant of given value. */
    public AConstant LONG(long value) {
        return AConstant.LONG(value);
    }

    /** Builds a FLOAT constant of given value. */
    public AConstant FLOAT(Float value) {
        return FLOAT(value.floatValue());
    }

    /** Builds a FLOAT constant of given value. */
    public AConstant FLOAT(float value) {
        return AConstant.FLOAT(value);
    }

    /** Builds a DOUBLE constant of given value. */
    public AConstant DOUBLE(Double value) {
        return DOUBLE(value.doubleValue());
    }

    /** Builds a DOUBLE constant of given value. */
    public AConstant DOUBLE(double value) {
        return AConstant.DOUBLE(value);
    }

    /** Builds a STRING constant of given value. */
    public AConstant STRING(String value) {
        return AConstant.STRING(value);
    }

    //########################################################################
}