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

Tue, 03 Jun 2008 13:26:47 -0700

author
jjg
date
Tue, 03 Jun 2008 13:26:47 -0700
changeset 46
7708bd6d800d
child 65
0d4aa3c00af5
permissions
-rw-r--r--

4075303: Use javap to enquire aboput a specific inner class
4348375: Javap is not internationalized
4459541: "javap -l" shows line numbers as signed short; they should be unsigned
4501660: change diagnostic of -help as 'print this help message and exit'
4776241: unused source file in javap...
4870651: javap should recognize generics, varargs, enum
4876942: javap invoked without args does not print help screen
4880663: javap could output whitespace between class name and opening brace
4975569: javap doesn't print new flag bits
6271787: javap dumps LocalVariableTypeTable attribute in hex, needs to print a table
6305779: javap: support annotations
6439940: Clean up javap implementation
6469569: wrong check of searchpath in JavapEnvironment
6474890: javap does not open .zip files in -classpath
6587786: Javap throws error : "ERROR:Could not find <classname>" for JRE classes
6622215: javap ignores certain relevant access flags
6622216: javap names some attributes incorrectly
6622232: javap gets whitespace confused
6622260: javap prints negative bytes incorrectly in hex
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 public boolean isObject() {
jjg@46 40 return false;
jjg@46 41 }
jjg@46 42
jjg@46 43 protected static void append(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) {
jjg@46 44 sb.append(prefix);
jjg@46 45 String sep = "";
jjg@46 46 for (Type t: types) {
jjg@46 47 sb.append(sep);
jjg@46 48 sb.append(t);
jjg@46 49 sep = ", ";
jjg@46 50 }
jjg@46 51 sb.append(suffix);
jjg@46 52 }
jjg@46 53
jjg@46 54 protected static void appendIfNotEmpty(StringBuilder sb, String prefix, List<? extends Type> types, String suffix) {
jjg@46 55 if (types != null && types.size() > 0)
jjg@46 56 append(sb, prefix, types, suffix);
jjg@46 57 }
jjg@46 58
jjg@46 59 public static class SimpleType extends Type {
jjg@46 60 public SimpleType(String name) {
jjg@46 61 this.name = name;
jjg@46 62 }
jjg@46 63
jjg@46 64 @Override
jjg@46 65 public String toString() {
jjg@46 66 return name;
jjg@46 67 }
jjg@46 68
jjg@46 69 @Override
jjg@46 70 public boolean isObject() {
jjg@46 71 return name.equals("java.lang.Object");
jjg@46 72 }
jjg@46 73
jjg@46 74 public final String name;
jjg@46 75 }
jjg@46 76
jjg@46 77 public static class ArrayType extends Type {
jjg@46 78 public ArrayType(Type elemType) {
jjg@46 79 this.elemType = elemType;
jjg@46 80 }
jjg@46 81
jjg@46 82 @Override
jjg@46 83 public String toString() {
jjg@46 84 return elemType + "[]";
jjg@46 85 }
jjg@46 86
jjg@46 87 public final Type elemType;
jjg@46 88 }
jjg@46 89
jjg@46 90 public static class MethodType extends Type {
jjg@46 91 public MethodType(List<? extends Type> argTypes, Type resultType) {
jjg@46 92 this(null, argTypes, resultType, null);
jjg@46 93 }
jjg@46 94
jjg@46 95 public MethodType(List<? extends Type> typeArgTypes,
jjg@46 96 List<? extends Type> argTypes,
jjg@46 97 Type returnType,
jjg@46 98 List<? extends Type> throwsTypes) {
jjg@46 99 this.typeArgTypes = typeArgTypes;
jjg@46 100 this.argTypes = argTypes;
jjg@46 101 this.returnType = returnType;
jjg@46 102 this.throwsTypes = throwsTypes;
jjg@46 103 }
jjg@46 104
jjg@46 105 @Override
jjg@46 106 public String toString() {
jjg@46 107 StringBuilder sb = new StringBuilder();
jjg@46 108 appendIfNotEmpty(sb, "<", typeArgTypes, "> ");
jjg@46 109 sb.append(returnType);
jjg@46 110 append(sb, " (", argTypes, ")");
jjg@46 111 appendIfNotEmpty(sb, " throws ", throwsTypes, "");
jjg@46 112 return sb.toString();
jjg@46 113 }
jjg@46 114
jjg@46 115 public final List<? extends Type> typeArgTypes;
jjg@46 116 public final List<? extends Type> argTypes;
jjg@46 117 public final Type returnType;
jjg@46 118 public final List<? extends Type> throwsTypes;
jjg@46 119 }
jjg@46 120
jjg@46 121 public static class ClassSigType extends Type {
jjg@46 122 public ClassSigType(List<Type> typeArgTypes, Type superclassType, List<Type> superinterfaceTypes) {
jjg@46 123 this.typeArgTypes = typeArgTypes;
jjg@46 124 this.superclassType = superclassType;
jjg@46 125 this.superinterfaceTypes = superinterfaceTypes;
jjg@46 126 }
jjg@46 127
jjg@46 128 @Override
jjg@46 129 public String toString() {
jjg@46 130 StringBuilder sb = new StringBuilder();
jjg@46 131 appendIfNotEmpty(sb, "<", typeArgTypes, ">");
jjg@46 132 if (superclassType != null && !superclassType.isObject()) {
jjg@46 133 sb.append(" extends ");
jjg@46 134 sb.append(superclassType);
jjg@46 135 }
jjg@46 136 appendIfNotEmpty(sb, " implements ", superinterfaceTypes, "");
jjg@46 137 return sb.toString();
jjg@46 138 }
jjg@46 139
jjg@46 140 public final List<Type> typeArgTypes;
jjg@46 141 public final Type superclassType;
jjg@46 142 public final List<Type> superinterfaceTypes;
jjg@46 143 }
jjg@46 144
jjg@46 145 public static class ClassType extends Type {
jjg@46 146 public ClassType(String name, List<Type> typeArgs) {
jjg@46 147 this.name = name;
jjg@46 148 this.typeArgs = typeArgs;
jjg@46 149 }
jjg@46 150
jjg@46 151 @Override
jjg@46 152 public String toString() {
jjg@46 153 StringBuilder sb = new StringBuilder();
jjg@46 154 sb.append(name);
jjg@46 155 appendIfNotEmpty(sb, "<", typeArgs, ">");
jjg@46 156 return sb.toString();
jjg@46 157 }
jjg@46 158
jjg@46 159 public final String name;
jjg@46 160 public final List<Type> typeArgs;
jjg@46 161 }
jjg@46 162
jjg@46 163
jjg@46 164 public static class InnerClassType extends Type {
jjg@46 165 public InnerClassType(Type outerType, Type innerType) {
jjg@46 166 this.outerType = outerType;
jjg@46 167 this.innerType = innerType;
jjg@46 168 }
jjg@46 169
jjg@46 170 @Override
jjg@46 171 public String toString() {
jjg@46 172 return outerType + "." + innerType;
jjg@46 173 }
jjg@46 174
jjg@46 175 public final Type outerType;
jjg@46 176 public final Type innerType;
jjg@46 177 }
jjg@46 178
jjg@46 179 public static class TypeArgType extends Type {
jjg@46 180 public TypeArgType(String name, Type classBound, List<Type> interfaceBounds) {
jjg@46 181 this.name = name;
jjg@46 182 this.classBound = classBound;
jjg@46 183 this.interfaceBounds = interfaceBounds;
jjg@46 184 }
jjg@46 185
jjg@46 186 @Override
jjg@46 187 public String toString() {
jjg@46 188 StringBuilder sb = new StringBuilder();
jjg@46 189 sb.append(name);
jjg@46 190 String sep = " extends ";
jjg@46 191 if (classBound != null && !classBound.isObject()) {
jjg@46 192 sb.append(sep);
jjg@46 193 sb.append(classBound);
jjg@46 194 sep = " & ";
jjg@46 195 }
jjg@46 196 if (interfaceBounds != null) {
jjg@46 197 for (Type bound: interfaceBounds) {
jjg@46 198 sb.append(sep);
jjg@46 199 sb.append(bound);
jjg@46 200 sep = " & ";
jjg@46 201 }
jjg@46 202 }
jjg@46 203 return sb.toString();
jjg@46 204 }
jjg@46 205
jjg@46 206 public final String name;
jjg@46 207 public final Type classBound;
jjg@46 208 public final List<Type> interfaceBounds;
jjg@46 209 }
jjg@46 210
jjg@46 211 public static class WildcardType extends Type {
jjg@46 212 public WildcardType() {
jjg@46 213 this(null, null);
jjg@46 214 }
jjg@46 215
jjg@46 216 public WildcardType(String kind, Type boundType) {
jjg@46 217 this.kind = kind;
jjg@46 218 this.boundType = boundType;
jjg@46 219 }
jjg@46 220
jjg@46 221 @Override
jjg@46 222 public String toString() {
jjg@46 223 if (kind == null)
jjg@46 224 return "?";
jjg@46 225 else
jjg@46 226 return "? " + kind + " " + boundType;
jjg@46 227 }
jjg@46 228
jjg@46 229 public final String kind;
jjg@46 230 public final Type boundType;
jjg@46 231 }
jjg@46 232 }

mercurial