javafoovars.js revision 1426:751ada854e5a
1#// Usage: jjs javafoovars.js -- <directory> 2 3/* 4 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * - Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * - Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * - Neither the name of Oracle nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 22 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34// This example demonstrates Java subclassing by Java.extend 35// and javac Compiler and Tree API. This example counts number 36// of variables called "foo" in the given java source files! 37if (arguments.length == 0) { 38 print("Usage: jjs javafoovars.js -- <directory>"); 39 exit(1); 40} 41 42// Java types used 43var File = Java.type("java.io.File"); 44var Files = Java.type("java.nio.file.Files"); 45var StringArray = Java.type("java.lang.String[]"); 46var ToolProvider = Java.type("javax.tools.ToolProvider"); 47var Tree = Java.type("com.sun.source.tree.Tree"); 48var TreeScanner = Java.type("com.sun.source.util.TreeScanner"); 49var VariableTree = Java.type("com.sun.source.tree.VariableTree"); 50 51// count "foo"-s in the given .java files 52function countFoo() { 53 // get the system compiler tool 54 var compiler = ToolProvider.systemJavaCompiler; 55 // get standard file manager 56 var fileMgr = compiler.getStandardFileManager(null, null, null); 57 // Using Java.to convert script array (arguments) to a Java String[] 58 var compUnits = fileMgr.getJavaFileObjects( 59 Java.to(arguments, StringArray)); 60 // create a new compilation task 61 var task = compiler.getTask(null, fileMgr, null, null, null, compUnits); 62 // subclass SimpleTreeVisitor - to count variables called "foo" 63 var FooCounterVisitor = Java.extend(TreeScanner); 64 var fooCount = 0; 65 66 var visitor = new FooCounterVisitor() { 67 visitVariable: function (node, p) { 68 if (node.name.toString() == "foo") { 69 fooCount++; 70 } 71 } 72 } 73 74 for each (var cu in task.parse()) { 75 cu.accept(visitor, null); 76 } 77 return fooCount; 78} 79 80// for each ".java" file in directory (recursively) count "foo". 81function main(dir) { 82 var totalCount = 0; 83 Files.walk(dir.toPath()). 84 forEach(function(p) { 85 var name = p.toFile().absolutePath; 86 if (name.endsWith(".java")) { 87 var count = 0; 88 try { 89 count = countFoo(p.toFile().getAbsolutePath()); 90 } catch (e) { 91 print(e); 92 } 93 if (count != 0) { 94 print(name + ": " + count); 95 } 96 totalCount += count; 97 } 98 }); 99 print("Total foo count: " + totalCount); 100} 101 102main(new File(arguments[0])); 103