001: /*
002: * Copyright 1997-2006 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 com.sun.tools.javac.code.Attribute;
031: import com.sun.tools.javac.code.Flags;
032: import com.sun.tools.javac.code.Symbol;
033: import com.sun.tools.javac.code.Symbol.ClassSymbol;
034:
035: import com.sun.tools.javac.tree.JCTree;
036:
037: import com.sun.tools.javac.util.Position;
038:
039: import java.lang.reflect.Modifier;
040: import java.text.CollationKey;
041:
042: /**
043: * Represents a java program element: class, interface, field,
044: * constructor, or method.
045: * This is an abstract class dealing with information common to
046: * these elements.
047: *
048: * @see MemberDocImpl
049: * @see ClassDocImpl
050: *
051: * @author Robert Field
052: * @author Neal Gafter (rewrite)
053: * @author Scott Seligman (generics, enums, annotations)
054: */
055: public abstract class ProgramElementDocImpl extends DocImpl implements
056: ProgramElementDoc {
057:
058: private final Symbol sym;
059:
060: // For source position information.
061: JCTree tree = null;
062: Position.LineMap lineMap = null;
063:
064: // Cache for getModifiers().
065: private int modifiers = -1;
066:
067: protected ProgramElementDocImpl(DocEnv env, Symbol sym, String doc,
068: JCTree tree, Position.LineMap lineMap) {
069: super (env, doc);
070: this .sym = sym;
071: this .tree = tree;
072: this .lineMap = lineMap;
073: }
074:
075: void setTree(JCTree tree) {
076: this .tree = tree;
077: }
078:
079: /**
080: * Subclasses override to identify the containing class
081: */
082: protected abstract ClassSymbol getContainingClass();
083:
084: /**
085: * Returns the flags in terms of javac's flags
086: */
087: abstract protected long getFlags();
088:
089: /**
090: * Returns the modifier flags in terms of java.lang.reflect.Modifier.
091: */
092: protected int getModifiers() {
093: if (modifiers == -1) {
094: modifiers = DocEnv.translateModifiers(getFlags());
095: }
096: return modifiers;
097: }
098:
099: /**
100: * Get the containing class of this program element.
101: *
102: * @return a ClassDocImpl for this element's containing class.
103: * If this is a class with no outer class, return null.
104: */
105: public ClassDoc containingClass() {
106: if (getContainingClass() == null) {
107: return null;
108: }
109: return env.getClassDoc(getContainingClass());
110: }
111:
112: /**
113: * Return the package that this member is contained in.
114: * Return "" if in unnamed package.
115: */
116: public PackageDoc containingPackage() {
117: return env.getPackageDoc(getContainingClass().packge());
118: }
119:
120: /**
121: * Get the modifier specifier integer.
122: *
123: * @see java.lang.reflect.Modifier
124: */
125: public int modifierSpecifier() {
126: int modifiers = getModifiers();
127: if (isMethod() && containingClass().isInterface())
128: // Remove the implicit abstract modifier.
129: return modifiers & ~Modifier.ABSTRACT;
130: return modifiers;
131: }
132:
133: /**
134: * Get modifiers string.
135: * <pre>
136: * Example, for:
137: * public abstract int foo() { ... }
138: * modifiers() would return:
139: * 'public abstract'
140: * </pre>
141: * Annotations are not included.
142: */
143: public String modifiers() {
144: int modifiers = getModifiers();
145: if (isAnnotationTypeElement()
146: || (isMethod() && containingClass().isInterface())) {
147: // Remove the implicit abstract modifier.
148: return Modifier.toString(modifiers & ~Modifier.ABSTRACT);
149: } else {
150: return Modifier.toString(modifiers);
151: }
152: }
153:
154: /**
155: * Get the annotations of this program element.
156: * Return an empty array if there are none.
157: */
158: public AnnotationDesc[] annotations() {
159: AnnotationDesc res[] = new AnnotationDesc[sym
160: .getAnnotationMirrors().length()];
161: int i = 0;
162: for (Attribute.Compound a : sym.getAnnotationMirrors()) {
163: res[i++] = new AnnotationDescImpl(env, a);
164: }
165: return res;
166: }
167:
168: /**
169: * Return true if this program element is public
170: */
171: public boolean isPublic() {
172: int modifiers = getModifiers();
173: return Modifier.isPublic(modifiers);
174: }
175:
176: /**
177: * Return true if this program element is protected
178: */
179: public boolean isProtected() {
180: int modifiers = getModifiers();
181: return Modifier.isProtected(modifiers);
182: }
183:
184: /**
185: * Return true if this program element is private
186: */
187: public boolean isPrivate() {
188: int modifiers = getModifiers();
189: return Modifier.isPrivate(modifiers);
190: }
191:
192: /**
193: * Return true if this program element is package private
194: */
195: public boolean isPackagePrivate() {
196: return !(isPublic() || isPrivate() || isProtected());
197: }
198:
199: /**
200: * Return true if this program element is static
201: */
202: public boolean isStatic() {
203: int modifiers = getModifiers();
204: return Modifier.isStatic(modifiers);
205: }
206:
207: /**
208: * Return true if this program element is final
209: */
210: public boolean isFinal() {
211: int modifiers = getModifiers();
212: return Modifier.isFinal(modifiers);
213: }
214:
215: /**
216: * Generate a key for sorting.
217: */
218: CollationKey generateKey() {
219: String k = name();
220: // System.out.println("COLLATION KEY FOR " + this + " is \"" + k + "\"");
221: return env.doclocale.collator.getCollationKey(k);
222: }
223:
224: }
|