diff -r b1f8e0d263cc java.source/apichanges.xml --- a/java.source/apichanges.xml Mon Apr 02 11:33:38 2012 +0200 +++ b/java.source/apichanges.xml Mon Apr 02 15:00:52 2012 +0200 @@ -108,6 +108,20 @@ + + + Added WorkingCopy.resolveRewriteTarget. + + + + + + Added a methodresolveRewriteTarget to class WorkingCopy, + that returns the tree into which the given tree has been rewritten. + + + + Added GeneratorUtilities.appendToAnnotationValue. diff -r b1f8e0d263cc java.source/nbproject/project.properties --- a/java.source/nbproject/project.properties Mon Apr 02 11:33:38 2012 +0200 +++ b/java.source/nbproject/project.properties Mon Apr 02 15:00:52 2012 +0200 @@ -46,7 +46,7 @@ javadoc.title=Java Source javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml -spec.version.base=0.100.0 +spec.version.base=0.101.0 test.qa-functional.cp.extra=${refactoring.java.dir}/modules/ext/javac-api-nb-7.0-b07.jar test.unit.run.cp.extra=${o.n.core.dir}/core/core.jar:\ ${o.n.core.dir}/lib/boot.jar:\ diff -r b1f8e0d263cc java.source/src/org/netbeans/api/java/source/WorkingCopy.java --- a/java.source/src/org/netbeans/api/java/source/WorkingCopy.java Mon Apr 02 11:33:38 2012 +0200 +++ b/java.source/src/org/netbeans/api/java/source/WorkingCopy.java Mon Apr 02 15:00:52 2012 +0200 @@ -295,6 +295,33 @@ public synchronized void tag(@NonNull Tree t, @NonNull Object tag) { tree2Tag.put(t, tag); } + + /**Returns the tree into which the given tree was rewritten using the + * {@link #rewrite(com.sun.source.tree.Tree, com.sun.source.tree.Tree) } method, + * transitively. + * Will return the input tree if the input tree was never passed as the first + * parameter of the {@link #rewrite(com.sun.source.tree.Tree, com.sun.source.tree.Tree) } + * method. + * + *

Note that the returned tree will be exactly equivalent to a tree passed as + * the second parameter to {@link #rewrite(com.sun.source.tree.Tree, com.sun.source.tree.Tree) }. + * No attribution or other information will be added (or removed) to (or from) the tree. + * + * @param in the tree to inspect + * @return tree into which the given tree was rewritten using the + * {@link #rewrite(com.sun.source.tree.Tree, com.sun.source.tree.Tree) } method, + * transitively + * @since 0.101 + */ + public synchronized @NonNull Tree resolveRewriteTarget(@NonNull Tree in) { + Map localChanges = new IdentityHashMap(changes); + + while (localChanges.containsKey(in)) { + in = localChanges.remove(in); + } + + return in; + } // Package private methods ------------------------------------------------- diff -r b1f8e0d263cc java.source/test/unit/src/org/netbeans/api/java/source/WorkingCopyTest.java --- a/java.source/test/unit/src/org/netbeans/api/java/source/WorkingCopyTest.java Mon Apr 02 11:33:38 2012 +0200 +++ b/java.source/test/unit/src/org/netbeans/api/java/source/WorkingCopyTest.java Mon Apr 02 15:00:52 2012 +0200 @@ -116,4 +116,44 @@ } }, true); } + + public void testResolveRewriteTarget() throws Exception { + File f = new File(getWorkDir(), "TestClass.java"); + String code = "package foo;" + + "public class TestClass{" + + " public void foo() {" + + " }" + + "}"; + + TestUtilities.copyStringToFile(f, code); + FileObject fo = FileUtil.toFileObject(f); + JavaSource javaSource = JavaSource.forFileObject(fo); + javaSource.runModificationTask(new Task() { + + public void run(WorkingCopy copy) throws Exception { + copy.toPhase(Phase.RESOLVED); + + TreeMaker maker = copy.getTreeMaker(); + ClassTree classTree = (ClassTree)copy.getCompilationUnit().getTypeDecls().get(0); + TypeElement serializableElement = copy.getElements().getTypeElement("java.io.Serializable"); + ExpressionTree serializableTree = maker.QualIdent(serializableElement); + ClassTree newClassTree = maker.addClassImplementsClause(classTree, serializableTree); + + copy.rewrite(classTree, newClassTree); + + assertSame(newClassTree, copy.resolveRewriteTarget(classTree)); + + ClassTree finalClassTree = maker.removeClassImplementsClause(newClassTree, 0); + + copy.rewrite(newClassTree, finalClassTree); + + assertSame(finalClassTree, copy.resolveRewriteTarget(classTree)); + + // remove the following to make the test pass + copy.toPhase(Phase.RESOLVED); + } + }).commit(); + + assertEquals(code, fo.asText()); + } }