1/* 2 * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26package com.sun.tools.javadoc.main; 27 28import com.sun.javadoc.*; 29 30import com.sun.tools.javac.code.Symbol.ClassSymbol; 31import com.sun.tools.javac.code.Type; 32import com.sun.tools.javac.util.List; 33 34 35/** 36 * Implementation of <code>WildcardType</code>, which 37 * represents a wildcard type. 38 * 39 * <p><b>This is NOT part of any supported API. 40 * If you write code that depends on this, you do so at your own risk. 41 * This code and its internal interfaces are subject to change or 42 * deletion without notice.</b> 43 * 44 * @author Scott Seligman 45 * @since 1.5 46 */ 47@Deprecated 48public class WildcardTypeImpl extends AbstractTypeImpl implements WildcardType { 49 50 WildcardTypeImpl(DocEnv env, Type.WildcardType type) { 51 super(env, type); 52 } 53 54 /** 55 * Return the upper bounds of this wildcard type argument 56 * as given by the <i>extends</i> clause. 57 * Return an empty array if no such bounds are explicitly given. 58 */ 59 public com.sun.javadoc.Type[] extendsBounds() { 60 return TypeMaker.getTypes(env, getExtendsBounds((Type.WildcardType)type)); 61 } 62 63 /** 64 * Return the lower bounds of this wildcard type argument 65 * as given by the <i>super</i> clause. 66 * Return an empty array if no such bounds are explicitly given. 67 */ 68 public com.sun.javadoc.Type[] superBounds() { 69 return TypeMaker.getTypes(env, getSuperBounds((Type.WildcardType)type)); 70 } 71 72 /** 73 * Return the ClassDoc of the erasure of this wildcard type. 74 */ 75 @Override 76 public ClassDoc asClassDoc() { 77 return env.getClassDoc((ClassSymbol)env.types.erasure(type).tsym); 78 } 79 80 @Override 81 public WildcardType asWildcardType() { 82 return this; 83 } 84 85 @Override 86 public String typeName() { return "?"; } 87 @Override 88 public String qualifiedTypeName() { return "?"; } 89 @Override 90 public String simpleTypeName() { return "?"; } 91 92 @Override 93 public String toString() { 94 return wildcardTypeToString(env, (Type.WildcardType)type, true); 95 } 96 97 98 /** 99 * Return the string form of a wildcard type ("?") along with any 100 * "extends" or "super" clause. Delimiting brackets are not 101 * included. Class names are qualified if "full" is true. 102 */ 103 static String wildcardTypeToString(DocEnv env, 104 Type.WildcardType wildThing, boolean full) { 105 if (env.legacyDoclet) { 106 return TypeMaker.getTypeName(env.types.erasure(wildThing), full); 107 } 108 StringBuilder s = new StringBuilder("?"); 109 List<Type> bounds = getExtendsBounds(wildThing); 110 if (bounds.nonEmpty()) { 111 s.append(" extends "); 112 } else { 113 bounds = getSuperBounds(wildThing); 114 if (bounds.nonEmpty()) { 115 s.append(" super "); 116 } 117 } 118 boolean first = true; // currently only one bound is allowed 119 for (Type b : bounds) { 120 if (!first) { 121 s.append(" & "); 122 } 123 s.append(TypeMaker.getTypeString(env, b, full)); 124 first = false; 125 } 126 return s.toString(); 127 } 128 129 private static List<Type> getExtendsBounds(Type.WildcardType wild) { 130 return wild.isSuperBound() 131 ? List.nil() 132 : List.of(wild.type); 133 } 134 135 private static List<Type> getSuperBounds(Type.WildcardType wild) { 136 return wild.isExtendsBound() 137 ? List.nil() 138 : List.of(wild.type); 139 } 140} 141