src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java

Tue, 09 Oct 2012 19:10:00 -0700

author
jjg
date
Tue, 09 Oct 2012 19:10:00 -0700
changeset 1357
c75be5bc5283
parent 1051
b0909f992710
child 1359
25e14ad23cef
permissions
-rw-r--r--

8000663: clean up langtools imports
Reviewed-by: darcy

duke@1 1 /*
jjg@1357 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
duke@1 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@1 4 *
duke@1 5 * This code is free software; you can redistribute it and/or modify it
duke@1 6 * under the terms of the GNU General Public License version 2 only, as
ohair@554 7 * published by the Free Software Foundation. Oracle designates this
duke@1 8 * particular file as subject to the "Classpath" exception as provided
ohair@554 9 * by Oracle in the LICENSE file that accompanied this code.
duke@1 10 *
duke@1 11 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@1 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@1 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@1 14 * version 2 for more details (a copy is included in the LICENSE file that
duke@1 15 * accompanied this code).
duke@1 16 *
duke@1 17 * You should have received a copy of the GNU General Public License version
duke@1 18 * 2 along with this work; if not, write to the Free Software Foundation,
duke@1 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@1 20 *
ohair@554 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
ohair@554 22 * or visit www.oracle.com if you need additional information or have any
ohair@554 23 * questions.
duke@1 24 */
duke@1 25
duke@1 26 package com.sun.tools.javadoc;
duke@1 27
jjg@1357 28 import java.io.IOException;
jjg@197 29 import java.io.InputStream;
jjg@1357 30
jjg@197 31 import javax.tools.FileObject;
jjg@197 32
duke@1 33 import com.sun.javadoc.*;
duke@1 34 import com.sun.tools.javac.code.Attribute;
duke@1 35 import com.sun.tools.javac.code.Scope;
duke@1 36 import com.sun.tools.javac.code.Symbol.ClassSymbol;
duke@1 37 import com.sun.tools.javac.code.Symbol.PackageSymbol;
duke@1 38 import com.sun.tools.javac.tree.JCTree;
jjg@197 39 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
duke@1 40 import com.sun.tools.javac.util.List;
duke@1 41 import com.sun.tools.javac.util.ListBuffer;
duke@1 42 import com.sun.tools.javac.util.Name;
duke@1 43 import com.sun.tools.javac.util.Position;
duke@1 44
duke@1 45 /**
duke@1 46 * Represents a java package. Provides access to information
duke@1 47 * about the package, the package's comment and tags, and the
duke@1 48 * classes in the package.
duke@1 49 *
duke@1 50 * @since 1.2
duke@1 51 * @author Kaiyang Liu (original)
duke@1 52 * @author Robert Field (rewrite)
duke@1 53 * @author Neal Gafter (rewrite)
duke@1 54 * @author Scott Seligman (package-info.java)
duke@1 55 */
duke@1 56
duke@1 57 public class PackageDocImpl extends DocImpl implements PackageDoc {
duke@1 58
duke@1 59 protected PackageSymbol sym;
duke@1 60 private JCCompilationUnit tree = null; // for source position
duke@1 61
jjg@197 62 public FileObject docPath = null;
duke@1 63 private boolean foundDoc; // found a doc comment in either
duke@1 64 // package.html or package-info.java
duke@1 65
duke@1 66 boolean isIncluded = false; // Set in RootDocImpl.
duke@1 67 public boolean setDocPath = false; //Flag to avoid setting doc path multiple times.
duke@1 68
duke@1 69 /**
duke@1 70 * Constructor
duke@1 71 */
duke@1 72 public PackageDocImpl(DocEnv env, PackageSymbol sym) {
duke@1 73 this(env, sym, null, null);
duke@1 74 }
duke@1 75
duke@1 76 /**
duke@1 77 * Constructor
duke@1 78 */
duke@1 79 public PackageDocImpl(DocEnv env, PackageSymbol sym,
duke@1 80 String documentation, JCTree tree) {
duke@1 81 super(env, documentation);
duke@1 82 this.sym = sym;
duke@1 83 this.tree = (JCCompilationUnit) tree;
duke@1 84 foundDoc = (documentation != null);
duke@1 85 }
duke@1 86
duke@1 87 void setTree(JCTree tree) {
duke@1 88 this.tree = (JCCompilationUnit) tree;
duke@1 89 }
duke@1 90
duke@1 91 public void setRawCommentText(String rawDocumentation) {
duke@1 92 super.setRawCommentText(rawDocumentation);
duke@1 93 checkDoc();
duke@1 94 }
duke@1 95
duke@1 96 /**
duke@1 97 * Do lazy initialization of "documentation" string.
duke@1 98 */
ksrini@1051 99 protected String documentation() {
jjg@197 100 if (documentation != null)
jjg@197 101 return documentation;
duke@1 102 if (docPath != null) {
duke@1 103 // read from file
duke@1 104 try {
jjg@197 105 InputStream s = docPath.openInputStream();
duke@1 106 documentation = readHTMLDocumentation(s, docPath);
duke@1 107 } catch (IOException exc) {
duke@1 108 documentation = "";
jjg@197 109 env.error(null, "javadoc.File_Read_Error", docPath.getName());
duke@1 110 }
duke@1 111 } else {
duke@1 112 // no doc file to be had
duke@1 113 documentation = "";
duke@1 114 }
duke@1 115 return documentation;
duke@1 116 }
duke@1 117
duke@1 118 /**
duke@1 119 * Cache of all classes contained in this package, including
duke@1 120 * member classes of those classes, and their member classes, etc.
duke@1 121 * Includes only those classes at the specified protection level
duke@1 122 * and weaker.
duke@1 123 */
duke@1 124 private List<ClassDocImpl> allClassesFiltered = null;
duke@1 125
duke@1 126 /**
duke@1 127 * Cache of all classes contained in this package, including
duke@1 128 * member classes of those classes, and their member classes, etc.
duke@1 129 */
duke@1 130 private List<ClassDocImpl> allClasses = null;
duke@1 131
duke@1 132 /**
duke@1 133 * Return a list of all classes contained in this package, including
duke@1 134 * member classes of those classes, and their member classes, etc.
duke@1 135 */
duke@1 136 private List<ClassDocImpl> getClasses(boolean filtered) {
duke@1 137 if (allClasses != null && !filtered) {
duke@1 138 return allClasses;
duke@1 139 }
duke@1 140 if (allClassesFiltered != null && filtered) {
duke@1 141 return allClassesFiltered;
duke@1 142 }
duke@1 143 ListBuffer<ClassDocImpl> classes = new ListBuffer<ClassDocImpl>();
duke@1 144 for (Scope.Entry e = sym.members().elems; e != null; e = e.sibling) {
duke@1 145 if (e.sym != null) {
duke@1 146 ClassSymbol s = (ClassSymbol)e.sym;
duke@1 147 ClassDocImpl c = env.getClassDoc(s);
duke@1 148 if (c != null && !c.isSynthetic())
duke@1 149 c.addAllClasses(classes, filtered);
duke@1 150 }
duke@1 151 }
duke@1 152 if (filtered)
duke@1 153 return allClassesFiltered = classes.toList();
duke@1 154 else
duke@1 155 return allClasses = classes.toList();
duke@1 156 }
duke@1 157
duke@1 158 /**
duke@1 159 * Add all included classes (including Exceptions and Errors)
duke@1 160 * and interfaces.
duke@1 161 */
duke@1 162 public void addAllClassesTo(ListBuffer<ClassDocImpl> list) {
duke@1 163 list.appendList(getClasses(true));
duke@1 164 }
duke@1 165
duke@1 166 /**
duke@1 167 * Get all classes (including Exceptions and Errors)
duke@1 168 * and interfaces.
duke@1 169 * @since J2SE1.4.
duke@1 170 *
duke@1 171 * @return all classes and interfaces in this package, filtered to include
duke@1 172 * only the included classes if filter==true.
duke@1 173 */
duke@1 174 public ClassDoc[] allClasses(boolean filter) {
duke@1 175 List<ClassDocImpl> classes = getClasses(filter);
duke@1 176 return classes.toArray(new ClassDocImpl[classes.length()]);
duke@1 177 }
duke@1 178
duke@1 179 /**
duke@1 180 * Get all included classes (including Exceptions and Errors)
duke@1 181 * and interfaces. Same as allClasses(true).
duke@1 182 *
duke@1 183 * @return all included classes and interfaces in this package.
duke@1 184 */
duke@1 185 public ClassDoc[] allClasses() {
duke@1 186 return allClasses(true);
duke@1 187 }
duke@1 188
duke@1 189 /**
duke@1 190 * Get ordinary classes (that is, exclude exceptions, errors,
duke@1 191 * enums, interfaces, and annotation types) in this package.
duke@1 192 *
duke@1 193 * @return included ordinary classes in this package.
duke@1 194 */
duke@1 195 public ClassDoc[] ordinaryClasses() {
duke@1 196 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 197 for (ClassDocImpl c : getClasses(true)) {
duke@1 198 if (c.isOrdinaryClass()) {
duke@1 199 ret.append(c);
duke@1 200 }
duke@1 201 }
duke@1 202 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 203 }
duke@1 204
duke@1 205 /**
duke@1 206 * Get Exception classes in this package.
duke@1 207 *
duke@1 208 * @return included Exceptions in this package.
duke@1 209 */
duke@1 210 public ClassDoc[] exceptions() {
duke@1 211 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 212 for (ClassDocImpl c : getClasses(true)) {
duke@1 213 if (c.isException()) {
duke@1 214 ret.append(c);
duke@1 215 }
duke@1 216 }
duke@1 217 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 218 }
duke@1 219
duke@1 220 /**
duke@1 221 * Get Error classes in this package.
duke@1 222 *
duke@1 223 * @return included Errors in this package.
duke@1 224 */
duke@1 225 public ClassDoc[] errors() {
duke@1 226 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 227 for (ClassDocImpl c : getClasses(true)) {
duke@1 228 if (c.isError()) {
duke@1 229 ret.append(c);
duke@1 230 }
duke@1 231 }
duke@1 232 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 233 }
duke@1 234
duke@1 235 /**
duke@1 236 * Get included enum types in this package.
duke@1 237 *
duke@1 238 * @return included enum types in this package.
duke@1 239 */
duke@1 240 public ClassDoc[] enums() {
duke@1 241 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 242 for (ClassDocImpl c : getClasses(true)) {
duke@1 243 if (c.isEnum()) {
duke@1 244 ret.append(c);
duke@1 245 }
duke@1 246 }
duke@1 247 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 248 }
duke@1 249
duke@1 250 /**
duke@1 251 * Get included interfaces in this package, omitting annotation types.
duke@1 252 *
duke@1 253 * @return included interfaces in this package.
duke@1 254 */
duke@1 255 public ClassDoc[] interfaces() {
duke@1 256 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 257 for (ClassDocImpl c : getClasses(true)) {
duke@1 258 if (c.isInterface()) {
duke@1 259 ret.append(c);
duke@1 260 }
duke@1 261 }
duke@1 262 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 263 }
duke@1 264
duke@1 265 /**
duke@1 266 * Get included annotation types in this package.
duke@1 267 *
duke@1 268 * @return included annotation types in this package.
duke@1 269 */
duke@1 270 public AnnotationTypeDoc[] annotationTypes() {
duke@1 271 ListBuffer<AnnotationTypeDocImpl> ret =
duke@1 272 new ListBuffer<AnnotationTypeDocImpl>();
duke@1 273 for (ClassDocImpl c : getClasses(true)) {
duke@1 274 if (c.isAnnotationType()) {
duke@1 275 ret.append((AnnotationTypeDocImpl)c);
duke@1 276 }
duke@1 277 }
duke@1 278 return ret.toArray(new AnnotationTypeDocImpl[ret.length()]);
duke@1 279 }
duke@1 280
duke@1 281 /**
duke@1 282 * Get the annotations of this package.
duke@1 283 * Return an empty array if there are none.
duke@1 284 */
duke@1 285 public AnnotationDesc[] annotations() {
duke@1 286 AnnotationDesc res[] = new AnnotationDesc[sym.getAnnotationMirrors().length()];
duke@1 287 int i = 0;
duke@1 288 for (Attribute.Compound a : sym.getAnnotationMirrors()) {
duke@1 289 res[i++] = new AnnotationDescImpl(env, a);
duke@1 290 }
duke@1 291 return res;
duke@1 292 }
duke@1 293
duke@1 294
duke@1 295 /**
duke@1 296 * Lookup for a class within this package.
duke@1 297 *
duke@1 298 * @return ClassDocImpl of found class, or null if not found.
duke@1 299 */
duke@1 300 public ClassDoc findClass(String className) {
duke@1 301 final boolean filtered = true;
duke@1 302 for (ClassDocImpl c : getClasses(filtered)) {
duke@1 303 if (c.name().equals(className)) {
duke@1 304 return c;
duke@1 305 }
duke@1 306 }
duke@1 307 return null;
duke@1 308 }
duke@1 309
duke@1 310 /**
duke@1 311 * Return true if this package is included in the active set.
duke@1 312 */
duke@1 313 public boolean isIncluded() {
duke@1 314 return isIncluded;
duke@1 315 }
duke@1 316
duke@1 317 /**
duke@1 318 * Get package name.
duke@1 319 *
duke@1 320 * Note that we do not provide a means of obtaining the simple
duke@1 321 * name of a package -- package names are always returned in their
duke@1 322 * uniquely qualified form.
duke@1 323 */
duke@1 324 public String name() {
duke@1 325 return qualifiedName();
duke@1 326 }
duke@1 327
duke@1 328 /**
duke@1 329 * Get package name.
duke@1 330 */
duke@1 331 public String qualifiedName() {
duke@1 332 Name fullname = sym.getQualifiedName();
duke@1 333 // Some bogus tests depend on the interned "" being returned.
duke@1 334 // See 6457276.
duke@1 335 return fullname.isEmpty() ? "" : fullname.toString();
duke@1 336 }
duke@1 337
duke@1 338 /**
duke@1 339 * set doc path for an unzipped directory
duke@1 340 */
jjg@197 341 public void setDocPath(FileObject path) {
duke@1 342 setDocPath = true;
duke@1 343 if (path == null)
duke@1 344 return;
jjg@197 345 if (!path.equals(docPath)) {
jjg@197 346 docPath = path;
duke@1 347 checkDoc();
duke@1 348 }
duke@1 349 }
duke@1 350
duke@1 351 // Has checkDoc() sounded off yet?
duke@1 352 private boolean checkDocWarningEmitted = false;
duke@1 353
duke@1 354 /**
duke@1 355 * Invoked when a source of package doc comments is located.
duke@1 356 * Emits a diagnostic if this is the second one.
duke@1 357 */
duke@1 358 private void checkDoc() {
duke@1 359 if (foundDoc) {
duke@1 360 if (!checkDocWarningEmitted) {
duke@1 361 env.warning(null, "javadoc.Multiple_package_comments", name());
duke@1 362 checkDocWarningEmitted = true;
duke@1 363 }
duke@1 364 } else {
duke@1 365 foundDoc = true;
duke@1 366 }
duke@1 367 }
duke@1 368
duke@1 369 /**
duke@1 370 * Return the source position of the entity, or null if
duke@1 371 * no position is available.
duke@1 372 */
duke@1 373 public SourcePosition position() {
duke@1 374 return (tree != null)
jjg@197 375 ? SourcePositionImpl.make(tree.sourcefile, tree.pos, tree.lineMap)
duke@1 376 : SourcePositionImpl.make(docPath, Position.NOPOS, null);
duke@1 377 }
duke@1 378 }

mercurial