diff -r 8d48ff7e2cf2 -r 9643bffe2105 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java Thu Feb 18 13:42:59 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/api/JavacTrees.java Thu Feb 18 12:48:11 2016 -0800 @@ -28,7 +28,9 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.text.BreakIterator; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -68,12 +70,16 @@ import com.sun.source.util.JavacTask; import com.sun.source.util.TreePath; import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Scope.NamedImportScope; +import com.sun.tools.javac.code.Scope.StarImportScope; +import com.sun.tools.javac.code.Scope.WriteableScope; import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; import com.sun.tools.javac.code.Symbol.PackageSymbol; import com.sun.tools.javac.code.Symbol.TypeSymbol; import com.sun.tools.javac.code.Symbol.VarSymbol; +import com.sun.tools.javac.code.Symtab; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.ClassType; @@ -103,6 +109,7 @@ import com.sun.tools.javac.tree.DCTree.DCParam; import com.sun.tools.javac.tree.DCTree.DCReference; import com.sun.tools.javac.tree.DCTree.DCText; +import com.sun.tools.javac.tree.DocCommentTable; import com.sun.tools.javac.tree.DocTreeMaker; import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.tree.JCTree; @@ -163,6 +170,8 @@ private BreakIterator breakIterator; private JavaFileManager fileManager; private ParserFactory parser; + private Symtab syms; + private Map javaFileObjectToPackageMap; // called reflectively from Trees.instance(CompilationTask task) public static JavacTrees instance(JavaCompiler.CompilationTask task) { @@ -186,6 +195,7 @@ } protected JavacTrees(Context context) { + javaFileObjectToPackageMap = new HashMap<>(); this.breakIterator = null; context.put(JavacTrees.class, this); init(context); @@ -207,6 +217,7 @@ types = Types.instance(context); docTreeMaker = DocTreeMaker.instance(context); parser = ParserFactory.instance(context); + syms = Symtab.instance(context); fileManager = context.get(JavaFileManager.class); JavacTask t = context.get(JavacTask.class); if (t instanceof JavacTaskImpl) @@ -1018,7 +1029,8 @@ @Override @DefinedBy(Api.COMPILER_TREE) public DocTreePath getDocTreePath(FileObject fileObject) { JavaFileObject jfo = asJavaFileObject(fileObject); - return new DocTreePath(makeTreePath(jfo), getDocCommentTree(jfo)); + DocCommentTree docCommentTree = getDocCommentTree(jfo); + return new DocTreePath(makeTreePath(jfo, docCommentTree), docCommentTree); } @Override @DefinedBy(Api.COMPILER_TREE) @@ -1136,7 +1148,17 @@ } } - private TreePath makeTreePath(final JavaFileObject jfo) { + /** + * Register a file object, such as for a package.html, that provides + * doc comments for a package. + * @param psym the PackageSymbol representing the package. + * @param jfo the JavaFileObject for the given package. + */ + public void putJavaFileObject(PackageSymbol psym, JavaFileObject jfo) { + javaFileObjectToPackageMap.putIfAbsent(jfo, psym); + } + + private TreePath makeTreePath(final JavaFileObject jfo, DocCommentTree dcTree) { JCCompilationUnit jcCompilationUnit = new JCCompilationUnit(List.nil()) { public int getPos() { return Position.FIRSTPOS; @@ -1156,8 +1178,44 @@ return null; } }; + + PackageSymbol psym = javaFileObjectToPackageMap.getOrDefault(jfo, syms.unnamedPackage); + + jcCompilationUnit.docComments = new DocCommentTable() { + @Override + public boolean hasComment(JCTree tree) { + return false; + } + + @Override + public Comment getComment(JCTree tree) { + throw new UnsupportedOperationException(); + } + + @Override + public String getCommentText(JCTree tree) { + throw new UnsupportedOperationException(); + } + + @Override + public DCDocComment getCommentTree(JCTree tree) { + return (DCDocComment)dcTree; + } + + @Override + public void putComment(JCTree tree, Comment c) { + throw new UnsupportedOperationException(); + } + + }; + jcCompilationUnit.lineMap = jcCompilationUnit.getLineMap(); + jcCompilationUnit.namedImportScope = new NamedImportScope(psym, jcCompilationUnit.toplevelScope); + jcCompilationUnit.packge = psym; + jcCompilationUnit.starImportScope = null; jcCompilationUnit.sourcefile = jfo; - enter.main(List.of(jcCompilationUnit)); + jcCompilationUnit.starImportScope = new StarImportScope(psym); + jcCompilationUnit.toplevelScope = WriteableScope.create(psym); + return new TreePath(jcCompilationUnit); } }