blob: 98fd099b34107537293f55d3570fe40604de75ea [file] [log] [blame]
/*
* Copyright 2008 Sun Microsystems, Inc. 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. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package com.sun.tools.classfile;
import java.util.List;
/*
* <p><b>This is NOT part of any API supported by Sun Microsystems. 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.</b>
*/
public class Type {
protected Type() { }
protected static void append(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) {
sb.append(prefix);
String sep = "";
for (Type t: types) {
sb.append(sep);
sb.append(t);
sep = ", ";
}
sb.append(suffix);
}
protected static void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) {
if (types != null && types.size() > 0)
append(sb, prefix, types, suffix);
}
public static class SimpleType extends Type {
public SimpleType(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
public final String name;
}
public static class ArrayType extends Type {
public ArrayType(Type elemType) {
this.elemType = elemType;
}
@Override
public String toString() {
return elemType + "[]";
}
public final Type elemType;
}
public static class MethodType extends Type {
public MethodType(List<? extends Type> argTypes, Type resultType) {
this(null, argTypes, resultType, null);
}
public MethodType(List<? extends Type> typeArgTypes,
List<? extends Type> argTypes,
Type returnType,
List<? extends Type> throwsTypes) {
this.typeArgTypes = typeArgTypes;
this.argTypes = argTypes;
this.returnType = returnType;
this.throwsTypes = throwsTypes;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "<", typeArgTypes, "> ");
sb.append(returnType);
append(sb, " (", argTypes, ")");
appendIfNotEmpty(sb, " throws ", throwsTypes, "");
return sb.toString();
}
public final List<? extends Type> typeArgTypes;
public final List<? extends Type> argTypes;
public final Type returnType;
public final List<? extends Type> throwsTypes;
}
public static class ClassSigType extends Type {
public ClassSigType(List<Type> typeArgTypes, Type superclassType, List<Type> superinterfaceTypes) {
this.typeArgTypes = typeArgTypes;
this.superclassType = superclassType;
this.superinterfaceTypes = superinterfaceTypes;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
appendIfNotEmpty(sb, "<", typeArgTypes, ">");
if (superclassType != null) {
sb.append(" extends ");
sb.append(superclassType);
}
appendIfNotEmpty(sb, " implements ", superinterfaceTypes, "");
return sb.toString();
}
public final List<Type> typeArgTypes;
public final Type superclassType;
public final List<Type> superinterfaceTypes;
}
public static class ClassType extends Type {
public ClassType(String name, List<Type> typeArgs) {
this.name = name;
this.typeArgs = typeArgs;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(name);
appendIfNotEmpty(sb, "<", typeArgs, ">");
return sb.toString();
}
public final String name;
public final List<Type> typeArgs;
}
public static class InnerClassType extends Type {
public InnerClassType(Type outerType, Type innerType) {
this.outerType = outerType;
this.innerType = innerType;
}
@Override
public String toString() {
return outerType + "." + innerType;
}
public final Type outerType;
public final Type innerType;
}
public static class TypeArgType extends Type {
public TypeArgType(String name, Type classBound, List<Type> interfaceBounds) {
this.name = name;
this.classBound = classBound;
this.interfaceBounds = interfaceBounds;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(name);
String sep = " extends ";
if (classBound != null) {
sb.append(sep);
sb.append(classBound);
sep = " & ";
}
if (interfaceBounds != null) {
for (Type bound: interfaceBounds) {
sb.append(sep);
sb.append(bound);
sep = " & ";
}
}
return sb.toString();
}
public final String name;
public final Type classBound;
public final List<Type> interfaceBounds;
}
public static class WildcardType extends Type {
public WildcardType() {
this(null, null);
}
public WildcardType(String kind, Type boundType) {
this.kind = kind;
this.boundType = boundType;
}
@Override
public String toString() {
if (kind == null)
return "?";
else
return "? " + kind + " " + boundType;
}
public final String kind;
public final Type boundType;
}
}