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    }