001: /*
002: * Copyright 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.tools.javadoc;
027:
028: import com.sun.javadoc.*;
029:
030: import static com.sun.javadoc.LanguageVersion.*;
031:
032: import com.sun.tools.javac.code.Symbol.ClassSymbol;
033: import com.sun.tools.javac.code.Type;
034: import com.sun.tools.javac.code.Type.ClassType;
035: import com.sun.tools.javac.util.List;
036:
037: import static com.sun.tools.javac.code.TypeTags.*;
038:
039: /**
040: * Implementation of <code>ParameterizedType</code>, which
041: * represents an invocation of a generic class or interface.
042: *
043: * @author Scott Seligman
044: * @version 1.18 07/05/05
045: * @since 1.5
046: */
047: public class ParameterizedTypeImpl extends AbstractTypeImpl implements
048: ParameterizedType {
049:
050: ParameterizedTypeImpl(DocEnv env, Type type) {
051: super (env, type);
052: }
053:
054: /**
055: * Return the generic class or interface that declared this type.
056: */
057: public ClassDoc asClassDoc() {
058: return env.getClassDoc((ClassSymbol) type.tsym);
059: }
060:
061: /**
062: * Return the actual type arguments of this type.
063: */
064: public com.sun.javadoc.Type[] typeArguments() {
065: return TypeMaker.getTypes(env, type.getTypeArguments());
066: }
067:
068: /**
069: * Return the class type that is a direct supertype of this one.
070: * Return null if this is an interface type.
071: */
072: public com.sun.javadoc.Type super classType() {
073: if (asClassDoc().isInterface()) {
074: return null;
075: }
076: Type sup = env.types.super type(type);
077: return TypeMaker.getType(env, (sup != type) ? sup
078: : env.syms.objectType);
079: }
080:
081: /**
082: * Return the interface types directly implemented by or extended by this
083: * parameterized type.
084: * Return an empty array if there are no interfaces.
085: */
086: public com.sun.javadoc.Type[] interfaceTypes() {
087: return TypeMaker.getTypes(env, env.types.interfaces(type));
088: }
089:
090: /**
091: * Return the type that contains this type as a member.
092: * Return null is this is a top-level type.
093: */
094: public com.sun.javadoc.Type containingType() {
095: if (type.getEnclosingType().tag == CLASS) {
096: // This is the type of an inner class.
097: return TypeMaker.getType(env, type.getEnclosingType());
098: }
099: ClassSymbol enclosing = type.tsym.owner.enclClass();
100: if (enclosing != null) {
101: // Nested but not inner. Return the ClassDoc of the enclosing
102: // class or interface.
103: // See java.lang.reflect.ParameterizedType.getOwnerType().
104: return env.getClassDoc(enclosing);
105: }
106: return null;
107: }
108:
109: // Asking for the "name" of a parameterized type doesn't exactly make
110: // sense. It's a type expression. Return the name of its generic
111: // type.
112: public String typeName() {
113: return TypeMaker.getTypeName(type, false);
114: }
115:
116: public ParameterizedType asParameterizedType() {
117: return this ;
118: }
119:
120: public String toString() {
121: return parameterizedTypeToString(env, (ClassType) type, true);
122: }
123:
124: static String parameterizedTypeToString(DocEnv env, ClassType cl,
125: boolean full) {
126: if (env.legacyDoclet) {
127: return TypeMaker.getTypeName(cl, full);
128: }
129: StringBuffer s = new StringBuffer();
130: if (cl.getEnclosingType().tag != CLASS) { // if not an inner class...
131: s.append(TypeMaker.getTypeName(cl, full));
132: } else {
133: ClassType encl = (ClassType) cl.getEnclosingType();
134: s.append(parameterizedTypeToString(env, encl, full))
135: .append('.').append(cl.tsym.name.toString());
136: }
137: s.append(TypeMaker.typeArgumentsString(env, cl, full));
138: return s.toString();
139: }
140: }
|