jjg@46: /* jjg@46: * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. jjg@46: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jjg@46: * jjg@46: * This code is free software; you can redistribute it and/or modify it jjg@46: * under the terms of the GNU General Public License version 2 only, as jjg@46: * published by the Free Software Foundation. Sun designates this jjg@46: * particular file as subject to the "Classpath" exception as provided jjg@46: * by Sun in the LICENSE file that accompanied this code. jjg@46: * jjg@46: * This code is distributed in the hope that it will be useful, but WITHOUT jjg@46: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jjg@46: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jjg@46: * version 2 for more details (a copy is included in the LICENSE file that jjg@46: * accompanied this code). jjg@46: * jjg@46: * You should have received a copy of the GNU General Public License version jjg@46: * 2 along with this work; if not, write to the Free Software Foundation, jjg@46: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jjg@46: * jjg@46: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, jjg@46: * CA 95054 USA or visit www.sun.com if you need additional information or jjg@46: * have any questions. jjg@46: */ jjg@46: jjg@46: package com.sun.tools.classfile; jjg@46: jjg@46: import java.util.List; jjg@46: jjg@46: /* jjg@46: *

This is NOT part of any API supported by Sun Microsystems. If jjg@46: * you write code that depends on this, you do so at your own risk. jjg@46: * This code and its internal interfaces are subject to change or jjg@46: * deletion without notice. jjg@46: */ jjg@46: public class Type { jjg@46: protected Type() { } jjg@46: jjg@46: public boolean isObject() { jjg@46: return false; jjg@46: } jjg@46: jjg@46: protected static void append(StringBuilder sb, String prefix, List types, String suffix) { jjg@46: sb.append(prefix); jjg@46: String sep = ""; jjg@46: for (Type t: types) { jjg@46: sb.append(sep); jjg@46: sb.append(t); jjg@46: sep = ", "; jjg@46: } jjg@46: sb.append(suffix); jjg@46: } jjg@46: jjg@46: protected static void appendIfNotEmpty(StringBuilder sb, String prefix, List types, String suffix) { jjg@46: if (types != null && types.size() > 0) jjg@46: append(sb, prefix, types, suffix); jjg@46: } jjg@46: jjg@46: public static class SimpleType extends Type { jjg@46: public SimpleType(String name) { jjg@46: this.name = name; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: return name; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public boolean isObject() { jjg@46: return name.equals("java.lang.Object"); jjg@46: } jjg@46: jjg@46: public final String name; jjg@46: } jjg@46: jjg@46: public static class ArrayType extends Type { jjg@46: public ArrayType(Type elemType) { jjg@46: this.elemType = elemType; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: return elemType + "[]"; jjg@46: } jjg@46: jjg@46: public final Type elemType; jjg@46: } jjg@46: jjg@46: public static class MethodType extends Type { jjg@46: public MethodType(List argTypes, Type resultType) { jjg@46: this(null, argTypes, resultType, null); jjg@46: } jjg@46: jjg@46: public MethodType(List typeArgTypes, jjg@46: List argTypes, jjg@46: Type returnType, jjg@46: List throwsTypes) { jjg@46: this.typeArgTypes = typeArgTypes; jjg@46: this.argTypes = argTypes; jjg@46: this.returnType = returnType; jjg@46: this.throwsTypes = throwsTypes; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: StringBuilder sb = new StringBuilder(); jjg@46: appendIfNotEmpty(sb, "<", typeArgTypes, "> "); jjg@46: sb.append(returnType); jjg@46: append(sb, " (", argTypes, ")"); jjg@46: appendIfNotEmpty(sb, " throws ", throwsTypes, ""); jjg@46: return sb.toString(); jjg@46: } jjg@46: jjg@46: public final List typeArgTypes; jjg@46: public final List argTypes; jjg@46: public final Type returnType; jjg@46: public final List throwsTypes; jjg@46: } jjg@46: jjg@46: public static class ClassSigType extends Type { jjg@46: public ClassSigType(List typeArgTypes, Type superclassType, List superinterfaceTypes) { jjg@46: this.typeArgTypes = typeArgTypes; jjg@46: this.superclassType = superclassType; jjg@46: this.superinterfaceTypes = superinterfaceTypes; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: StringBuilder sb = new StringBuilder(); jjg@46: appendIfNotEmpty(sb, "<", typeArgTypes, ">"); jjg@46: if (superclassType != null && !superclassType.isObject()) { jjg@46: sb.append(" extends "); jjg@46: sb.append(superclassType); jjg@46: } jjg@46: appendIfNotEmpty(sb, " implements ", superinterfaceTypes, ""); jjg@46: return sb.toString(); jjg@46: } jjg@46: jjg@46: public final List typeArgTypes; jjg@46: public final Type superclassType; jjg@46: public final List superinterfaceTypes; jjg@46: } jjg@46: jjg@46: public static class ClassType extends Type { jjg@46: public ClassType(String name, List typeArgs) { jjg@46: this.name = name; jjg@46: this.typeArgs = typeArgs; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: StringBuilder sb = new StringBuilder(); jjg@46: sb.append(name); jjg@46: appendIfNotEmpty(sb, "<", typeArgs, ">"); jjg@46: return sb.toString(); jjg@46: } jjg@46: jjg@46: public final String name; jjg@46: public final List typeArgs; jjg@46: } jjg@46: jjg@46: jjg@46: public static class InnerClassType extends Type { jjg@46: public InnerClassType(Type outerType, Type innerType) { jjg@46: this.outerType = outerType; jjg@46: this.innerType = innerType; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: return outerType + "." + innerType; jjg@46: } jjg@46: jjg@46: public final Type outerType; jjg@46: public final Type innerType; jjg@46: } jjg@46: jjg@46: public static class TypeArgType extends Type { jjg@46: public TypeArgType(String name, Type classBound, List interfaceBounds) { jjg@46: this.name = name; jjg@46: this.classBound = classBound; jjg@46: this.interfaceBounds = interfaceBounds; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: StringBuilder sb = new StringBuilder(); jjg@46: sb.append(name); jjg@46: String sep = " extends "; jjg@46: if (classBound != null && !classBound.isObject()) { jjg@46: sb.append(sep); jjg@46: sb.append(classBound); jjg@46: sep = " & "; jjg@46: } jjg@46: if (interfaceBounds != null) { jjg@46: for (Type bound: interfaceBounds) { jjg@46: sb.append(sep); jjg@46: sb.append(bound); jjg@46: sep = " & "; jjg@46: } jjg@46: } jjg@46: return sb.toString(); jjg@46: } jjg@46: jjg@46: public final String name; jjg@46: public final Type classBound; jjg@46: public final List interfaceBounds; jjg@46: } jjg@46: jjg@46: public static class WildcardType extends Type { jjg@46: public WildcardType() { jjg@46: this(null, null); jjg@46: } jjg@46: jjg@46: public WildcardType(String kind, Type boundType) { jjg@46: this.kind = kind; jjg@46: this.boundType = boundType; jjg@46: } jjg@46: jjg@46: @Override jjg@46: public String toString() { jjg@46: if (kind == null) jjg@46: return "?"; jjg@46: else jjg@46: return "? " + kind + " " + boundType; jjg@46: } jjg@46: jjg@46: public final String kind; jjg@46: public final Type boundType; jjg@46: } jjg@46: }