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

Mon, 25 Mar 2013 16:55:14 -0700

author
mfang
date
Mon, 25 Mar 2013 16:55:14 -0700
changeset 1658
fdf30b225e1c
parent 1464
f72c9c5aeaef
child 1706
95d29b99e5b3
permissions
-rw-r--r--

8010521: jdk8 l10n resource file translation update 2
Reviewed-by: naoto, yhuang

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.*;
jjg@1443 34 import com.sun.source.util.TreePath;
duke@1 35 import com.sun.tools.javac.code.Attribute;
duke@1 36 import com.sun.tools.javac.code.Scope;
duke@1 37 import com.sun.tools.javac.code.Symbol.ClassSymbol;
duke@1 38 import com.sun.tools.javac.code.Symbol.PackageSymbol;
duke@1 39 import com.sun.tools.javac.tree.JCTree;
jjg@197 40 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
duke@1 41 import com.sun.tools.javac.util.List;
duke@1 42 import com.sun.tools.javac.util.ListBuffer;
duke@1 43 import com.sun.tools.javac.util.Name;
duke@1 44 import com.sun.tools.javac.util.Position;
duke@1 45
duke@1 46 /**
duke@1 47 * Represents a java package. Provides access to information
duke@1 48 * about the package, the package's comment and tags, and the
duke@1 49 * classes in the package.
duke@1 50 *
jjg@1359 51 * <p><b>This is NOT part of any supported API.
jjg@1359 52 * If you write code that depends on this, you do so at your own risk.
jjg@1359 53 * This code and its internal interfaces are subject to change or
jjg@1359 54 * deletion without notice.</b>
jjg@1359 55 *
duke@1 56 * @since 1.2
duke@1 57 * @author Kaiyang Liu (original)
duke@1 58 * @author Robert Field (rewrite)
duke@1 59 * @author Neal Gafter (rewrite)
duke@1 60 * @author Scott Seligman (package-info.java)
duke@1 61 */
duke@1 62
duke@1 63 public class PackageDocImpl extends DocImpl implements PackageDoc {
duke@1 64
duke@1 65 protected PackageSymbol sym;
duke@1 66 private JCCompilationUnit tree = null; // for source position
duke@1 67
jjg@197 68 public FileObject docPath = null;
duke@1 69 private boolean foundDoc; // found a doc comment in either
duke@1 70 // package.html or package-info.java
duke@1 71
duke@1 72 boolean isIncluded = false; // Set in RootDocImpl.
duke@1 73 public boolean setDocPath = false; //Flag to avoid setting doc path multiple times.
duke@1 74
duke@1 75 /**
duke@1 76 * Constructor
duke@1 77 */
duke@1 78 public PackageDocImpl(DocEnv env, PackageSymbol sym) {
jjg@1443 79 this(env, sym, null);
duke@1 80 }
duke@1 81
duke@1 82 /**
duke@1 83 * Constructor
duke@1 84 */
jjg@1443 85 public PackageDocImpl(DocEnv env, PackageSymbol sym, TreePath treePath) {
jjg@1443 86 super(env, treePath);
duke@1 87 this.sym = sym;
jjg@1443 88 this.tree = (treePath == null) ? null : (JCCompilationUnit) treePath.getCompilationUnit();
duke@1 89 foundDoc = (documentation != null);
duke@1 90 }
duke@1 91
duke@1 92 void setTree(JCTree tree) {
duke@1 93 this.tree = (JCCompilationUnit) tree;
duke@1 94 }
duke@1 95
jjg@1443 96 public void setTreePath(TreePath treePath) {
jjg@1443 97 super.setTreePath(treePath);
duke@1 98 checkDoc();
duke@1 99 }
duke@1 100
duke@1 101 /**
duke@1 102 * Do lazy initialization of "documentation" string.
duke@1 103 */
ksrini@1051 104 protected String documentation() {
jjg@197 105 if (documentation != null)
jjg@197 106 return documentation;
duke@1 107 if (docPath != null) {
duke@1 108 // read from file
duke@1 109 try {
jjg@197 110 InputStream s = docPath.openInputStream();
duke@1 111 documentation = readHTMLDocumentation(s, docPath);
duke@1 112 } catch (IOException exc) {
duke@1 113 documentation = "";
jjg@197 114 env.error(null, "javadoc.File_Read_Error", docPath.getName());
duke@1 115 }
duke@1 116 } else {
duke@1 117 // no doc file to be had
duke@1 118 documentation = "";
duke@1 119 }
duke@1 120 return documentation;
duke@1 121 }
duke@1 122
duke@1 123 /**
duke@1 124 * Cache of all classes contained in this package, including
duke@1 125 * member classes of those classes, and their member classes, etc.
duke@1 126 * Includes only those classes at the specified protection level
duke@1 127 * and weaker.
duke@1 128 */
duke@1 129 private List<ClassDocImpl> allClassesFiltered = null;
duke@1 130
duke@1 131 /**
duke@1 132 * Cache of all classes contained in this package, including
duke@1 133 * member classes of those classes, and their member classes, etc.
duke@1 134 */
duke@1 135 private List<ClassDocImpl> allClasses = null;
duke@1 136
duke@1 137 /**
duke@1 138 * Return a list of all classes contained in this package, including
duke@1 139 * member classes of those classes, and their member classes, etc.
duke@1 140 */
duke@1 141 private List<ClassDocImpl> getClasses(boolean filtered) {
duke@1 142 if (allClasses != null && !filtered) {
duke@1 143 return allClasses;
duke@1 144 }
duke@1 145 if (allClassesFiltered != null && filtered) {
duke@1 146 return allClassesFiltered;
duke@1 147 }
duke@1 148 ListBuffer<ClassDocImpl> classes = new ListBuffer<ClassDocImpl>();
duke@1 149 for (Scope.Entry e = sym.members().elems; e != null; e = e.sibling) {
duke@1 150 if (e.sym != null) {
duke@1 151 ClassSymbol s = (ClassSymbol)e.sym;
duke@1 152 ClassDocImpl c = env.getClassDoc(s);
duke@1 153 if (c != null && !c.isSynthetic())
duke@1 154 c.addAllClasses(classes, filtered);
duke@1 155 }
duke@1 156 }
duke@1 157 if (filtered)
duke@1 158 return allClassesFiltered = classes.toList();
duke@1 159 else
duke@1 160 return allClasses = classes.toList();
duke@1 161 }
duke@1 162
duke@1 163 /**
duke@1 164 * Add all included classes (including Exceptions and Errors)
duke@1 165 * and interfaces.
duke@1 166 */
duke@1 167 public void addAllClassesTo(ListBuffer<ClassDocImpl> list) {
duke@1 168 list.appendList(getClasses(true));
duke@1 169 }
duke@1 170
duke@1 171 /**
duke@1 172 * Get all classes (including Exceptions and Errors)
duke@1 173 * and interfaces.
duke@1 174 * @since J2SE1.4.
duke@1 175 *
duke@1 176 * @return all classes and interfaces in this package, filtered to include
duke@1 177 * only the included classes if filter==true.
duke@1 178 */
duke@1 179 public ClassDoc[] allClasses(boolean filter) {
duke@1 180 List<ClassDocImpl> classes = getClasses(filter);
duke@1 181 return classes.toArray(new ClassDocImpl[classes.length()]);
duke@1 182 }
duke@1 183
duke@1 184 /**
duke@1 185 * Get all included classes (including Exceptions and Errors)
duke@1 186 * and interfaces. Same as allClasses(true).
duke@1 187 *
duke@1 188 * @return all included classes and interfaces in this package.
duke@1 189 */
duke@1 190 public ClassDoc[] allClasses() {
duke@1 191 return allClasses(true);
duke@1 192 }
duke@1 193
duke@1 194 /**
duke@1 195 * Get ordinary classes (that is, exclude exceptions, errors,
duke@1 196 * enums, interfaces, and annotation types) in this package.
duke@1 197 *
duke@1 198 * @return included ordinary classes in this package.
duke@1 199 */
duke@1 200 public ClassDoc[] ordinaryClasses() {
duke@1 201 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 202 for (ClassDocImpl c : getClasses(true)) {
duke@1 203 if (c.isOrdinaryClass()) {
duke@1 204 ret.append(c);
duke@1 205 }
duke@1 206 }
duke@1 207 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 208 }
duke@1 209
duke@1 210 /**
duke@1 211 * Get Exception classes in this package.
duke@1 212 *
duke@1 213 * @return included Exceptions in this package.
duke@1 214 */
duke@1 215 public ClassDoc[] exceptions() {
duke@1 216 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 217 for (ClassDocImpl c : getClasses(true)) {
duke@1 218 if (c.isException()) {
duke@1 219 ret.append(c);
duke@1 220 }
duke@1 221 }
duke@1 222 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 223 }
duke@1 224
duke@1 225 /**
duke@1 226 * Get Error classes in this package.
duke@1 227 *
duke@1 228 * @return included Errors in this package.
duke@1 229 */
duke@1 230 public ClassDoc[] errors() {
duke@1 231 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 232 for (ClassDocImpl c : getClasses(true)) {
duke@1 233 if (c.isError()) {
duke@1 234 ret.append(c);
duke@1 235 }
duke@1 236 }
duke@1 237 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 238 }
duke@1 239
duke@1 240 /**
duke@1 241 * Get included enum types in this package.
duke@1 242 *
duke@1 243 * @return included enum types in this package.
duke@1 244 */
duke@1 245 public ClassDoc[] enums() {
duke@1 246 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 247 for (ClassDocImpl c : getClasses(true)) {
duke@1 248 if (c.isEnum()) {
duke@1 249 ret.append(c);
duke@1 250 }
duke@1 251 }
duke@1 252 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 253 }
duke@1 254
duke@1 255 /**
duke@1 256 * Get included interfaces in this package, omitting annotation types.
duke@1 257 *
duke@1 258 * @return included interfaces in this package.
duke@1 259 */
duke@1 260 public ClassDoc[] interfaces() {
duke@1 261 ListBuffer<ClassDocImpl> ret = new ListBuffer<ClassDocImpl>();
duke@1 262 for (ClassDocImpl c : getClasses(true)) {
duke@1 263 if (c.isInterface()) {
duke@1 264 ret.append(c);
duke@1 265 }
duke@1 266 }
duke@1 267 return ret.toArray(new ClassDocImpl[ret.length()]);
duke@1 268 }
duke@1 269
duke@1 270 /**
duke@1 271 * Get included annotation types in this package.
duke@1 272 *
duke@1 273 * @return included annotation types in this package.
duke@1 274 */
duke@1 275 public AnnotationTypeDoc[] annotationTypes() {
duke@1 276 ListBuffer<AnnotationTypeDocImpl> ret =
duke@1 277 new ListBuffer<AnnotationTypeDocImpl>();
duke@1 278 for (ClassDocImpl c : getClasses(true)) {
duke@1 279 if (c.isAnnotationType()) {
duke@1 280 ret.append((AnnotationTypeDocImpl)c);
duke@1 281 }
duke@1 282 }
duke@1 283 return ret.toArray(new AnnotationTypeDocImpl[ret.length()]);
duke@1 284 }
duke@1 285
duke@1 286 /**
duke@1 287 * Get the annotations of this package.
duke@1 288 * Return an empty array if there are none.
duke@1 289 */
duke@1 290 public AnnotationDesc[] annotations() {
jfranck@1464 291 AnnotationDesc res[] = new AnnotationDesc[sym.getRawAttributes().length()];
duke@1 292 int i = 0;
jfranck@1464 293 for (Attribute.Compound a : sym.getRawAttributes()) {
duke@1 294 res[i++] = new AnnotationDescImpl(env, a);
duke@1 295 }
duke@1 296 return res;
duke@1 297 }
duke@1 298
duke@1 299
duke@1 300 /**
duke@1 301 * Lookup for a class within this package.
duke@1 302 *
duke@1 303 * @return ClassDocImpl of found class, or null if not found.
duke@1 304 */
duke@1 305 public ClassDoc findClass(String className) {
duke@1 306 final boolean filtered = true;
duke@1 307 for (ClassDocImpl c : getClasses(filtered)) {
duke@1 308 if (c.name().equals(className)) {
duke@1 309 return c;
duke@1 310 }
duke@1 311 }
duke@1 312 return null;
duke@1 313 }
duke@1 314
duke@1 315 /**
duke@1 316 * Return true if this package is included in the active set.
duke@1 317 */
duke@1 318 public boolean isIncluded() {
duke@1 319 return isIncluded;
duke@1 320 }
duke@1 321
duke@1 322 /**
duke@1 323 * Get package name.
duke@1 324 *
duke@1 325 * Note that we do not provide a means of obtaining the simple
duke@1 326 * name of a package -- package names are always returned in their
duke@1 327 * uniquely qualified form.
duke@1 328 */
duke@1 329 public String name() {
duke@1 330 return qualifiedName();
duke@1 331 }
duke@1 332
duke@1 333 /**
duke@1 334 * Get package name.
duke@1 335 */
duke@1 336 public String qualifiedName() {
duke@1 337 Name fullname = sym.getQualifiedName();
duke@1 338 // Some bogus tests depend on the interned "" being returned.
duke@1 339 // See 6457276.
duke@1 340 return fullname.isEmpty() ? "" : fullname.toString();
duke@1 341 }
duke@1 342
duke@1 343 /**
duke@1 344 * set doc path for an unzipped directory
duke@1 345 */
jjg@197 346 public void setDocPath(FileObject path) {
duke@1 347 setDocPath = true;
duke@1 348 if (path == null)
duke@1 349 return;
jjg@197 350 if (!path.equals(docPath)) {
jjg@197 351 docPath = path;
duke@1 352 checkDoc();
duke@1 353 }
duke@1 354 }
duke@1 355
duke@1 356 // Has checkDoc() sounded off yet?
duke@1 357 private boolean checkDocWarningEmitted = false;
duke@1 358
duke@1 359 /**
duke@1 360 * Invoked when a source of package doc comments is located.
duke@1 361 * Emits a diagnostic if this is the second one.
duke@1 362 */
duke@1 363 private void checkDoc() {
duke@1 364 if (foundDoc) {
duke@1 365 if (!checkDocWarningEmitted) {
duke@1 366 env.warning(null, "javadoc.Multiple_package_comments", name());
duke@1 367 checkDocWarningEmitted = true;
duke@1 368 }
duke@1 369 } else {
duke@1 370 foundDoc = true;
duke@1 371 }
duke@1 372 }
duke@1 373
duke@1 374 /**
duke@1 375 * Return the source position of the entity, or null if
duke@1 376 * no position is available.
duke@1 377 */
duke@1 378 public SourcePosition position() {
duke@1 379 return (tree != null)
jjg@197 380 ? SourcePositionImpl.make(tree.sourcefile, tree.pos, tree.lineMap)
duke@1 381 : SourcePositionImpl.make(docPath, Position.NOPOS, null);
duke@1 382 }
duke@1 383 }

mercurial