src/share/classes/com/sun/tools/classfile/Type.java

Tue, 08 Jul 2008 17:14:22 -0700

author
jjg
date
Tue, 08 Jul 2008 17:14:22 -0700
changeset 65
0d4aa3c00af5
parent 46
7708bd6d800d
child 280
b5872f0790e7
permissions
-rw-r--r--

6715757: javap does not print "extends java.lang.Object"
Reviewed-by: ksrini

jjg@46 1 /*
jjg@46 2 * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
jjg@46 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jjg@46 4 *
jjg@46 5 * This code is free software; you can redistribute it and/or modify it
jjg@46 6 * under the terms of the GNU General Public License version 2 only, as
jjg@46 7 * published by the Free Software Foundation. Sun designates this
jjg@46 8 * particular file as subject to the "Classpath" exception as provided
jjg@46 9 * by Sun in the LICENSE file that accompanied this code.
jjg@46 10 *
jjg@46 11 * This code is distributed in the hope that it will be useful, but WITHOUT
jjg@46 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jjg@46 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
jjg@46 14 * version 2 for more details (a copy is included in the LICENSE file that
jjg@46 15 * accompanied this code).
jjg@46 16 *
jjg@46 17 * You should have received a copy of the GNU General Public License version
jjg@46 18 * 2 along with this work; if not, write to the Free Software Foundation,
jjg@46 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jjg@46 20 *
jjg@46 21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
jjg@46 22 * CA 95054 USA or visit www.sun.com if you need additional information or
jjg@46 23 * have any questions.
jjg@46 24 */
jjg@46 25
jjg@46 26 package com.sun.tools.classfile;
jjg@46 27
jjg@46 28 import java.util.List;
jjg@46 29
jjg@46 30 /*
jjg@46 31 * <p><b>This is NOT part of any API supported by Sun Microsystems. If
jjg@46 32 * you write code that depends on this, you do so at your own risk.
jjg@46 33 * This code and its internal interfaces are subject to change or
jjg@46 34 * deletion without notice.</b>
jjg@46 35 */
jjg@46 36 public class Type {
jjg@46 37 protected Type() { }
jjg@46 38
jjg@46 39 protected static void append(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) {
jjg@46 40 sb.append(prefix);
jjg@46 41 String sep = "";
jjg@46 42 for (Type t: types) {
jjg@46 43 sb.append(sep);
jjg@46 44 sb.append(t);
jjg@46 45 sep = ", ";
jjg@46 46 }
jjg@46 47 sb.append(suffix);
jjg@46 48 }
jjg@46 49
jjg@46 50 protected static void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) {
jjg@46 51 if (types != null && types.size() > 0)
jjg@46 52 append(sb, prefix, types, suffix);
jjg@46 53 }
jjg@46 54
jjg@46 55 public static class SimpleType extends Type {
jjg@46 56 public SimpleType(String name) {
jjg@46 57 this.name = name;
jjg@46 58 }
jjg@46 59
jjg@46 60 @Override
jjg@46 61 public String toString() {
jjg@46 62 return name;
jjg@46 63 }
jjg@46 64
jjg@46 65 public final String name;
jjg@46 66 }
jjg@46 67
jjg@46 68 public static class ArrayType extends Type {
jjg@46 69 public ArrayType(Type elemType) {
jjg@46 70 this.elemType = elemType;
jjg@46 71 }
jjg@46 72
jjg@46 73 @Override
jjg@46 74 public String toString() {
jjg@46 75 return elemType + "[]";
jjg@46 76 }
jjg@46 77
jjg@46 78 public final Type elemType;
jjg@46 79 }
jjg@46 80
jjg@46 81 public static class MethodType extends Type {
jjg@46 82 public MethodType(List<? extends Type> argTypes, Type resultType) {
jjg@46 83 this(null, argTypes, resultType, null);
jjg@46 84 }
jjg@46 85
jjg@46 86 public MethodType(List<? extends Type> typeArgTypes,
jjg@46 87 List<? extends Type> argTypes,
jjg@46 88 Type returnType,
jjg@46 89 List<? extends Type> throwsTypes) {
jjg@46 90 this.typeArgTypes = typeArgTypes;
jjg@46 91 this.argTypes = argTypes;
jjg@46 92 this.returnType = returnType;
jjg@46 93 this.throwsTypes = throwsTypes;
jjg@46 94 }
jjg@46 95
jjg@46 96 @Override
jjg@46 97 public String toString() {
jjg@46 98 StringBuilder sb = new StringBuilder();
jjg@46 99 appendIfNotEmpty(sb, "<", typeArgTypes, "> ");
jjg@46 100 sb.append(returnType);
jjg@46 101 append(sb, " (", argTypes, ")");
jjg@46 102 appendIfNotEmpty(sb, " throws ", throwsTypes, "");
jjg@46 103 return sb.toString();
jjg@46 104 }
jjg@46 105
jjg@46 106 public final List<? extends Type> typeArgTypes;
jjg@46 107 public final List<? extends Type> argTypes;
jjg@46 108 public final Type returnType;
jjg@46 109 public final List<? extends Type> throwsTypes;
jjg@46 110 }
jjg@46 111
jjg@46 112 public static class ClassSigType extends Type {
jjg@46 113 public ClassSigType(List<Type> typeArgTypes, Type superclassType, List<Type> superinterfaceTypes) {
jjg@46 114 this.typeArgTypes = typeArgTypes;
jjg@46 115 this.superclassType = superclassType;
jjg@46 116 this.superinterfaceTypes = superinterfaceTypes;
jjg@46 117 }
jjg@46 118
jjg@46 119 @Override
jjg@46 120 public String toString() {
jjg@46 121 StringBuilder sb = new StringBuilder();
jjg@46 122 appendIfNotEmpty(sb, "<", typeArgTypes, ">");
jjg@65 123 if (superclassType != null) {
jjg@46 124 sb.append(" extends ");
jjg@46 125 sb.append(superclassType);
jjg@46 126 }
jjg@46 127 appendIfNotEmpty(sb, " implements ", superinterfaceTypes, "");
jjg@46 128 return sb.toString();
jjg@46 129 }
jjg@46 130
jjg@46 131 public final List<Type> typeArgTypes;
jjg@46 132 public final Type superclassType;
jjg@46 133 public final List<Type> superinterfaceTypes;
jjg@46 134 }
jjg@46 135
jjg@46 136 public static class ClassType extends Type {
jjg@46 137 public ClassType(String name, List<Type> typeArgs) {
jjg@46 138 this.name = name;
jjg@46 139 this.typeArgs = typeArgs;
jjg@46 140 }
jjg@46 141
jjg@46 142 @Override
jjg@46 143 public String toString() {
jjg@46 144 StringBuilder sb = new StringBuilder();
jjg@46 145 sb.append(name);
jjg@46 146 appendIfNotEmpty(sb, "<", typeArgs, ">");
jjg@46 147 return sb.toString();
jjg@46 148 }
jjg@46 149
jjg@46 150 public final String name;
jjg@46 151 public final List<Type> typeArgs;
jjg@46 152 }
jjg@46 153
jjg@46 154
jjg@46 155 public static class InnerClassType extends Type {
jjg@46 156 public InnerClassType(Type outerType, Type innerType) {
jjg@46 157 this.outerType = outerType;
jjg@46 158 this.innerType = innerType;
jjg@46 159 }
jjg@46 160
jjg@46 161 @Override
jjg@46 162 public String toString() {
jjg@46 163 return outerType + "." + innerType;
jjg@46 164 }
jjg@46 165
jjg@46 166 public final Type outerType;
jjg@46 167 public final Type innerType;
jjg@46 168 }
jjg@46 169
jjg@46 170 public static class TypeArgType extends Type {
jjg@46 171 public TypeArgType(String name, Type classBound, List<Type> interfaceBounds) {
jjg@46 172 this.name = name;
jjg@46 173 this.classBound = classBound;
jjg@46 174 this.interfaceBounds = interfaceBounds;
jjg@46 175 }
jjg@46 176
jjg@46 177 @Override
jjg@46 178 public String toString() {
jjg@46 179 StringBuilder sb = new StringBuilder();
jjg@46 180 sb.append(name);
jjg@46 181 String sep = " extends ";
jjg@65 182 if (classBound != null) {
jjg@46 183 sb.append(sep);
jjg@46 184 sb.append(classBound);
jjg@46 185 sep = " & ";
jjg@46 186 }
jjg@46 187 if (interfaceBounds != null) {
jjg@46 188 for (Type bound: interfaceBounds) {
jjg@46 189 sb.append(sep);
jjg@46 190 sb.append(bound);
jjg@46 191 sep = " & ";
jjg@46 192 }
jjg@46 193 }
jjg@46 194 return sb.toString();
jjg@46 195 }
jjg@46 196
jjg@46 197 public final String name;
jjg@46 198 public final Type classBound;
jjg@46 199 public final List<Type> interfaceBounds;
jjg@46 200 }
jjg@46 201
jjg@46 202 public static class WildcardType extends Type {
jjg@46 203 public WildcardType() {
jjg@46 204 this(null, null);
jjg@46 205 }
jjg@46 206
jjg@46 207 public WildcardType(String kind, Type boundType) {
jjg@46 208 this.kind = kind;
jjg@46 209 this.boundType = boundType;
jjg@46 210 }
jjg@46 211
jjg@46 212 @Override
jjg@46 213 public String toString() {
jjg@46 214 if (kind == null)
jjg@46 215 return "?";
jjg@46 216 else
jjg@46 217 return "? " + kind + " " + boundType;
jjg@46 218 }
jjg@46 219
jjg@46 220 public final String kind;
jjg@46 221 public final Type boundType;
jjg@46 222 }
jjg@46 223 }

mercurial