diff -r dc2b3ff15f13 -r 374342e56a56 langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/RootDocImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.javadoc/share/classes/jdk/javadoc/internal/tool/RootDocImpl.java Sat Nov 28 18:52:17 2015 -0800 @@ -0,0 +1,304 @@ +/* + * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.javadoc.internal.tool; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.lang.model.SourceVersion; +import javax.lang.model.element.Element; +import javax.lang.model.element.PackageElement; +import javax.lang.model.element.TypeElement; +import javax.lang.model.util.Elements; +import javax.lang.model.util.Types; +import javax.tools.JavaFileManager; + +import com.sun.source.util.DocTrees; +import com.sun.tools.javac.code.Source; +import com.sun.tools.javac.tree.JCTree.JCClassDecl; +import jdk.javadoc.doclet.DocletEnvironment; + +/** + * This class holds the information from one run of javadoc. + * Particularly the packages, classes and options specified + * by the user. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @author Robert Field + * @author Atul M Dambalkar + * @author Neal Gafter (rewrite) + */ +public class RootDocImpl implements DocletEnvironment { + + /** + * list of classes specified on the command line. + */ + private Set cmdLineClasses; + + /** + * list of packages specified on the command line. + */ + private Set cmdLinePackages; + + public final DocEnv env; + + /** + * Constructor used when reading source files. + * + * @param env the documentation environment, state for this javadoc run + * @param classes list of classes specified on the commandline + * @param packages list of package names specified on the commandline + */ + public RootDocImpl(DocEnv env, List classes, List packages) { + this.env = env; + setPackages(env, packages); + setClasses(env, classes); + } + + /** + * Constructor used when reading class files. + * + * @param env the documentation environment, state for this javadoc run + * @param classes list of class names specified on the commandline + */ + public RootDocImpl(DocEnv env, List classes) { + //super(env, null); + this.env = env; + + Set classList = new LinkedHashSet<>(); + for (String className : classes) { + TypeElement c = env.loadClass(className); + if (c == null) + env.error(null, "javadoc.class_not_found", className); + else + classList.add(c); + } + cmdLineClasses = classList; + } + + /** + * Initialize classes information. Those classes are input from + * command line. + * + * @param env the compilation environment + * @param classes a list of ClassDeclaration + */ + private void setClasses(DocEnv env, List classes) { + Set result = new LinkedHashSet<>(); + classes.stream().filter((def) -> (env.shouldDocument(def.sym))).forEach((def) -> { + TypeElement te = (TypeElement)def.sym; + if (te != null) { + env.setIncluded((Element)def.sym); + result.add(te); + } + }); + cmdLineClasses = Collections.unmodifiableSet(result); + } + + /** + * Initialize packages information. + * + * @param env the compilation environment + * @param packages a list of package names (String) + */ + private void setPackages(DocEnv env, List packages) { + Set packlist = new LinkedHashSet<>(); + packages.stream().forEach((name) -> { + PackageElement pkg = getElementUtils().getPackageElement(name); + if (pkg != null) { + env.setIncluded(pkg); + packlist.add(pkg); + } else { + env.warning("main.no_source_files_for_package", name); + } + }); + cmdLinePackages = Collections.unmodifiableSet(packlist); + } + + /** + * Packages specified on the command line. + */ + public Set specifiedPackages() { + return cmdLinePackages; + } + + /** + * Classes and interfaces specified on the command line, + * including their inner classes + */ + public Set specifiedClasses() { + Set out = new LinkedHashSet<>(); + cmdLineClasses.stream().forEach((te) -> { + env.addAllClasses(out, te, true); + }); + return out; + } + + private Set classesToDocument = null; + /** + * Return all classes and interfaces (including those inside + * packages) to be documented. + */ + public Set getIncludedClasses() { + if (classesToDocument == null) { + Set classes = new LinkedHashSet<>(); + + cmdLineClasses.stream().forEach((te) -> { + env.addAllClasses(classes, te, true); + }); + cmdLinePackages.stream().forEach((pkg) -> { + env.addAllClasses(classes, pkg); + }); + classesToDocument = Collections.unmodifiableSet(classes); + } + return classesToDocument; + } + + /** + * Return the name of this item. + * + * @return the string "*RootDocImpl*". + */ + public String name() { + return "*RootDocImpl*"; + } + + /** + * Return the name of this Doc item. + * + * @return the string "*RootDocImpl*". + */ + public String qualifiedName() { + return "*RootDocImpl*"; + } + + /** + * Return true if this Element is included in the active set. + * RootDocImpl isn't even a program entity so it is always false. + */ + @Override + public boolean isIncluded(Element e) { + return env.isIncluded(e); + } + +// Note: these reporting methods are no longer used. +// /** +// * Print error message, increment error count. +// * +// * @param msg message to print +// */ +// public void printError(String msg) { +// env.printError(msg); +// } +// +// /** +// * Print error message, increment error count. +// * +// * @param msg message to print +// */ +// public void printError(DocTreePath path, String msg) { +// env.printError(path, msg); +// } +// +// public void printError(Element e, String msg) { +// env.printError(e, msg); +// } +// +// public void printWarning(Element e, String msg) { +// env.printWarning(e, msg); +// } +// +// public void printNotice(Element e, String msg) { +// env.printNotice(e, msg); +// } +// +// /** +// * Print warning message, increment warning count. +// * +// * @param msg message to print +// */ +// public void printWarning(String msg) { +// env.printWarning(msg); +// } + + /** + * Return the current file manager. + */ + public JavaFileManager getFileManager() { + return env.fileManager; + } + + @Override + public DocTrees getDocTrees() { + return env.docTrees; + } + + @Override + public Elements getElementUtils() { + return env.elements; + } + + @Override + public List getSelectedElements(List elements) { + return elements.stream() + .filter(e -> isIncluded(e)) + .collect(Collectors.toList()); + } + + @Override + public Set getSpecifiedElements() { + Set out = new LinkedHashSet<>(); + specifiedPackages().stream().forEach((pe) -> { + out.add(pe); + }); + specifiedClasses().stream().forEach((e) -> { + out.add(e); + }); + return out; + } + + @Override + public Types getTypeUtils() { + return env.typeutils; + } + + @Override + public JavaFileManager getJavaFileManager() { + return env.fileManager; + } + + @Override + public SourceVersion getSourceVersion() { + return Source.toSourceVersion(env.source); + } +}