test/tools/javac/MethodParameters/Tester.java

Mon, 16 Sep 2013 14:13:44 +0200

author
jlahoda
date
Mon, 16 Sep 2013 14:13:44 +0200
changeset 2028
4ce8148ffc4f
parent 1792
ec871c3e8337
child 2137
a48d3b981083
permissions
-rw-r--r--

8021112: Spurious unchecked warning reported by javac
6480588: No way to suppress deprecation warnings when implementing deprecated interface
Summary: Fixing DeferredLintHandler configuration, so lint warnings are reported with correct @SuppressWarnings settings
Reviewed-by: jjg, vromero

strarup@1594 1 /*
strarup@1594 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
strarup@1594 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
strarup@1594 4 *
strarup@1594 5 * This code is free software; you can redistribute it and/or modify it
strarup@1594 6 * under the terms of the GNU General Public License version 2 only, as
strarup@1594 7 * published by the Free Software Foundation.
strarup@1594 8 *
strarup@1594 9 * This code is distributed in the hope that it will be useful, but WITHOUT
strarup@1594 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
strarup@1594 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
strarup@1594 12 * version 2 for more details (a copy is included in the LICENSE file that
strarup@1594 13 * accompanied this code).
strarup@1594 14 *
strarup@1594 15 * You should have received a copy of the GNU General Public License version
strarup@1594 16 * 2 along with this work; if not, write to the Free Software Foundation,
strarup@1594 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
strarup@1594 18 *
strarup@1594 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
strarup@1594 20 * or visit www.oracle.com if you need additional information or have any
strarup@1594 21 * questions.
strarup@1594 22 */
strarup@1594 23
strarup@1594 24 import java.io.*;
strarup@1594 25 import java.lang.reflect.Constructor;
strarup@1594 26
strarup@1594 27 /**
strarup@1594 28 * Test driver for MethodParameters testing.
strarup@1594 29 * <p>
strarup@1594 30 * The intended use of this driver is to run it, giving the name of
strarup@1594 31 * a single class compiled with -parameters as argument. The driver
strarup@1594 32 * will test the specified class, and any nested classes it finds.
strarup@1594 33 * <p>
strarup@1594 34 * Each class is tested in two way. By refelction, and by directly
strarup@1594 35 * checking MethodParameters attributes in the classfile. The checking
strarup@1594 36 * is done using two visitor classes {@link ClassFileVisitor} and
strarup@1594 37 * {@link ReflectionVisitor}.
strarup@1594 38 * <p>
strarup@1594 39 * The {@code ReflectionVisitor} test logically belongs with library tests.
strarup@1594 40 * we wish to reuse the same test-cases, so both test are committed together,
strarup@1594 41 * under langtools. The tests, may be duplicated in the jdk repository.
strarup@1594 42 */
strarup@1594 43 public class Tester {
strarup@1594 44
strarup@1594 45 final static File classesdir = new File(System.getProperty("test.classes", "."));
strarup@1594 46
strarup@1594 47 /**
strarup@1594 48 * The visitor classes that does the actual checking are referenced
strarup@1594 49 * statically, to force compilations, without having to reference
strarup@1594 50 * them in individual test cases.
strarup@1594 51 * <p>
strarup@1594 52 * This makes it easy to change the set of visitors, without
strarup@1594 53 * complicating the design with dynamic discovery and compilation
strarup@1594 54 * of visitor classes.
strarup@1594 55 */
strarup@1594 56 static final Class visitors[] = {
strarup@1594 57 ClassFileVisitor.class,
strarup@1594 58 ReflectionVisitor.class
strarup@1594 59 };
strarup@1594 60
strarup@1594 61 /**
strarup@1594 62 * Test-driver expect a single classname as argument.
strarup@1594 63 */
strarup@1594 64 public static void main(String... args) throws Exception {
strarup@1594 65 if (args.length != 1) {
strarup@1594 66 throw new Error("A single class name is expected as argument");
strarup@1594 67 }
strarup@1594 68 final String pattern = args[0] + ".*\\.class";
strarup@1594 69 File files[] = classesdir.listFiles(new FileFilter() {
strarup@1594 70 public boolean accept(File f) {
strarup@1594 71 return f.getName().matches(pattern);
strarup@1594 72 }
strarup@1594 73 });
strarup@1594 74 if (files.length == 0) {
strarup@1594 75 File file = new File(classesdir, args[0] + ".class");
strarup@1594 76 throw new Error(file.getPath() + " not found");
strarup@1594 77 }
strarup@1594 78
strarup@1594 79 new Tester(args[0], files).run();
strarup@1594 80 }
strarup@1594 81
strarup@1594 82 public Tester(String name, File files[]) {
strarup@1594 83 this.classname = name;
strarup@1594 84 this.files = files;
strarup@1594 85 }
strarup@1594 86
strarup@1594 87 void run() throws Exception {
strarup@1594 88
strarup@1594 89 // Test with each visitor
strarup@1594 90 for (Class<Visitor> vclass : visitors) {
strarup@1594 91 try {
strarup@1594 92 String vname = vclass.getName();
strarup@1594 93 Constructor c = vclass.getConstructor(Tester.class);
strarup@1594 94
strarup@1594 95 info("\nRun " + vname + " for " + classname + "\n");
strarup@1594 96 StringBuilder sb = new StringBuilder();
strarup@1594 97 for (File f : files) {
strarup@1594 98 String fname = f.getName();
strarup@1594 99 fname = fname.substring(0, fname.length() - 6);
strarup@1594 100 Visitor v = (Visitor) c.newInstance(this);
strarup@1594 101 try {
strarup@1594 102 v.visitClass(fname, f, sb);
strarup@1594 103 } catch(Exception e) {
strarup@1594 104 error("Uncaught exception in visitClass()");
strarup@1594 105 e.printStackTrace();
strarup@1594 106 }
strarup@1594 107 }
strarup@1594 108 info(sb.toString());
strarup@1594 109 } catch(ReflectiveOperationException e) {
strarup@1594 110 warn("Class " + vclass.getName() + " ignored, not a Visitor");
strarup@1594 111 continue;
strarup@1594 112 }
strarup@1594 113 }
strarup@1594 114
strarup@1594 115 if(0 != warnings)
strarup@1594 116 System.err.println("Test generated " + warnings + " warnings");
strarup@1594 117
strarup@1594 118 if(0 != errors)
strarup@1594 119 throw new Exception("Tester test failed with " +
strarup@1594 120 errors + " errors");
strarup@1594 121 }
strarup@1594 122
strarup@1594 123 abstract static class Visitor {
strarup@1594 124 Tester tester;
strarup@1594 125 File classesdir;
strarup@1594 126
strarup@1594 127 public Visitor(Tester tester) {
strarup@1594 128 this.tester = tester;
strarup@1594 129 }
strarup@1594 130
strarup@1594 131 abstract void visitClass(final String classname, final File cfile,
strarup@1594 132 final StringBuilder sb) throws Exception;
strarup@1594 133
strarup@1594 134 public void error(String msg) {
strarup@1594 135 tester.error(msg);
strarup@1594 136 }
strarup@1594 137
strarup@1594 138 public void warn(String msg) {
strarup@1594 139 tester.warn(msg);
strarup@1594 140 }
strarup@1594 141 }
strarup@1594 142
strarup@1594 143 void error(String msg) {
strarup@1594 144 System.err.println("Error: " + msg);
strarup@1594 145 errors++;
strarup@1594 146 }
strarup@1594 147
strarup@1594 148 void warn(String msg) {
strarup@1594 149 System.err.println("Warning: " + msg);
strarup@1594 150 warnings++;
strarup@1594 151 }
strarup@1594 152
strarup@1594 153 void info(String msg) {
strarup@1594 154 System.out.println(msg);
strarup@1594 155 }
strarup@1594 156
strarup@1594 157 int errors;
strarup@1594 158 int warnings;
strarup@1594 159 String classname;
strarup@1594 160 File files[];
strarup@1594 161 }

mercurial