6909470: langtools stub generator should prune unnecessary imports

Mon, 11 Jan 2010 16:18:05 -0800

author
jjg
date
Mon, 11 Jan 2010 16:18:05 -0800
changeset 468
51011e02c02f
parent 467
14a4c45ef734
child 469
ccd51af119b4

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 {

mercurial