javafoovars.js revision 935:d154edd416d4
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 FileVisitOption = Java.type("java.nio.file.FileVisitOption"); 46var StringArray = Java.type("java.lang.String[]"); 47var ToolProvider = Java.type("javax.tools.ToolProvider"); 48var Tree = Java.type("com.sun.source.tree.Tree"); 49var TreeScanner = Java.type("com.sun.source.util.TreeScanner"); 50var VariableTree = Java.type("com.sun.source.tree.VariableTree"); 51 52// count "foo"-s in the given .java files 53function countFoo() { 54 // get the system compiler tool 55 var compiler = ToolProvider.systemJavaCompiler; 56 // get standard file manager 57 var fileMgr = compiler.getStandardFileManager(null, null, null); 58 // Using Java.to convert script array (arguments) to a Java String[] 59 var compUnits = fileMgr.getJavaFileObjects( 60 Java.to(arguments, StringArray)); 61 // create a new compilation task 62 var task = compiler.getTask(null, fileMgr, null, null, null, compUnits); 63 // subclass SimpleTreeVisitor - to count variables called "foo" 64 var FooCounterVisitor = Java.extend(TreeScanner); 65 var fooCount = 0; 66 67 var visitor = new FooCounterVisitor() { 68 visitVariable: function (node, p) { 69 if (node.name.toString() == "foo") { 70 fooCount++; 71 } 72 } 73 } 74 75 for each (var cu in task.parse()) { 76 cu.accept(visitor, null); 77 } 78 return fooCount; 79} 80 81// for each ".java" file in directory (recursively) count "foo". 82function main(dir) { 83 var totalCount = 0; 84 Files.walk(dir.toPath(), FileVisitOption.FOLLOW_LINKS). 85 forEach(function(p) { 86 var name = p.toFile().absolutePath; 87 if (name.endsWith(".java")) { 88 var count = 0; 89 try { 90 count = countFoo(p.toFile().getAbsolutePath()); 91 } catch (e) { 92 print(e); 93 } 94 if (count != 0) { 95 print(name + ": " + count); 96 } 97 totalCount += count; 98 } 99 }); 100 print("Total foo count: " + totalCount); 101} 102 103main(new File(arguments[0])); 104