/* Soot - a J*va Optimization Framework
 * Copyright (C) 1999 Patrick Lam
 * Copyright (C) 2004 Ondrej Lhotak
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
 * Modified by the Sable Research Group and others 1997-1999.  
 * See the 'credits' file distributed with Soot for the complete list of
 * contributors.  (Soot is distributed at http://www.sable.mcgill.ca/soot)
 */






package soot.grimp.internal;

import soot.*;
import soot.grimp.*;
import soot.jimple.internal.*;
import soot.jimple.*;
import soot.grimp.*;
import soot.jimple.internal.*;
import soot.util.*;
import java.util.*;

public class GNewInvokeExpr extends AbstractStaticInvokeExpr
    implements NewInvokeExpr, Precedence
{
    RefType type;

    public GNewInvokeExpr(RefType type, SootMethodRef methodRef, List args)
    {
            super(methodRef, new ExprBox[args.size()]);

        this.type = type;
        
        for(int i = 0; i < args.size(); i++)
            this.argBoxes[i] = Grimp.v().newExprBox((Value) args.get(i));
    }

    /*
    protected GNewInvokeExpr(RefType type, ExprBox[] argBoxes)
    {
        this.type = type;
        this.argBoxes = argBoxes;
    }
    */
    
    public RefType getBaseType()
    {
        return type;
    }
    
    public void setBaseType(RefType type)
    {
        this.type = type;
    }

    public Type getType()
    {
        return type;
    }    
    
    public int getPrecedence() { return 850; }

    public String toString()
    {
        StringBuffer buffer = new StringBuffer();

        buffer.append("new " + type.toString() + "(");

        for(int i = 0; i < argBoxes.length; i++)
        {
            if(i != 0)
                buffer.append(", ");

            buffer.append(argBoxes[i].getValue().toString());
        }

        buffer.append(")");

        return buffer.toString();
    }

    public void toString(UnitPrinter up)
    {
        up.literal("new");
        up.literal(" ");
        up.type(type);
        up.literal("(");

        for(int i = 0; i < argBoxes.length; i++)
        {
            if(i != 0)
                up.literal(", ");

            argBoxes[i].toString(up);
        }

        up.literal(")");
    }


    public List getUseBoxes()
    {
        List list = new ArrayList();

        for(int i = 0; i < argBoxes.length; i++)
        {
            list.addAll(argBoxes[i].getValue().getUseBoxes());
            list.add(argBoxes[i]);
        }
        
        return list;
    }

    public void apply(Switch sw)
    {
        ((GrimpValueSwitch) sw).caseNewInvokeExpr(this);
    }
    
    public Object clone() 
    {
        ArrayList clonedArgs = new ArrayList(getArgCount());

        for(int i = 0; i < getArgCount(); i++) {
            clonedArgs.add(i, Grimp.cloneIfNecessary(getArg(i)));
            
        }
        
        return new  GNewInvokeExpr(getBaseType(), methodRef, clonedArgs);
    }

}

@@ -1336,14 +1336,8 @@
 ract
-Static
 Invo
@@ -1499,28 +1499,144 @@
     
-    super(methodRef,
+if( methodRef.isStatic() ) throw new RuntimeException(%22wrong static-ness%22);%0A%0A        this.methodRef = methodRef;%0A        this.argBoxes =
  new
@@ -1656,19 +1656,18 @@
 .size()%5D
-);%0A
+; 
 %0A       
@@ -3701,11 +3701,761 @@
 ;%0A    %7D%0A
+    public boolean equivTo(Object o)%0A    %7B%0A        if (o instanceof GNewInvokeExpr)%0A        %7B%0A            GNewInvokeExpr ie = (GNewInvokeExpr)o;%0A            if (!(getMethod().equals(ie.getMethod()) && %0A                  argBoxes.length == ie.argBoxes.length))%0A                return false;%0A            for (int i = 0; i %3C argBoxes.length; i++)%0A                if (!(argBoxes%5Bi%5D.getValue().equivTo(ie.argBoxes%5Bi%5D.getValue())))%0A                    return false;%0A            if( !type.equals(ie.type) ) return false;%0A            return true;%0A        %7D%0A        return false;%0A    %7D%0A %0A    /** Returns a hash code for this object, consistent with structural equality. */%0A    public int equivHashCode()%0A    %7B%0A        return getMethod().equivHashCode();%0A    %7D
 %0A%7D%0A

Make GNewInvokeExpr extend AbstractInvokeExpr instead of AbstractStaticInvokeExpr.