--- old/langtools/src/jdk.compiler/share/classes/com/sun/tools/classfile/Signature.java 2015-05-26 21:42:28.883832963 -0700 +++ /dev/null 2015-04-26 22:05:36.465433038 -0700 @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.classfile; - -import java.util.ArrayList; -import java.util.List; -import com.sun.tools.classfile.Type.*; - -/** - * See JVMS 4.4.4. - * - *

This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. - */ -public class Signature extends Descriptor { - - public Signature(int index) { - super(index); - } - - public Type getType(ConstantPool constant_pool) throws ConstantPoolException { - if (type == null) - type = parse(getValue(constant_pool)); - return type; - } - - @Override - public int getParameterCount(ConstantPool constant_pool) throws ConstantPoolException { - MethodType m = (MethodType) getType(constant_pool); - return m.paramTypes.size(); - } - - @Override - public String getParameterTypes(ConstantPool constant_pool) throws ConstantPoolException { - MethodType m = (MethodType) getType(constant_pool); - StringBuilder sb = new StringBuilder(); - sb.append("("); - String sep = ""; - for (Type paramType: m.paramTypes) { - sb.append(sep); - sb.append(paramType); - sep = ", "; - } - sb.append(")"); - return sb.toString(); - } - - @Override - public String getReturnType(ConstantPool constant_pool) throws ConstantPoolException { - MethodType m = (MethodType) getType(constant_pool); - return m.returnType.toString(); - } - - @Override - public String getFieldType(ConstantPool constant_pool) throws ConstantPoolException { - return getType(constant_pool).toString(); - } - - private Type parse(String sig) { - this.sig = sig; - sigp = 0; - - List typeParamTypes = null; - if (sig.charAt(sigp) == '<') - typeParamTypes = parseTypeParamTypes(); - - if (sig.charAt(sigp) == '(') { - List paramTypes = parseTypeSignatures(')'); - Type returnType = parseTypeSignature(); - List throwsTypes = null; - while (sigp < sig.length() && sig.charAt(sigp) == '^') { - sigp++; - if (throwsTypes == null) - throwsTypes = new ArrayList<>(); - throwsTypes.add(parseTypeSignature()); - } - return new MethodType(typeParamTypes, paramTypes, returnType, throwsTypes); - } else { - Type t = parseTypeSignature(); - if (typeParamTypes == null && sigp == sig.length()) - return t; - Type superclass = t; - List superinterfaces = null; - while (sigp < sig.length()) { - if (superinterfaces == null) - superinterfaces = new ArrayList<>(); - superinterfaces.add(parseTypeSignature()); - } - return new ClassSigType(typeParamTypes, superclass, superinterfaces); - - } - } - - private Type parseTypeSignature() { - switch (sig.charAt(sigp)) { - case 'B': - sigp++; - return new SimpleType("byte"); - - case 'C': - sigp++; - return new SimpleType("char"); - - case 'D': - sigp++; - return new SimpleType("double"); - - case 'F': - sigp++; - return new SimpleType("float"); - - case 'I': - sigp++; - return new SimpleType("int"); - - case 'J': - sigp++; - return new SimpleType("long"); - - case 'L': - return parseClassTypeSignature(); - - case 'S': - sigp++; - return new SimpleType("short"); - - case 'T': - return parseTypeVariableSignature(); - - case 'V': - sigp++; - return new SimpleType("void"); - - case 'Z': - sigp++; - return new SimpleType("boolean"); - - case '[': - sigp++; - return new ArrayType(parseTypeSignature()); - - case '*': - sigp++; - return new WildcardType(); - - case '+': - sigp++; - return new WildcardType(WildcardType.Kind.EXTENDS, parseTypeSignature()); - - case '-': - sigp++; - return new WildcardType(WildcardType.Kind.SUPER, parseTypeSignature()); - - default: - throw new IllegalStateException(debugInfo()); - } - } - - private List parseTypeSignatures(char term) { - sigp++; - List types = new ArrayList<>(); - while (sig.charAt(sigp) != term) - types.add(parseTypeSignature()); - sigp++; - return types; - } - - private Type parseClassTypeSignature() { - assert sig.charAt(sigp) == 'L'; - sigp++; - return parseClassTypeSignatureRest(); - } - - private Type parseClassTypeSignatureRest() { - StringBuilder sb = new StringBuilder(); - List argTypes = null; - ClassType t = null; - char sigch ; - - do { - switch (sigch = sig.charAt(sigp)) { - case '<': - argTypes = parseTypeSignatures('>'); - break; - - case '.': - case ';': - sigp++; - t = new ClassType(t, sb.toString(), argTypes); - sb.setLength(0); - argTypes = null; - break; - - default: - sigp++; - sb.append(sigch); - break; - } - } while (sigch != ';'); - - return t; - } - - private List parseTypeParamTypes() { - assert sig.charAt(sigp) == '<'; - sigp++; - List types = new ArrayList<>(); - while (sig.charAt(sigp) != '>') - types.add(parseTypeParamType()); - sigp++; - return types; - } - - private TypeParamType parseTypeParamType() { - int sep = sig.indexOf(":", sigp); - String name = sig.substring(sigp, sep); - Type classBound = null; - List interfaceBounds = null; - sigp = sep + 1; - if (sig.charAt(sigp) != ':') - classBound = parseTypeSignature(); - while (sig.charAt(sigp) == ':') { - sigp++; - if (interfaceBounds == null) - interfaceBounds = new ArrayList<>(); - interfaceBounds.add(parseTypeSignature()); - } - return new TypeParamType(name, classBound, interfaceBounds); - } - - private Type parseTypeVariableSignature() { - sigp++; - int sep = sig.indexOf(';', sigp); - Type t = new SimpleType(sig.substring(sigp, sep)); - sigp = sep + 1; - return t; - } - - private String debugInfo() { - return sig.substring(0, sigp) + "!" + sig.charAt(sigp) + "!" + sig.substring(sigp+1); - } - - private String sig; - private int sigp; - - private Type type; -} --- /dev/null 2015-04-26 22:05:36.465433038 -0700 +++ new/langtools/src/jdk.jdeps/share/classes/com/sun/tools/classfile/Signature.java 2015-05-26 21:42:28.711832961 -0700 @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.classfile; + +import java.util.ArrayList; +import java.util.List; +import com.sun.tools.classfile.Type.*; + +/** + * See JVMS 4.4.4. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class Signature extends Descriptor { + + public Signature(int index) { + super(index); + } + + public Type getType(ConstantPool constant_pool) throws ConstantPoolException { + if (type == null) + type = parse(getValue(constant_pool)); + return type; + } + + @Override + public int getParameterCount(ConstantPool constant_pool) throws ConstantPoolException { + MethodType m = (MethodType) getType(constant_pool); + return m.paramTypes.size(); + } + + @Override + public String getParameterTypes(ConstantPool constant_pool) throws ConstantPoolException { + MethodType m = (MethodType) getType(constant_pool); + StringBuilder sb = new StringBuilder(); + sb.append("("); + String sep = ""; + for (Type paramType: m.paramTypes) { + sb.append(sep); + sb.append(paramType); + sep = ", "; + } + sb.append(")"); + return sb.toString(); + } + + @Override + public String getReturnType(ConstantPool constant_pool) throws ConstantPoolException { + MethodType m = (MethodType) getType(constant_pool); + return m.returnType.toString(); + } + + @Override + public String getFieldType(ConstantPool constant_pool) throws ConstantPoolException { + return getType(constant_pool).toString(); + } + + private Type parse(String sig) { + this.sig = sig; + sigp = 0; + + List typeParamTypes = null; + if (sig.charAt(sigp) == '<') + typeParamTypes = parseTypeParamTypes(); + + if (sig.charAt(sigp) == '(') { + List paramTypes = parseTypeSignatures(')'); + Type returnType = parseTypeSignature(); + List throwsTypes = null; + while (sigp < sig.length() && sig.charAt(sigp) == '^') { + sigp++; + if (throwsTypes == null) + throwsTypes = new ArrayList<>(); + throwsTypes.add(parseTypeSignature()); + } + return new MethodType(typeParamTypes, paramTypes, returnType, throwsTypes); + } else { + Type t = parseTypeSignature(); + if (typeParamTypes == null && sigp == sig.length()) + return t; + Type superclass = t; + List superinterfaces = null; + while (sigp < sig.length()) { + if (superinterfaces == null) + superinterfaces = new ArrayList<>(); + superinterfaces.add(parseTypeSignature()); + } + return new ClassSigType(typeParamTypes, superclass, superinterfaces); + + } + } + + private Type parseTypeSignature() { + switch (sig.charAt(sigp)) { + case 'B': + sigp++; + return new SimpleType("byte"); + + case 'C': + sigp++; + return new SimpleType("char"); + + case 'D': + sigp++; + return new SimpleType("double"); + + case 'F': + sigp++; + return new SimpleType("float"); + + case 'I': + sigp++; + return new SimpleType("int"); + + case 'J': + sigp++; + return new SimpleType("long"); + + case 'L': + return parseClassTypeSignature(); + + case 'S': + sigp++; + return new SimpleType("short"); + + case 'T': + return parseTypeVariableSignature(); + + case 'V': + sigp++; + return new SimpleType("void"); + + case 'Z': + sigp++; + return new SimpleType("boolean"); + + case '[': + sigp++; + return new ArrayType(parseTypeSignature()); + + case '*': + sigp++; + return new WildcardType(); + + case '+': + sigp++; + return new WildcardType(WildcardType.Kind.EXTENDS, parseTypeSignature()); + + case '-': + sigp++; + return new WildcardType(WildcardType.Kind.SUPER, parseTypeSignature()); + + default: + throw new IllegalStateException(debugInfo()); + } + } + + private List parseTypeSignatures(char term) { + sigp++; + List types = new ArrayList<>(); + while (sig.charAt(sigp) != term) + types.add(parseTypeSignature()); + sigp++; + return types; + } + + private Type parseClassTypeSignature() { + assert sig.charAt(sigp) == 'L'; + sigp++; + return parseClassTypeSignatureRest(); + } + + private Type parseClassTypeSignatureRest() { + StringBuilder sb = new StringBuilder(); + List argTypes = null; + ClassType t = null; + char sigch ; + + do { + switch (sigch = sig.charAt(sigp)) { + case '<': + argTypes = parseTypeSignatures('>'); + break; + + case '.': + case ';': + sigp++; + t = new ClassType(t, sb.toString(), argTypes); + sb.setLength(0); + argTypes = null; + break; + + default: + sigp++; + sb.append(sigch); + break; + } + } while (sigch != ';'); + + return t; + } + + private List parseTypeParamTypes() { + assert sig.charAt(sigp) == '<'; + sigp++; + List types = new ArrayList<>(); + while (sig.charAt(sigp) != '>') + types.add(parseTypeParamType()); + sigp++; + return types; + } + + private TypeParamType parseTypeParamType() { + int sep = sig.indexOf(":", sigp); + String name = sig.substring(sigp, sep); + Type classBound = null; + List interfaceBounds = null; + sigp = sep + 1; + if (sig.charAt(sigp) != ':') + classBound = parseTypeSignature(); + while (sig.charAt(sigp) == ':') { + sigp++; + if (interfaceBounds == null) + interfaceBounds = new ArrayList<>(); + interfaceBounds.add(parseTypeSignature()); + } + return new TypeParamType(name, classBound, interfaceBounds); + } + + private Type parseTypeVariableSignature() { + sigp++; + int sep = sig.indexOf(';', sigp); + Type t = new SimpleType(sig.substring(sigp, sep)); + sigp = sep + 1; + return t; + } + + private String debugInfo() { + return sig.substring(0, sigp) + "!" + sig.charAt(sigp) + "!" + sig.substring(sigp+1); + } + + private String sig; + private int sigp; + + private Type type; +}