langtools/make/tools/GenStubs/GenStubs.java
changeset 4703 800e1750ff18
parent 4415 7d4f73717fba
child 5520 86e4b9a9da40
equal deleted inserted replaced
4702:bb3925c7b58a 4703:800e1750ff18
    20  *
    20  *
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    21  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
    22  * CA 95054 USA or visit www.sun.com if you need additional information or
    23  * have any questions.
    23  * have any questions.
    24  */
    24  */
       
    25 
    25 import java.io.*;
    26 import java.io.*;
    26 import java.util.*;
    27 import java.util.*;
    27 import javax.tools.JavaFileObject;
    28 import javax.tools.JavaFileObject;
    28 import javax.tools.StandardJavaFileManager;
    29 import javax.tools.StandardJavaFileManager;
    29 import javax.tools.StandardLocation;
    30 import javax.tools.StandardLocation;
    39 import com.sun.source.util.JavacTask;
    40 import com.sun.source.util.JavacTask;
    40 import com.sun.tools.javac.api.JavacTool;
    41 import com.sun.tools.javac.api.JavacTool;
    41 import com.sun.tools.javac.code.Flags;
    42 import com.sun.tools.javac.code.Flags;
    42 import com.sun.tools.javac.code.TypeTags;
    43 import com.sun.tools.javac.code.TypeTags;
    43 import com.sun.tools.javac.tree.JCTree;
    44 import com.sun.tools.javac.tree.JCTree;
    44 import com.sun.tools.javac.tree.JCTree.JCBlock;
       
    45 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
    45 import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
       
    46 import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
       
    47 import com.sun.tools.javac.tree.JCTree.JCIdent;
       
    48 import com.sun.tools.javac.tree.JCTree.JCImport;
    46 import com.sun.tools.javac.tree.JCTree.JCLiteral;
    49 import com.sun.tools.javac.tree.JCTree.JCLiteral;
    47 import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
    50 import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
    48 import com.sun.tools.javac.tree.JCTree.JCModifiers;
    51 import com.sun.tools.javac.tree.JCTree.JCModifiers;
    49 import com.sun.tools.javac.tree.JCTree.JCStatement;
       
    50 import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
    52 import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
    51 import com.sun.tools.javac.tree.Pretty;
    53 import com.sun.tools.javac.tree.Pretty;
       
    54 import com.sun.tools.javac.tree.TreeMaker;
       
    55 import com.sun.tools.javac.tree.TreeScanner;
    52 import com.sun.tools.javac.tree.TreeTranslator;
    56 import com.sun.tools.javac.tree.TreeTranslator;
       
    57 import com.sun.tools.javac.util.Context;
       
    58 import com.sun.tools.javac.util.ListBuffer;
       
    59 import com.sun.tools.javac.util.Name;
       
    60 import javax.tools.JavaFileManager;
    53 
    61 
    54 /**
    62 /**
    55  * Generate stub source files by removing implementation details from input files.
    63  * Generate stub source files by removing implementation details from input files.
    56  *
    64  *
    57  * This is a special purpose stub generator, specific to the needs of generating
    65  * This is a special purpose stub generator, specific to the needs of generating
   159         return (errors == 0);
   167         return (errors == 0);
   160     }
   168     }
   161 
   169 
   162     void makeStub(StandardJavaFileManager fm, CompilationUnitTree tree) throws IOException {
   170     void makeStub(StandardJavaFileManager fm, CompilationUnitTree tree) throws IOException {
   163         CompilationUnitTree tree2 = new StubMaker().translate(tree);
   171         CompilationUnitTree tree2 = new StubMaker().translate(tree);
       
   172         CompilationUnitTree tree3 = new ImportCleaner(fm).removeRedundantImports(tree2);
   164 
   173 
   165         String className = fm.inferBinaryName(StandardLocation.SOURCE_PATH, tree.getSourceFile());
   174         String className = fm.inferBinaryName(StandardLocation.SOURCE_PATH, tree.getSourceFile());
   166         JavaFileObject fo = fm.getJavaFileForOutput(StandardLocation.SOURCE_OUTPUT,
   175         JavaFileObject fo = fm.getJavaFileForOutput(StandardLocation.SOURCE_OUTPUT,
   167                 className, JavaFileObject.Kind.SOURCE, null);
   176                 className, JavaFileObject.Kind.SOURCE, null);
   168         // System.err.println("Writing " + className + " to " + fo.getName());
   177         // System.err.println("Writing " + className + " to " + fo.getName());
   169         Writer out = fo.openWriter();
   178         Writer out = fo.openWriter();
   170         try {
   179         try {
   171             new Pretty(out, true).printExpr((JCTree) tree2);
   180             new Pretty(out, true).printExpr((JCTree) tree3);
   172         } finally {
   181         } finally {
   173             out.close();
   182             out.close();
   174         }
   183         }
   175     }
   184     }
   176 
   185 
   267                     else
   276                     else
   268                         tree.init = new JCLiteral(TypeTags.BOT, null) { };
   277                         tree.init = new JCLiteral(TypeTags.BOT, null) { };
   269                 }
   278                 }
   270             }
   279             }
   271             result = tree;
   280             result = tree;
       
   281         }
       
   282     }
       
   283 
       
   284     class ImportCleaner extends TreeScanner {
       
   285         private Set<Name> names = new HashSet<Name>();
       
   286         private TreeMaker m;
       
   287 
       
   288         ImportCleaner(JavaFileManager fm) {
       
   289             // ImportCleaner itself doesn't require a filemanager, but instantiating
       
   290             // a TreeMaker does, indirectly (via ClassReader, sigh)
       
   291             Context c = new Context();
       
   292             c.put(JavaFileManager.class, fm);
       
   293             m = TreeMaker.instance(c);
       
   294         }
       
   295 
       
   296         CompilationUnitTree removeRedundantImports(CompilationUnitTree t) {
       
   297             JCCompilationUnit tree = (JCCompilationUnit) t;
       
   298             tree.accept(this);
       
   299             ListBuffer<JCTree> defs = new ListBuffer<JCTree>();
       
   300             for (JCTree def: tree.defs) {
       
   301                 if (def.getTag() == JCTree.IMPORT) {
       
   302                     JCImport imp = (JCImport) def;
       
   303                     if (imp.qualid.getTag() == JCTree.SELECT) {
       
   304                         JCFieldAccess qualid = (JCFieldAccess) imp.qualid;
       
   305                         if (!qualid.name.toString().equals("*")
       
   306                                 && !names.contains(qualid.name)) {
       
   307                             continue;
       
   308                         }
       
   309                     }
       
   310                 }
       
   311                 defs.add(def);
       
   312             }
       
   313             return m.TopLevel(tree.packageAnnotations, tree.pid, defs.toList());
       
   314         }
       
   315 
       
   316         @Override
       
   317         public void visitImport(JCImport tree) { } // ignore names found in imports
       
   318 
       
   319         @Override
       
   320         public void visitIdent(JCIdent tree) {
       
   321             names.add(tree.name);
       
   322         }
       
   323 
       
   324         @Override
       
   325         public void visitSelect(JCFieldAccess tree) {
       
   326             super.visitSelect(tree);
       
   327             names.add(tree.name);
   272         }
   328         }
   273     }
   329     }
   274 
   330 
   275     //---------- Ant Invocation ------------------------------------------------
   331     //---------- Ant Invocation ------------------------------------------------
   276 
   332