1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/javap/src/main/java/org/apidesign/javap/TypeSignature.java Wed Dec 12 12:37:41 2012 +0100
1.3 @@ -0,0 +1,295 @@
1.4 +/*
1.5 + * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1.7 + *
1.8 + * This code is free software; you can redistribute it and/or modify it
1.9 + * under the terms of the GNU General Public License version 2 only, as
1.10 + * published by the Free Software Foundation. Oracle designates this
1.11 + * particular file as subject to the "Classpath" exception as provided
1.12 + * by Oracle in the LICENSE file that accompanied this code.
1.13 + *
1.14 + * This code is distributed in the hope that it will be useful, but WITHOUT
1.15 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1.16 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
1.17 + * version 2 for more details (a copy is included in the LICENSE file that
1.18 + * accompanied this code).
1.19 + *
1.20 + * You should have received a copy of the GNU General Public License version
1.21 + * 2 along with this work; if not, write to the Free Software Foundation,
1.22 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1.23 + *
1.24 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1.25 + * or visit www.oracle.com if you need additional information or have any
1.26 + * questions.
1.27 + */
1.28 +
1.29 +
1.30 +package org.apidesign.javap;
1.31 +
1.32 +import java.util.*;
1.33 +import java.io.*;
1.34 +
1.35 +/**
1.36 + * Returns java type signature.
1.37 + *
1.38 + * @author Sucheta Dambalkar
1.39 + */
1.40 +public class TypeSignature {
1.41 +
1.42 + String parameters = null;
1.43 + String returntype = null;
1.44 + String fieldtype = null;
1.45 + int argumentlength = 0;
1.46 +
1.47 + public TypeSignature(String JVMSignature){
1.48 +
1.49 + if(JVMSignature != null){
1.50 + if(JVMSignature.indexOf("(") == -1){
1.51 + //This is a field type.
1.52 + this.fieldtype = getFieldTypeSignature(JVMSignature);
1.53 + }else {
1.54 + String parameterdes = null;
1.55 + if((JVMSignature.indexOf(")")-1) > (JVMSignature.indexOf("("))){
1.56 + //Get parameter signature.
1.57 + parameterdes =
1.58 + JVMSignature.substring(JVMSignature.indexOf("(")+1,
1.59 + JVMSignature.indexOf(")"));
1.60 + this.parameters = getParametersHelper(parameterdes);
1.61 + }else this.parameters = "()";
1.62 + //Get return type signature.
1.63 + String returndes = JVMSignature.substring(JVMSignature.lastIndexOf(")")+1);
1.64 + this.returntype = getReturnTypeHelper(returndes);
1.65 + }
1.66 + }
1.67 + }
1.68 +
1.69 + /**
1.70 + * Returns java type signature of a field.
1.71 + */
1.72 + public String getFieldTypeSignature(String fielddes){
1.73 + if(fielddes.startsWith("L")){
1.74 + return(getObjectType(fielddes));
1.75 + }else if(fielddes.startsWith("[")){
1.76 + return(getArrayType(fielddes));
1.77 + }else
1.78 + return(getBaseType(fielddes));
1.79 + }
1.80 +
1.81 + /**
1.82 + * Returns java type signature of a parameter.
1.83 + */
1.84 + public String getParametersHelper(String parameterdes){
1.85 + Vector parameters = new Vector();
1.86 + int startindex = -1;
1.87 + int endindex = -1;
1.88 + String param = "";
1.89 +
1.90 + while(parameterdes != null){
1.91 +
1.92 + if(parameterdes.startsWith("L")){
1.93 + //parameter is a object.
1.94 + startindex = parameterdes.indexOf("L");
1.95 + endindex = parameterdes.indexOf(";");
1.96 + if(startindex < parameterdes.length()) {
1.97 + if(endindex == parameterdes.length()-1) {
1.98 + //last parameter
1.99 + param = parameterdes.substring(startindex);
1.100 + parameterdes = null;
1.101 + }else if(endindex+1 < parameterdes.length()){
1.102 + //rest parameters
1.103 + param = parameterdes.substring(startindex, endindex+1);
1.104 + parameterdes = parameterdes.substring(endindex+1);
1.105 +
1.106 + }
1.107 + parameters.add(getObjectType(param));
1.108 + }
1.109 + }else if(parameterdes.startsWith("[")){
1.110 + //parameter is an array.
1.111 + String componentType = "";
1.112 + int enddim = -1;
1.113 + int st = 0;
1.114 + while(true){
1.115 + if(st < parameterdes.length()){
1.116 + if(parameterdes.charAt(st) == '['){
1.117 +
1.118 + enddim = st;
1.119 + st++;
1.120 + }
1.121 + else break;
1.122 + }
1.123 + else break;
1.124 + }
1.125 +
1.126 + if(enddim+1 < parameterdes.length()){
1.127 + /* Array dimension.*/
1.128 + param = parameterdes.substring(0,enddim+1);
1.129 +
1.130 + }
1.131 +
1.132 + int stotherparam = param.lastIndexOf("[")+1;
1.133 +
1.134 + if(stotherparam < parameterdes.length()){
1.135 + componentType = parameterdes.substring(stotherparam);
1.136 + }
1.137 +
1.138 + if(componentType.startsWith("L")){
1.139 + //parameter is array of objects.
1.140 + startindex = parameterdes.indexOf("L");
1.141 + endindex = parameterdes.indexOf(";");
1.142 +
1.143 + if(endindex == parameterdes.length()-1){
1.144 + //last parameter
1.145 + param += parameterdes.substring(startindex);
1.146 + parameterdes = null;
1.147 + }else if(endindex+1 < parameterdes.length()){
1.148 + //rest parameters
1.149 + param += parameterdes.substring(startindex, endindex+1);
1.150 + parameterdes = parameterdes.substring(endindex+1);
1.151 + }
1.152 + }else{
1.153 + //parameter is array of base type.
1.154 + if(componentType.length() == 1){
1.155 + //last parameter.
1.156 + param += componentType;
1.157 + parameterdes = null;
1.158 + }
1.159 + else if (componentType.length() > 1) {
1.160 + //rest parameters.
1.161 + param += componentType.substring(0,1);
1.162 + parameterdes = componentType.substring(1);
1.163 + }
1.164 + }
1.165 + parameters.add(getArrayType(param));
1.166 +
1.167 +
1.168 + }else {
1.169 +
1.170 + //parameter is of base type.
1.171 + if(parameterdes.length() == 1){
1.172 + //last parameter
1.173 + param = parameterdes;
1.174 + parameterdes = null;
1.175 + }
1.176 + else if (parameterdes.length() > 1) {
1.177 + //rest parameters.
1.178 + param = parameterdes.substring(0,1);
1.179 + parameterdes = parameterdes.substring(1);
1.180 + }
1.181 + parameters.add(getBaseType(param));
1.182 + }
1.183 + }
1.184 +
1.185 + /* number of arguments of a method.*/
1.186 + argumentlength = parameters.size();
1.187 +
1.188 + /* java type signature.*/
1.189 + String parametersignature = "(";
1.190 + int i;
1.191 +
1.192 + for(i = 0; i < parameters.size(); i++){
1.193 + parametersignature += (String)parameters.elementAt(i);
1.194 + if(i != parameters.size()-1){
1.195 + parametersignature += ", ";
1.196 + }
1.197 + }
1.198 + parametersignature += ")";
1.199 + return parametersignature;
1.200 + }
1.201 +
1.202 + /**
1.203 + * Returns java type signature for a return type.
1.204 + */
1.205 + public String getReturnTypeHelper(String returndes){
1.206 + return getFieldTypeSignature(returndes);
1.207 + }
1.208 +
1.209 + /**
1.210 + * Returns java type signature for a base type.
1.211 + */
1.212 + public String getBaseType(String baseType){
1.213 + if(baseType != null){
1.214 + if(baseType.equals("B")) return "byte";
1.215 + else if(baseType.equals("C")) return "char";
1.216 + else if(baseType.equals("D")) return "double";
1.217 + else if(baseType.equals("F")) return "float";
1.218 + else if(baseType.equals("I")) return "int";
1.219 + else if(baseType.equals("J")) return "long";
1.220 + else if(baseType.equals("S")) return "short";
1.221 + else if(baseType.equals("Z")) return "boolean";
1.222 + else if(baseType.equals("V")) return "void";
1.223 + }
1.224 + return null;
1.225 + }
1.226 +
1.227 + /**
1.228 + * Returns java type signature for a object type.
1.229 + */
1.230 + public String getObjectType(String JVMobjectType) {
1.231 + String objectType = "";
1.232 + int startindex = JVMobjectType.indexOf("L")+1;
1.233 + int endindex = JVMobjectType.indexOf(";");
1.234 + if((startindex != -1) && (endindex != -1)){
1.235 + if((startindex < JVMobjectType.length()) && (endindex < JVMobjectType.length())){
1.236 + objectType = JVMobjectType.substring(startindex, endindex);
1.237 + }
1.238 + objectType = objectType.replace('/','.');
1.239 + return objectType;
1.240 + }
1.241 + return null;
1.242 + }
1.243 +
1.244 + /**
1.245 + * Returns java type signature for array type.
1.246 + */
1.247 + public String getArrayType(String arrayType) {
1.248 + if(arrayType != null){
1.249 + String dimention = "";
1.250 +
1.251 + while(arrayType.indexOf("[") != -1){
1.252 + dimention += "[]";
1.253 +
1.254 + int startindex = arrayType.indexOf("[")+1;
1.255 + if(startindex <= arrayType.length()){
1.256 + arrayType = arrayType.substring(startindex);
1.257 + }
1.258 + }
1.259 +
1.260 + String componentType = "";
1.261 + if(arrayType.startsWith("L")){
1.262 + componentType = getObjectType(arrayType);
1.263 + }else {
1.264 + componentType = getBaseType(arrayType);
1.265 + }
1.266 + return componentType+dimention;
1.267 + }
1.268 + return null;
1.269 + }
1.270 +
1.271 + /**
1.272 + * Returns java type signature for parameters.
1.273 + */
1.274 + public String getParameters(){
1.275 + return parameters;
1.276 + }
1.277 +
1.278 + /**
1.279 + * Returns java type signature for return type.
1.280 + */
1.281 + public String getReturnType(){
1.282 + return returntype;
1.283 + }
1.284 +
1.285 + /**
1.286 + * Returns java type signature for field type.
1.287 + */
1.288 + public String getFieldType(){
1.289 + return fieldtype;
1.290 + }
1.291 +
1.292 + /**
1.293 + * Return number of arguments of a method.
1.294 + */
1.295 + public int getArgumentlength(){
1.296 + return argumentlength;
1.297 + }
1.298 +}