jtulach@144: /* jtulach@144: * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. jtulach@144: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jtulach@144: * jtulach@144: * This code is free software; you can redistribute it and/or modify it jtulach@144: * under the terms of the GNU General Public License version 2 only, as jtulach@144: * published by the Free Software Foundation. Oracle designates this jtulach@144: * particular file as subject to the "Classpath" exception as provided jtulach@144: * by Oracle in the LICENSE file that accompanied this code. jtulach@144: * jtulach@144: * This code is distributed in the hope that it will be useful, but WITHOUT jtulach@144: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jtulach@144: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jtulach@144: * version 2 for more details (a copy is included in the LICENSE file that jtulach@144: * accompanied this code). jtulach@144: * jtulach@144: * You should have received a copy of the GNU General Public License version jtulach@144: * 2 along with this work; if not, write to the Free Software Foundation, jtulach@144: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jtulach@144: * jtulach@144: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jtulach@144: * or visit www.oracle.com if you need additional information or have any jtulach@144: * questions. jtulach@144: */ jtulach@144: jtulach@144: jtulach@167: package org.apidesign.javap; jtulach@144: jtulach@144: import java.util.*; jtulach@144: import java.io.*; jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature. jtulach@144: * jtulach@144: * @author Sucheta Dambalkar jtulach@144: */ jtulach@144: public class TypeSignature { jtulach@144: jtulach@144: String parameters = null; jtulach@144: String returntype = null; jtulach@144: String fieldtype = null; jtulach@144: int argumentlength = 0; jtulach@144: jtulach@144: public TypeSignature(String JVMSignature){ jtulach@144: jtulach@144: if(JVMSignature != null){ jtulach@144: if(JVMSignature.indexOf("(") == -1){ jtulach@144: //This is a field type. jtulach@144: this.fieldtype = getFieldTypeSignature(JVMSignature); jtulach@144: }else { jtulach@144: String parameterdes = null; jtulach@144: if((JVMSignature.indexOf(")")-1) > (JVMSignature.indexOf("("))){ jtulach@144: //Get parameter signature. jtulach@144: parameterdes = jtulach@144: JVMSignature.substring(JVMSignature.indexOf("(")+1, jtulach@144: JVMSignature.indexOf(")")); jtulach@144: this.parameters = getParametersHelper(parameterdes); jtulach@144: }else this.parameters = "()"; jtulach@144: //Get return type signature. jtulach@144: String returndes = JVMSignature.substring(JVMSignature.lastIndexOf(")")+1); jtulach@144: this.returntype = getReturnTypeHelper(returndes); jtulach@144: } jtulach@144: } jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature of a field. jtulach@144: */ jtulach@144: public String getFieldTypeSignature(String fielddes){ jtulach@144: if(fielddes.startsWith("L")){ jtulach@144: return(getObjectType(fielddes)); jtulach@144: }else if(fielddes.startsWith("[")){ jtulach@144: return(getArrayType(fielddes)); jtulach@144: }else jtulach@144: return(getBaseType(fielddes)); jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature of a parameter. jtulach@144: */ jtulach@144: public String getParametersHelper(String parameterdes){ jtulach@144: Vector parameters = new Vector(); jtulach@144: int startindex = -1; jtulach@144: int endindex = -1; jtulach@144: String param = ""; jtulach@144: jtulach@144: while(parameterdes != null){ jtulach@144: jtulach@144: if(parameterdes.startsWith("L")){ jtulach@144: //parameter is a object. jtulach@144: startindex = parameterdes.indexOf("L"); jtulach@144: endindex = parameterdes.indexOf(";"); jtulach@144: if(startindex < parameterdes.length()) { jtulach@144: if(endindex == parameterdes.length()-1) { jtulach@144: //last parameter jtulach@144: param = parameterdes.substring(startindex); jtulach@144: parameterdes = null; jtulach@144: }else if(endindex+1 < parameterdes.length()){ jtulach@144: //rest parameters jtulach@144: param = parameterdes.substring(startindex, endindex+1); jtulach@144: parameterdes = parameterdes.substring(endindex+1); jtulach@144: jtulach@144: } jtulach@144: parameters.add(getObjectType(param)); jtulach@144: } jtulach@144: }else if(parameterdes.startsWith("[")){ jtulach@144: //parameter is an array. jtulach@144: String componentType = ""; jtulach@144: int enddim = -1; jtulach@144: int st = 0; jtulach@144: while(true){ jtulach@144: if(st < parameterdes.length()){ jtulach@144: if(parameterdes.charAt(st) == '['){ jtulach@144: jtulach@144: enddim = st; jtulach@144: st++; jtulach@144: } jtulach@144: else break; jtulach@144: } jtulach@144: else break; jtulach@144: } jtulach@144: jtulach@144: if(enddim+1 < parameterdes.length()){ jtulach@144: /* Array dimension.*/ jtulach@144: param = parameterdes.substring(0,enddim+1); jtulach@144: jtulach@144: } jtulach@144: jtulach@144: int stotherparam = param.lastIndexOf("[")+1; jtulach@144: jtulach@144: if(stotherparam < parameterdes.length()){ jtulach@144: componentType = parameterdes.substring(stotherparam); jtulach@144: } jtulach@144: jtulach@144: if(componentType.startsWith("L")){ jtulach@144: //parameter is array of objects. jtulach@144: startindex = parameterdes.indexOf("L"); jtulach@144: endindex = parameterdes.indexOf(";"); jtulach@144: jtulach@144: if(endindex == parameterdes.length()-1){ jtulach@144: //last parameter jtulach@144: param += parameterdes.substring(startindex); jtulach@144: parameterdes = null; jtulach@144: }else if(endindex+1 < parameterdes.length()){ jtulach@144: //rest parameters jtulach@144: param += parameterdes.substring(startindex, endindex+1); jtulach@144: parameterdes = parameterdes.substring(endindex+1); jtulach@144: } jtulach@144: }else{ jtulach@144: //parameter is array of base type. jtulach@144: if(componentType.length() == 1){ jtulach@144: //last parameter. jtulach@144: param += componentType; jtulach@144: parameterdes = null; jtulach@144: } jtulach@144: else if (componentType.length() > 1) { jtulach@144: //rest parameters. jtulach@144: param += componentType.substring(0,1); jtulach@144: parameterdes = componentType.substring(1); jtulach@144: } jtulach@144: } jtulach@144: parameters.add(getArrayType(param)); jtulach@144: jtulach@144: jtulach@144: }else { jtulach@144: jtulach@144: //parameter is of base type. jtulach@144: if(parameterdes.length() == 1){ jtulach@144: //last parameter jtulach@144: param = parameterdes; jtulach@144: parameterdes = null; jtulach@144: } jtulach@144: else if (parameterdes.length() > 1) { jtulach@144: //rest parameters. jtulach@144: param = parameterdes.substring(0,1); jtulach@144: parameterdes = parameterdes.substring(1); jtulach@144: } jtulach@144: parameters.add(getBaseType(param)); jtulach@144: } jtulach@144: } jtulach@144: jtulach@144: /* number of arguments of a method.*/ jtulach@144: argumentlength = parameters.size(); jtulach@144: jtulach@144: /* java type signature.*/ jtulach@144: String parametersignature = "("; jtulach@144: int i; jtulach@144: jtulach@144: for(i = 0; i < parameters.size(); i++){ jtulach@144: parametersignature += (String)parameters.elementAt(i); jtulach@144: if(i != parameters.size()-1){ jtulach@144: parametersignature += ", "; jtulach@144: } jtulach@144: } jtulach@144: parametersignature += ")"; jtulach@144: return parametersignature; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for a return type. jtulach@144: */ jtulach@144: public String getReturnTypeHelper(String returndes){ jtulach@144: return getFieldTypeSignature(returndes); jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for a base type. jtulach@144: */ jtulach@144: public String getBaseType(String baseType){ jtulach@144: if(baseType != null){ jtulach@144: if(baseType.equals("B")) return "byte"; jtulach@144: else if(baseType.equals("C")) return "char"; jtulach@144: else if(baseType.equals("D")) return "double"; jtulach@144: else if(baseType.equals("F")) return "float"; jtulach@144: else if(baseType.equals("I")) return "int"; jtulach@144: else if(baseType.equals("J")) return "long"; jtulach@144: else if(baseType.equals("S")) return "short"; jtulach@144: else if(baseType.equals("Z")) return "boolean"; jtulach@144: else if(baseType.equals("V")) return "void"; jtulach@144: } jtulach@144: return null; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for a object type. jtulach@144: */ jtulach@144: public String getObjectType(String JVMobjectType) { jtulach@144: String objectType = ""; jtulach@144: int startindex = JVMobjectType.indexOf("L")+1; jtulach@144: int endindex = JVMobjectType.indexOf(";"); jtulach@144: if((startindex != -1) && (endindex != -1)){ jtulach@144: if((startindex < JVMobjectType.length()) && (endindex < JVMobjectType.length())){ jtulach@144: objectType = JVMobjectType.substring(startindex, endindex); jtulach@144: } jtulach@144: objectType = objectType.replace('/','.'); jtulach@144: return objectType; jtulach@144: } jtulach@144: return null; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for array type. jtulach@144: */ jtulach@144: public String getArrayType(String arrayType) { jtulach@144: if(arrayType != null){ jtulach@144: String dimention = ""; jtulach@144: jtulach@144: while(arrayType.indexOf("[") != -1){ jtulach@144: dimention += "[]"; jtulach@144: jtulach@144: int startindex = arrayType.indexOf("[")+1; jtulach@144: if(startindex <= arrayType.length()){ jtulach@144: arrayType = arrayType.substring(startindex); jtulach@144: } jtulach@144: } jtulach@144: jtulach@144: String componentType = ""; jtulach@144: if(arrayType.startsWith("L")){ jtulach@144: componentType = getObjectType(arrayType); jtulach@144: }else { jtulach@144: componentType = getBaseType(arrayType); jtulach@144: } jtulach@144: return componentType+dimention; jtulach@144: } jtulach@144: return null; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for parameters. jtulach@144: */ jtulach@144: public String getParameters(){ jtulach@144: return parameters; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for return type. jtulach@144: */ jtulach@144: public String getReturnType(){ jtulach@144: return returntype; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Returns java type signature for field type. jtulach@144: */ jtulach@144: public String getFieldType(){ jtulach@144: return fieldtype; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Return number of arguments of a method. jtulach@144: */ jtulach@144: public int getArgumentlength(){ jtulach@144: return argumentlength; jtulach@144: } jtulach@144: }