Mon, 16 Sep 2013 14:13:44 +0200
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 | } |