Mon, 11 Jan 2010 16:18:05 -0800
6909470: langtools stub generator should prune unnecessary imports
Reviewed-by: darcy
make/tools/GenStubs/GenStubs.java | file | annotate | diff | comparison | revisions |
1.1 --- a/make/tools/GenStubs/GenStubs.java Mon Jan 11 14:17:01 2010 -0800 1.2 +++ b/make/tools/GenStubs/GenStubs.java Mon Jan 11 16:18:05 2010 -0800 1.3 @@ -22,6 +22,7 @@ 1.4 * CA 95054 USA or visit www.sun.com if you need additional information or 1.5 * have any questions. 1.6 */ 1.7 + 1.8 import java.io.*; 1.9 import java.util.*; 1.10 import javax.tools.JavaFileObject; 1.11 @@ -41,15 +42,22 @@ 1.12 import com.sun.tools.javac.code.Flags; 1.13 import com.sun.tools.javac.code.TypeTags; 1.14 import com.sun.tools.javac.tree.JCTree; 1.15 -import com.sun.tools.javac.tree.JCTree.JCBlock; 1.16 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; 1.17 +import com.sun.tools.javac.tree.JCTree.JCFieldAccess; 1.18 +import com.sun.tools.javac.tree.JCTree.JCIdent; 1.19 +import com.sun.tools.javac.tree.JCTree.JCImport; 1.20 import com.sun.tools.javac.tree.JCTree.JCLiteral; 1.21 import com.sun.tools.javac.tree.JCTree.JCMethodDecl; 1.22 import com.sun.tools.javac.tree.JCTree.JCModifiers; 1.23 -import com.sun.tools.javac.tree.JCTree.JCStatement; 1.24 import com.sun.tools.javac.tree.JCTree.JCVariableDecl; 1.25 import com.sun.tools.javac.tree.Pretty; 1.26 +import com.sun.tools.javac.tree.TreeMaker; 1.27 +import com.sun.tools.javac.tree.TreeScanner; 1.28 import com.sun.tools.javac.tree.TreeTranslator; 1.29 +import com.sun.tools.javac.util.Context; 1.30 +import com.sun.tools.javac.util.ListBuffer; 1.31 +import com.sun.tools.javac.util.Name; 1.32 +import javax.tools.JavaFileManager; 1.33 1.34 /** 1.35 * Generate stub source files by removing implementation details from input files. 1.36 @@ -161,6 +169,7 @@ 1.37 1.38 void makeStub(StandardJavaFileManager fm, CompilationUnitTree tree) throws IOException { 1.39 CompilationUnitTree tree2 = new StubMaker().translate(tree); 1.40 + CompilationUnitTree tree3 = new ImportCleaner(fm).removeRedundantImports(tree2); 1.41 1.42 String className = fm.inferBinaryName(StandardLocation.SOURCE_PATH, tree.getSourceFile()); 1.43 JavaFileObject fo = fm.getJavaFileForOutput(StandardLocation.SOURCE_OUTPUT, 1.44 @@ -168,7 +177,7 @@ 1.45 // System.err.println("Writing " + className + " to " + fo.getName()); 1.46 Writer out = fo.openWriter(); 1.47 try { 1.48 - new Pretty(out, true).printExpr((JCTree) tree2); 1.49 + new Pretty(out, true).printExpr((JCTree) tree3); 1.50 } finally { 1.51 out.close(); 1.52 } 1.53 @@ -272,6 +281,53 @@ 1.54 } 1.55 } 1.56 1.57 + class ImportCleaner extends TreeScanner { 1.58 + private Set<Name> names = new HashSet<Name>(); 1.59 + private TreeMaker m; 1.60 + 1.61 + ImportCleaner(JavaFileManager fm) { 1.62 + // ImportCleaner itself doesn't require a filemanager, but instantiating 1.63 + // a TreeMaker does, indirectly (via ClassReader, sigh) 1.64 + Context c = new Context(); 1.65 + c.put(JavaFileManager.class, fm); 1.66 + m = TreeMaker.instance(c); 1.67 + } 1.68 + 1.69 + CompilationUnitTree removeRedundantImports(CompilationUnitTree t) { 1.70 + JCCompilationUnit tree = (JCCompilationUnit) t; 1.71 + tree.accept(this); 1.72 + ListBuffer<JCTree> defs = new ListBuffer<JCTree>(); 1.73 + for (JCTree def: tree.defs) { 1.74 + if (def.getTag() == JCTree.IMPORT) { 1.75 + JCImport imp = (JCImport) def; 1.76 + if (imp.qualid.getTag() == JCTree.SELECT) { 1.77 + JCFieldAccess qualid = (JCFieldAccess) imp.qualid; 1.78 + if (!qualid.name.toString().equals("*") 1.79 + && !names.contains(qualid.name)) { 1.80 + continue; 1.81 + } 1.82 + } 1.83 + } 1.84 + defs.add(def); 1.85 + } 1.86 + return m.TopLevel(tree.packageAnnotations, tree.pid, defs.toList()); 1.87 + } 1.88 + 1.89 + @Override 1.90 + public void visitImport(JCImport tree) { } // ignore names found in imports 1.91 + 1.92 + @Override 1.93 + public void visitIdent(JCIdent tree) { 1.94 + names.add(tree.name); 1.95 + } 1.96 + 1.97 + @Override 1.98 + public void visitSelect(JCFieldAccess tree) { 1.99 + super.visitSelect(tree); 1.100 + names.add(tree.name); 1.101 + } 1.102 + } 1.103 + 1.104 //---------- Ant Invocation ------------------------------------------------ 1.105 1.106 public static class Ant extends MatchingTask {