Mon, 27 Sep 2010 17:28:49 -0700
6986246: Trees object is round-specific
Reviewed-by: darcy
1.1 --- a/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Mon Sep 27 14:20:39 2010 -0700 1.2 +++ b/src/share/classes/com/sun/tools/javac/api/JavacTrees.java Mon Sep 27 17:28:49 2010 -0700 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 1.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.8 * 1.9 * This code is free software; you can redistribute it and/or modify it 1.10 @@ -56,7 +56,6 @@ 1.11 import com.sun.tools.javac.comp.MemberEnter; 1.12 import com.sun.tools.javac.comp.Resolve; 1.13 import com.sun.tools.javac.model.JavacElements; 1.14 -import com.sun.tools.javac.processing.JavacMessager; 1.15 import com.sun.tools.javac.processing.JavacProcessingEnvironment; 1.16 import com.sun.tools.javac.tree.JCTree.*; 1.17 import com.sun.tools.javac.tree.JCTree; 1.18 @@ -81,14 +80,15 @@ 1.19 */ 1.20 public class JavacTrees extends Trees { 1.21 1.22 - private final Resolve resolve; 1.23 - private final Enter enter; 1.24 - private final Log log; 1.25 - private final MemberEnter memberEnter; 1.26 - private final Attr attr; 1.27 - private final TreeMaker treeMaker; 1.28 - private final JavacElements elements; 1.29 - private final JavacTaskImpl javacTaskImpl; 1.30 + // in a world of a single context per compilation, these would all be final 1.31 + private Resolve resolve; 1.32 + private Enter enter; 1.33 + private Log log; 1.34 + private MemberEnter memberEnter; 1.35 + private Attr attr; 1.36 + private TreeMaker treeMaker; 1.37 + private JavacElements elements; 1.38 + private JavacTaskImpl javacTaskImpl; 1.39 1.40 public static JavacTrees instance(JavaCompiler.CompilationTask task) { 1.41 if (!(task instanceof JavacTaskImpl)) 1.42 @@ -111,6 +111,14 @@ 1.43 1.44 private JavacTrees(Context context) { 1.45 context.put(JavacTrees.class, this); 1.46 + init(context); 1.47 + } 1.48 + 1.49 + public void updateContext(Context context) { 1.50 + init(context); 1.51 + } 1.52 + 1.53 + private void init(Context context) { 1.54 attr = Attr.instance(context); 1.55 enter = Enter.instance(context); 1.56 elements = JavacElements.instance(context); 1.57 @@ -337,6 +345,7 @@ 1.58 super(M); 1.59 } 1.60 1.61 + @Override 1.62 public <T extends JCTree> T copy(T t, JCTree leaf) { 1.63 T t2 = super.copy(t, leaf); 1.64 if (t == leaf)
2.1 --- a/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Mon Sep 27 14:20:39 2010 -0700 2.2 +++ b/src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java Mon Sep 27 17:28:49 2010 -0700 2.3 @@ -1,5 +1,5 @@ 2.4 /* 2.5 - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. 2.6 + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 2.7 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 2.8 * 2.9 * This code is free software; you can redistribute it and/or modify it 2.10 @@ -49,6 +49,7 @@ 2.11 import javax.tools.JavaFileObject; 2.12 import javax.tools.DiagnosticListener; 2.13 2.14 +import com.sun.tools.javac.api.JavacTrees; 2.15 import com.sun.source.util.AbstractTypeProcessor; 2.16 import com.sun.source.util.TaskEvent; 2.17 import com.sun.source.util.TaskListener; 2.18 @@ -1104,6 +1105,12 @@ 2.19 task.updateContext(next); 2.20 } 2.21 2.22 + JavacTrees trees = context.get(JavacTrees.class); 2.23 + if (trees != null) { 2.24 + next.put(JavacTrees.class, trees); 2.25 + trees.updateContext(next); 2.26 + } 2.27 + 2.28 context.clear(); 2.29 return next; 2.30 }
3.1 --- a/test/tools/javac/processing/model/util/elements/doccomments/TestDocComments.java Mon Sep 27 14:20:39 2010 -0700 3.2 +++ b/test/tools/javac/processing/model/util/elements/doccomments/TestDocComments.java Mon Sep 27 17:28:49 2010 -0700 3.3 @@ -23,7 +23,7 @@ 3.4 3.5 /* 3.6 * @test 3.7 - * @bug 6877202 3.8 + * @bug 6877202 6986246 3.9 * @summary Elements.getDocComment() is not getting JavaDocComments 3.10 */ 3.11 3.12 @@ -139,6 +139,7 @@ 3.13 Filer filer; 3.14 Messager messager; 3.15 Elements elements; 3.16 + Trees trees; 3.17 ScanKind skind; 3.18 3.19 int round = 0; 3.20 @@ -155,6 +156,7 @@ 3.21 filer = pEnv.getFiler(); 3.22 messager = pEnv.getMessager(); 3.23 elements = pEnv.getElementUtils(); 3.24 + trees = Trees.instance(processingEnv); 3.25 skind = ScanKind.valueOf(options.get("scan")); 3.26 } 3.27 3.28 @@ -167,7 +169,6 @@ 3.29 for (Element e: roundEnv.getRootElements()) { 3.30 System.err.println("scan " + skind + " " + e.getKind() + " " + e.getSimpleName()); 3.31 if (skind == ScanKind.TREE) { 3.32 - Trees trees = Trees.instance(processingEnv); // cannot cache this across rounds 3.33 new TestTreeScanner().scan(trees.getPath(e), trees); 3.34 } else 3.35 new TestElementScanner().scan(e);
4.1 --- a/test/tools/javac/tree/TreePosRoundsTest.java Mon Sep 27 14:20:39 2010 -0700 4.2 +++ b/test/tools/javac/tree/TreePosRoundsTest.java Mon Sep 27 17:28:49 2010 -0700 4.3 @@ -23,7 +23,7 @@ 4.4 4.5 /* 4.6 * @test 4.7 - * @bug 6985205 4.8 + * @bug 6985205 6986246 4.9 * @summary access to tree positions and doc comments may be lost across annotation processing rounds 4.10 * @build TreePosRoundsTest 4.11 * @compile -proc:only -processor TreePosRoundsTest TreePosRoundsTest.java 4.12 @@ -70,6 +70,7 @@ 4.13 4.14 Filer filer; 4.15 Messager messager; 4.16 + Trees trees; 4.17 4.18 @Override 4.19 public SourceVersion getSupportedSourceVersion() { 4.20 @@ -81,6 +82,7 @@ 4.21 super.init(pEnv); 4.22 filer = pEnv.getFiler(); 4.23 messager = pEnv.getMessager(); 4.24 + trees = Trees.instance(pEnv); 4.25 } 4.26 4.27 int round = 0; 4.28 @@ -92,7 +94,6 @@ 4.29 // Scan trees for elements, verifying source tree positions 4.30 for (Element e: roundEnv.getRootElements()) { 4.31 try { 4.32 - Trees trees = Trees.instance(processingEnv); // cannot cache this across rounds 4.33 TreePath p = trees.getPath(e); 4.34 new TestTreeScanner(p.getCompilationUnit(), trees).scan(trees.getPath(e), null); 4.35 } catch (IOException ex) {