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

Fri, 26 Jun 2009 19:12:41 -0700

author
jjg
date
Fri, 26 Jun 2009 19:12:41 -0700
changeset 309
664edca41e34
parent 280
b5872f0790e7
child 427
6ba399eff2cb
permissions
-rw-r--r--

6855544: add missing files
Reviewed-by: jjg, mcimadamore, darcy
Contributed-by: mernst@cs.washington.edu, mali@csail.mit.edu, mpapi@csail.mit.edu

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@280 28 import java.util.Arrays;
jjg@280 29 import java.util.HashSet;
jjg@46 30 import java.util.List;
jjg@280 31 import java.util.Set;
jjg@46 32
jjg@46 33 /*
jjg@46 34 * <p><b>This is NOT part of any API supported by Sun Microsystems. If
jjg@46 35 * you write code that depends on this, you do so at your own risk.
jjg@46 36 * This code and its internal interfaces are subject to change or
jjg@46 37 * deletion without notice.</b>
jjg@46 38 */
jjg@280 39 public abstract class Type {
jjg@46 40 protected Type() { }
jjg@280 41 public abstract <R,D> R accept(Visitor<R,D> visitor, D data);
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@280 59 public interface Visitor<R,P> {
jjg@280 60 R visitSimpleType(SimpleType type, P p);
jjg@280 61 R visitArrayType(ArrayType type, P p);
jjg@280 62 R visitMethodType(MethodType type, P p);
jjg@280 63 R visitClassSigType(ClassSigType type, P p);
jjg@280 64 R visitClassType(ClassType type, P p);
jjg@280 65 R visitInnerClassType(InnerClassType type, P p);
jjg@280 66 R visitTypeArgType(TypeArgType type, P p);
jjg@280 67 R visitWildcardType(WildcardType type, P p);
jjg@280 68 }
jjg@280 69
jjg@46 70 public static class SimpleType extends Type {
jjg@46 71 public SimpleType(String name) {
jjg@46 72 this.name = name;
jjg@46 73 }
jjg@46 74
jjg@280 75 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 76 return visitor.visitSimpleType(this, data);
jjg@280 77 }
jjg@280 78
jjg@280 79 public boolean isPrimitiveType() {
jjg@280 80 return primitiveTypes.contains(name);
jjg@280 81 }
jjg@280 82 // where
jjg@280 83 private static final Set<String> primitiveTypes = new HashSet<String>(Arrays.asList(
jjg@280 84 "boolean", "byte", "char", "double", "float", "int", "long", "short", "void"));
jjg@280 85
jjg@46 86 @Override
jjg@46 87 public String toString() {
jjg@46 88 return name;
jjg@46 89 }
jjg@46 90
jjg@46 91 public final String name;
jjg@46 92 }
jjg@46 93
jjg@46 94 public static class ArrayType extends Type {
jjg@46 95 public ArrayType(Type elemType) {
jjg@46 96 this.elemType = elemType;
jjg@46 97 }
jjg@46 98
jjg@280 99 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 100 return visitor.visitArrayType(this, data);
jjg@280 101 }
jjg@280 102
jjg@46 103 @Override
jjg@46 104 public String toString() {
jjg@46 105 return elemType + "[]";
jjg@46 106 }
jjg@46 107
jjg@46 108 public final Type elemType;
jjg@46 109 }
jjg@46 110
jjg@46 111 public static class MethodType extends Type {
jjg@46 112 public MethodType(List<? extends Type> argTypes, Type resultType) {
jjg@46 113 this(null, argTypes, resultType, null);
jjg@46 114 }
jjg@46 115
jjg@46 116 public MethodType(List<? extends Type> typeArgTypes,
jjg@46 117 List<? extends Type> argTypes,
jjg@46 118 Type returnType,
jjg@46 119 List<? extends Type> throwsTypes) {
jjg@46 120 this.typeArgTypes = typeArgTypes;
jjg@46 121 this.argTypes = argTypes;
jjg@46 122 this.returnType = returnType;
jjg@46 123 this.throwsTypes = throwsTypes;
jjg@46 124 }
jjg@46 125
jjg@280 126 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 127 return visitor.visitMethodType(this, data);
jjg@280 128 }
jjg@280 129
jjg@46 130 @Override
jjg@46 131 public String toString() {
jjg@46 132 StringBuilder sb = new StringBuilder();
jjg@46 133 appendIfNotEmpty(sb, "<", typeArgTypes, "> ");
jjg@46 134 sb.append(returnType);
jjg@46 135 append(sb, " (", argTypes, ")");
jjg@46 136 appendIfNotEmpty(sb, " throws ", throwsTypes, "");
jjg@46 137 return sb.toString();
jjg@46 138 }
jjg@46 139
jjg@46 140 public final List<? extends Type> typeArgTypes;
jjg@46 141 public final List<? extends Type> argTypes;
jjg@46 142 public final Type returnType;
jjg@46 143 public final List<? extends Type> throwsTypes;
jjg@46 144 }
jjg@46 145
jjg@46 146 public static class ClassSigType extends Type {
jjg@46 147 public ClassSigType(List<Type> typeArgTypes, Type superclassType, List<Type> superinterfaceTypes) {
jjg@46 148 this.typeArgTypes = typeArgTypes;
jjg@46 149 this.superclassType = superclassType;
jjg@46 150 this.superinterfaceTypes = superinterfaceTypes;
jjg@46 151 }
jjg@46 152
jjg@280 153 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 154 return visitor.visitClassSigType(this, data);
jjg@280 155 }
jjg@280 156
jjg@46 157 @Override
jjg@46 158 public String toString() {
jjg@46 159 StringBuilder sb = new StringBuilder();
jjg@46 160 appendIfNotEmpty(sb, "<", typeArgTypes, ">");
jjg@65 161 if (superclassType != null) {
jjg@46 162 sb.append(" extends ");
jjg@46 163 sb.append(superclassType);
jjg@46 164 }
jjg@46 165 appendIfNotEmpty(sb, " implements ", superinterfaceTypes, "");
jjg@46 166 return sb.toString();
jjg@46 167 }
jjg@46 168
jjg@46 169 public final List<Type> typeArgTypes;
jjg@46 170 public final Type superclassType;
jjg@46 171 public final List<Type> superinterfaceTypes;
jjg@46 172 }
jjg@46 173
jjg@46 174 public static class ClassType extends Type {
jjg@46 175 public ClassType(String name, List<Type> typeArgs) {
jjg@46 176 this.name = name;
jjg@46 177 this.typeArgs = typeArgs;
jjg@46 178 }
jjg@46 179
jjg@280 180 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 181 return visitor.visitClassType(this, data);
jjg@280 182 }
jjg@280 183
jjg@46 184 @Override
jjg@46 185 public String toString() {
jjg@46 186 StringBuilder sb = new StringBuilder();
jjg@46 187 sb.append(name);
jjg@46 188 appendIfNotEmpty(sb, "<", typeArgs, ">");
jjg@46 189 return sb.toString();
jjg@46 190 }
jjg@46 191
jjg@46 192 public final String name;
jjg@46 193 public final List<Type> typeArgs;
jjg@46 194 }
jjg@46 195
jjg@46 196
jjg@46 197 public static class InnerClassType extends Type {
jjg@46 198 public InnerClassType(Type outerType, Type innerType) {
jjg@46 199 this.outerType = outerType;
jjg@46 200 this.innerType = innerType;
jjg@46 201 }
jjg@46 202
jjg@280 203 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 204 return visitor.visitInnerClassType(this, data);
jjg@280 205 }
jjg@280 206
jjg@46 207 @Override
jjg@46 208 public String toString() {
jjg@46 209 return outerType + "." + innerType;
jjg@46 210 }
jjg@46 211
jjg@46 212 public final Type outerType;
jjg@46 213 public final Type innerType;
jjg@46 214 }
jjg@46 215
jjg@46 216 public static class TypeArgType extends Type {
jjg@46 217 public TypeArgType(String name, Type classBound, List<Type> interfaceBounds) {
jjg@46 218 this.name = name;
jjg@46 219 this.classBound = classBound;
jjg@46 220 this.interfaceBounds = interfaceBounds;
jjg@46 221 }
jjg@46 222
jjg@280 223 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 224 return visitor.visitTypeArgType(this, data);
jjg@280 225 }
jjg@280 226
jjg@46 227 @Override
jjg@46 228 public String toString() {
jjg@46 229 StringBuilder sb = new StringBuilder();
jjg@46 230 sb.append(name);
jjg@46 231 String sep = " extends ";
jjg@65 232 if (classBound != null) {
jjg@46 233 sb.append(sep);
jjg@46 234 sb.append(classBound);
jjg@46 235 sep = " & ";
jjg@46 236 }
jjg@46 237 if (interfaceBounds != null) {
jjg@46 238 for (Type bound: interfaceBounds) {
jjg@46 239 sb.append(sep);
jjg@46 240 sb.append(bound);
jjg@46 241 sep = " & ";
jjg@46 242 }
jjg@46 243 }
jjg@46 244 return sb.toString();
jjg@46 245 }
jjg@46 246
jjg@46 247 public final String name;
jjg@46 248 public final Type classBound;
jjg@46 249 public final List<Type> interfaceBounds;
jjg@46 250 }
jjg@46 251
jjg@46 252 public static class WildcardType extends Type {
jjg@46 253 public WildcardType() {
jjg@46 254 this(null, null);
jjg@46 255 }
jjg@46 256
jjg@46 257 public WildcardType(String kind, Type boundType) {
jjg@46 258 this.kind = kind;
jjg@46 259 this.boundType = boundType;
jjg@46 260 }
jjg@46 261
jjg@280 262 public <R, D> R accept(Visitor<R, D> visitor, D data) {
jjg@280 263 return visitor.visitWildcardType(this, data);
jjg@280 264 }
jjg@280 265
jjg@46 266 @Override
jjg@46 267 public String toString() {
jjg@46 268 if (kind == null)
jjg@46 269 return "?";
jjg@46 270 else
jjg@46 271 return "? " + kind + " " + boundType;
jjg@46 272 }
jjg@46 273
jjg@46 274 public final String kind;
jjg@46 275 public final Type boundType;
jjg@46 276 }
jjg@46 277 }

mercurial