001    /**
002     * www.jcoverage.com
003     * Copyright (C)2003 jcoverage ltd.
004     *
005     * This file is part of jcoverage.
006     *
007     * jcoverage is free software; you can redistribute it and/or modify
008     * it under the terms of the GNU General Public License as published
009     * by the Free Software Foundation; either version 2 of the License,
010     * or (at your option) any later version.
011     *
012     * jcoverage is distributed in the hope that it will be useful, but
013     * WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015     * General Public License for more details.
016     *
017     * You should have received a copy of the GNU General Public License
018     * along with jcoverage; if not, write to the Free Software
019     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020     * USA
021     *
022     */
023    package com.jcoverage.util;
024    
025    import java.lang.reflect.Method;
026    
027    import org.apache.bcel.Constants;
028    
029    import org.apache.bcel.classfile.ConstantClass;
030    import org.apache.bcel.classfile.ConstantUtf8;
031    
032    import org.apache.bcel.generic.ANEWARRAY;
033    import org.apache.bcel.generic.ArrayType;
034    import org.apache.bcel.generic.BasicType;
035    import org.apache.bcel.generic.BranchHandle;
036    import org.apache.bcel.generic.InstructionConstants;
037    import org.apache.bcel.generic.GOTO;
038    import org.apache.bcel.generic.ClassGen;
039    import org.apache.bcel.generic.ConstantPoolGen;
040    import org.apache.bcel.generic.FieldGen;
041    import org.apache.bcel.generic.IFNONNULL;
042    import org.apache.bcel.generic.InstructionFactory;
043    import org.apache.bcel.generic.InstructionList;
044    import org.apache.bcel.generic.InstructionHandle;
045    import org.apache.bcel.generic.InvokeInstruction;
046    import org.apache.bcel.generic.LDC;
047    import org.apache.bcel.generic.LocalVariableGen;
048    import org.apache.bcel.generic.LocalVariableInstruction;
049    import org.apache.bcel.generic.MethodGen;
050    import org.apache.bcel.generic.ObjectType;
051    import org.apache.bcel.generic.NEW;
052    
053    import org.apache.bcel.generic.Type;
054    
055    
056    public class ClassGenHelper {
057      final ClassGen cg;
058      final InstructionFactory factory;
059    
060      private ClassGenHelper(ClassGen cg) {
061        this.cg=cg;
062        this.factory=new InstructionFactory(cg);
063      }
064    
065      public static ClassGenHelper newInstance(ClassGen cg) {
066        return new ClassGenHelper(cg);
067      }
068    
069      public ClassGen getClassGen() {
070        return cg;
071      }
072      public ConstantPoolGen getConstantPool() {
073        return cg.getConstantPool();
074      }
075    
076      private InstructionList createInvoke(Class cl,String methodName,Class returnType,Type[] parameterTypes,short kind) {
077        InstructionList il=new InstructionList();
078        il.append(factory.createInvoke(cl.getName(),methodName,TypeHelper.getType(returnType),parameterTypes,kind));
079        return il;
080      }
081    
082      public InstructionList createInvokeVirtual(Class cl,String methodName,Class returnType) {
083        return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKEVIRTUAL);
084      }
085    
086      public InstructionList createInvokeVirtual(Class cl,String methodName,Class returnType,Class signature) {
087        return createInvokeVirtual(cl,methodName,returnType,new Class[]{signature});
088      }
089      public InstructionList createInvokeVirtual(Class cl,String methodName,Class returnType,Class[] signature) {
090        return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKEVIRTUAL);
091      }
092    
093      public InstructionList createInvokeStatic(Class cl,String methodName,Class returnType) {
094        return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKESTATIC);
095      }
096    
097      public InstructionList createInvokeStatic(Class cl,String methodName,Class returnType,Class[] signature) {
098        return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKESTATIC);
099      }
100    
101      public InstructionList createInvokeInterface(Class cl,String methodName,Class returnType) {
102        return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKEINTERFACE);
103      }
104    
105      public InstructionList createInvokeInterface(Class cl,String methodName,Class returnType,Class signature) {
106        return createInvokeInterface(cl,methodName,returnType,new Class[]{signature});
107      }
108    
109      public InstructionList createInvokeInterface(Class cl,String methodName,Class returnType,Class[] signature) {
110        return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKEINTERFACE);
111      }
112    
113      public InstructionList createInvokeSpecial(Class cl,String methodName,Class returnType) {
114        return createInvoke(cl,methodName,returnType,Type.NO_ARGS,Constants.INVOKESPECIAL);
115      }
116    
117      public InstructionList createInvokeSpecial(Class cl,String methodName,Class returnType,Class[] signature) {
118        return createInvoke(cl,methodName,returnType,TypeHelper.getTypes(signature),Constants.INVOKESPECIAL);
119      }
120    
121      public InstructionList createInvokeSpecial(Method m) {
122        return createInvokeSpecial(m.getDeclaringClass(),m.getName(),m.getReturnType(),m.getParameterTypes());
123      }
124    
125      public String getClassName(InstructionHandle handleToInvokeInstruction) {
126        return getClassName((InvokeInstruction)handleToInvokeInstruction.getInstruction());
127      }
128    
129      public String getClassName(InvokeInstruction invoke) {
130        return invoke.getClassName(getConstantPool());
131      }
132    }