001 package org.mesopotamia.lang.java.ref.bcel; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import org.apache.bcel.classfile.ExceptionTable; 007 import org.apache.bcel.classfile.Method; 008 import org.apache.bcel.generic.Type; 009 import org.apache.bcel.util.Repository; 010 import org.mesopotamia.lang.java.ref.MethodInfo; 011 import org.mesopotamia.lang.java.ref.Scope; 012 import org.mesopotamia.lang.java.ref.TypeInfo; 013 import org.mesopotamia.lang.java.ref.TypeInfoImpl; 014 import org.mesopotamia.lang.java.ref.TypeSpecInfo; 015 016 public class JavaClassMethodInfo implements MethodInfo { 017 018 private Method method; 019 private JavaClassTypeInfoRepository repository; 020 private TypeInfo declaringType; 021 private Scope scope; 022 023 JavaClassMethodInfo(Method method, Scope scope, JavaClassTypeInfoRepository repository, TypeInfo declaringType) { 024 this.method = method; 025 this.repository = repository; 026 this.declaringType = declaringType; 027 this.scope = scope; 028 } 029 030 031 public List<TypeInfo> getExceptionTypes() { 032 List<TypeInfo> ret = new ArrayList<TypeInfo>(); 033 ExceptionTable et = method.getExceptionTable(); 034 if (et!=null) { 035 String[] ena = et.getExceptionNames(); 036 for (int i=0; i<ena.length; ++i) { 037 TypeInfo eType = repository.getTypeInfo(ena[i], scope); 038 ret.add(eType==null ? new TypeInfoImpl(ena[i]) : eType); 039 } 040 } 041 return ret; 042 } 043 044 public List<TypeSpecInfo> getParameterTypes() { 045 List<TypeSpecInfo> ret = new ArrayList<TypeSpecInfo>(); 046 Type[] at = method.getArgumentTypes(); 047 for (int i=0; i<at.length; ++i) { 048 ret.add(JavaClassTypeInfo.type2TypeSpecInfo(at[i], scope, repository)); 049 } 050 return ret; 051 } 052 053 public TypeSpecInfo getReturnType() { 054 return JavaClassTypeInfo.type2TypeSpecInfo(method.getReturnType(), scope, repository); 055 } 056 057 public TypeInfo getDeclaringType() { 058 return declaringType; 059 } 060 061 public String getFcn() { 062 StringBuffer ret = new StringBuffer(declaringType.getFcn()); 063 ret.append("."); 064 ret.append(method.getName()); 065 ret.append("("); 066 Type[] at = method.getArgumentTypes(); 067 for (int i=0; i<at.length; ++i) { 068 if (i>0) { 069 ret.append(","); 070 } 071 ret.append(at[i].toString()); 072 } 073 ret.append(")"); 074 return ret.toString(); 075 } 076 077 public List<String> getModifiers() { 078 return JavaClassTypeInfo.modifiersList(method.getModifiers()); 079 } 080 081 public String getName() { 082 return method.getName(); 083 } 084 085 @Override 086 public String toString() { 087 return method.getSignature() + " ["+getClass().getName()+"]"; 088 } 089 090 }