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 |