TestJavacTaskScanner.java revision 2599:50b448c5be54
162587Sitojun/* 295023Ssuz * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. 362587Sitojun * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 454263Sshin * 554263Sshin * This code is free software; you can redistribute it and/or modify it 654263Sshin * under the terms of the GNU General Public License version 2 only, as 754263Sshin * published by the Free Software Foundation. 854263Sshin * 954263Sshin * This code is distributed in the hope that it will be useful, but WITHOUT 1054263Sshin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1154263Sshin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1254263Sshin * version 2 for more details (a copy is included in the LICENSE file that 1354263Sshin * accompanied this code). 1454263Sshin * 1554263Sshin * You should have received a copy of the GNU General Public License version 1654263Sshin * 2 along with this work; if not, write to the Free Software Foundation, 1754263Sshin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1854263Sshin * 1954263Sshin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2054263Sshin * or visit www.oracle.com if you need additional information or have any 2154263Sshin * questions. 2254263Sshin */ 2354263Sshin 2454263Sshin/* 2554263Sshin * @test 2654263Sshin * @bug 4813736 8013256 2754263Sshin * @summary Additional functionality test of task and JSR 269 2854263Sshin * @author Peter von der Ah\u00e9 2954263Sshin * @library ./lib 3054263Sshin * @build ToolTester 3154263Sshin * @run main TestJavacTaskScanner TestJavacTaskScanner.java 3254263Sshin */ 3354263Sshin 3454263Sshinimport com.sun.tools.javac.api.JavacTaskImpl; 35101739Srwatsonimport com.sun.tools.javac.parser.*; 3654263Sshinimport com.sun.tools.javac.parser.Tokens.Token; 3754263Sshinimport com.sun.tools.javac.util.*; 3854263Sshinimport java.io.*; 3954263Sshinimport java.net.*; 40101182Srwatsonimport java.nio.*; 4154263Sshinimport java.nio.charset.Charset; 4254263Sshinimport java.util.Arrays; 4354263Sshinimport javax.lang.model.element.Element; 4454263Sshinimport javax.lang.model.element.TypeElement; 4554263Sshinimport javax.lang.model.type.DeclaredType; 4654263Sshinimport javax.lang.model.type.TypeMirror; 4791270Sbrooksimport javax.lang.model.util.Elements; 4854263Sshinimport javax.lang.model.util.Types; 4962587Sitojunimport javax.tools.*; 5079106Sbrooks 5154263Sshinimport static javax.tools.StandardLocation.CLASS_PATH; 5254263Sshinimport static javax.tools.StandardLocation.SOURCE_PATH; 5354263Sshinimport static javax.tools.StandardLocation.CLASS_OUTPUT; 5454263Sshin 5554263Sshinpublic class TestJavacTaskScanner extends ToolTester { 5654263Sshin 5754263Sshin final JavacTaskImpl task; 5854263Sshin final Elements elements; 5954263Sshin final Types types; 6054263Sshin 6178064Sume int numTokens; 6278064Sume int numParseTypeElements; 6354263Sshin int numAllMembers; 6454263Sshin 6579106Sbrooks TestJavacTaskScanner(File file) { 6654263Sshin final Iterable<? extends JavaFileObject> compilationUnits = 6754263Sshin fm.getJavaFileObjects(new File[] {file}); 6854263Sshin StandardJavaFileManager fm = getLocalFileManager(tool, null, null); 6954263Sshin task = (JavacTaskImpl)tool.getTask(null, fm, null, null, null, compilationUnits); 7054263Sshin task.getContext().put(ScannerFactory.scannerFactoryKey, 7154263Sshin new MyScanner.Factory(task.getContext(), this)); 7254263Sshin elements = task.getElements(); 7354263Sshin types = task.getTypes(); 7454263Sshin } 7554263Sshin 7662587Sitojun public void run() { 7754263Sshin Iterable<? extends TypeElement> toplevels; 7854263Sshin toplevels = task.enter(task.parse()); 7962587Sitojun for (TypeElement clazz : toplevels) { 8054263Sshin System.out.format("Testing %s:%n%n", clazz.getSimpleName()); 8154263Sshin testParseType(clazz); 8254263Sshin testGetAllMembers(clazz); 8354263Sshin System.out.println(); 8479106Sbrooks System.out.println(); 8562587Sitojun System.out.println(); 86127305Srwatson } 87127305Srwatson 88127305Srwatson System.out.println("#tokens: " + numTokens); 89127305Srwatson System.out.println("#parseTypeElements: " + numParseTypeElements); 90127305Srwatson System.out.println("#allMembers: " + numAllMembers); 91127305Srwatson 9279106Sbrooks check(numTokens, "#Tokens", 1222); 9389065Smsmith check(numParseTypeElements, "#parseTypeElements", 158); 9479106Sbrooks check(numAllMembers, "#allMembers", 52); 95127303Srwatson } 96127303Srwatson 97127303Srwatson void check(int value, String name, int expected) { 98127303Srwatson // allow some slop in the comparison to allow for minor edits in the 99127303Srwatson // test and in the platform 100127303Srwatson if (value < expected * 9 / 10) 101127303Srwatson throw new Error(name + " lower than expected; expected " + expected + "; found: " + value); 102127303Srwatson if (value > expected * 11 / 10) 10383998Sbrooks throw new Error(name + " higher than expected; expected " + expected + "; found: " + value); 10483998Sbrooks } 10583998Sbrooks 10683998Sbrooks void testParseType(TypeElement clazz) { 10783998Sbrooks DeclaredType type = (DeclaredType)task.parseType("List<String>", clazz); 10892725Salfred for (Element member : elements.getAllMembers((TypeElement)type.asElement())) { 10997289Sbrooks TypeMirror mt = types.asMemberOf(type, member); 11079106Sbrooks System.out.format("type#%d: %s : %s -> %s%n", 11192081Smux numParseTypeElements, member.getSimpleName(), member.asType(), mt); 11297289Sbrooks numParseTypeElements++; 11379106Sbrooks } 11492725Salfred } 11579106Sbrooks 11691270Sbrooks public static void main(String... args) throws IOException { 11791270Sbrooks String srcdir = System.getProperty("test.src"); 11891270Sbrooks new TestJavacTaskScanner(new File(srcdir, args[0])).run(); 11962587Sitojun } 12062587Sitojun 12191270Sbrooks private void testGetAllMembers(TypeElement clazz) { 12262587Sitojun for (Element member : elements.getAllMembers(clazz)) { 12362587Sitojun System.out.format("elem#%d: %s : %s%n", 12462587Sitojun numAllMembers, member.getSimpleName(), member.asType()); 12595023Ssuz numAllMembers++; 12662587Sitojun } 12762587Sitojun } 12862587Sitojun 12962587Sitojun /* Similar to ToolTester.getFileManager, except that this version also ensures 13062587Sitojun * javac classes will be available on the classpath. The javac classes are assumed 13191270Sbrooks * to be on the classpath used to run this test (this is true when using jtreg). 13291270Sbrooks * The classes are found by obtaining the URL for a sample javac class, using 13362587Sitojun * getClassLoader().getResource(), and then deconstructing the URL to find the 13491270Sbrooks * underlying directory or jar file to place on the classpath. 13591270Sbrooks */ 13691270Sbrooks public StandardJavaFileManager getLocalFileManager(JavaCompiler tool, 13791270Sbrooks DiagnosticListener<JavaFileObject> dl, 13891270Sbrooks Charset encoding) { 13991270Sbrooks File javac_classes; 14091270Sbrooks try { 14191270Sbrooks final String javacMainClass = "com/sun/tools/javac/Main.class"; 14291270Sbrooks URL url = getClass().getClassLoader().getResource(javacMainClass); 14391270Sbrooks if (url == null) 14491270Sbrooks throw new Error("can't locate javac classes"); 14591270Sbrooks URI uri = url.toURI(); 14691270Sbrooks String scheme = uri.getScheme(); 14779106Sbrooks String ssp = uri.getSchemeSpecificPart(); 14879106Sbrooks if (scheme.equals("jar")) { 14979106Sbrooks javac_classes = new File(new URI(ssp.substring(0, ssp.indexOf("!/")))); 15092081Smux } else if (scheme.equals("file")) { 15154263Sshin javac_classes = new File(ssp.substring(0, ssp.indexOf(javacMainClass))); 15278064Sume } else 15354263Sshin throw new Error("unknown URL: " + url); 154111119Simp } catch (URISyntaxException e) { 15579106Sbrooks throw new Error(e); 15679106Sbrooks } 15779106Sbrooks System.err.println("javac_classes: " + javac_classes); 158121816Sbrooks 15979106Sbrooks StandardJavaFileManager fm = tool.getStandardFileManager(dl, null, encoding); 160105293Sume try { 161105293Sume fm.setLocation(SOURCE_PATH, Arrays.asList(test_src)); 162127305Srwatson fm.setLocation(CLASS_PATH, join(test_class_path, Arrays.asList(javac_classes))); 163105293Sume fm.setLocation(CLASS_OUTPUT, Arrays.asList(test_classes)); 164127305Srwatson } catch (IOException e) { 165105293Sume throw new AssertionError(e); 166105293Sume } 167105293Sume return fm; 168105293Sume } 169105293Sume} 170105293Sume 171105293Sumeclass MyScanner extends Scanner { 172105293Sume 17379106Sbrooks public static class Factory extends ScannerFactory { 17462587Sitojun public Factory(Context context, TestJavacTaskScanner test) { 175105293Sume super(context); 17679106Sbrooks this.test = test; 17779106Sbrooks } 17878064Sume 17979106Sbrooks @Override 18079106Sbrooks public Scanner newScanner(CharSequence input, boolean keepDocComments) { 18178064Sume if (input instanceof CharBuffer) { 18279106Sbrooks return new MyScanner(this, (CharBuffer)input, test); 18379106Sbrooks } else { 18479106Sbrooks char[] array = input.toString().toCharArray(); 18579106Sbrooks return newScanner(array, array.length, keepDocComments); 18679106Sbrooks } 18779106Sbrooks } 18883998Sbrooks 18983998Sbrooks @Override 19079106Sbrooks public Scanner newScanner(char[] input, int inputLength, boolean keepDocComments) { 19179106Sbrooks return new MyScanner(this, input, inputLength, test); 192127305Srwatson } 193127305Srwatson 19479106Sbrooks private TestJavacTaskScanner test; 195127305Srwatson } 19679106Sbrooks protected MyScanner(ScannerFactory fac, CharBuffer buffer, TestJavacTaskScanner test) { 19779106Sbrooks super(fac, buffer); 198127305Srwatson this.test = test; 199105293Sume } 200105293Sume protected MyScanner(ScannerFactory fac, char[] input, int inputLength, TestJavacTaskScanner test) { 201105293Sume super(fac, input, inputLength); 202105293Sume this.test = test; 203105293Sume } 204105293Sume 205105293Sume public void nextToken() { 20679106Sbrooks super.nextToken(); 20779106Sbrooks Token tk = token(); 20879106Sbrooks System.err.format("Saw token %s %n", tk.kind); 20979106Sbrooks test.numTokens++; 210105293Sume } 21179106Sbrooks 21283998Sbrooks private TestJavacTaskScanner test; 21383998Sbrooks 21479106Sbrooks} 21579106Sbrooks