T6421111.java revision 797:4868a36f6fd8
1241675Suqs/* 2241675Suqs * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. 3241675Suqs * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4241675Suqs * 5241675Suqs * This code is free software; you can redistribute it and/or modify it 6241675Suqs * under the terms of the GNU General Public License version 2 only, as 7241675Suqs * published by the Free Software Foundation. 8241675Suqs * 9241675Suqs * This code is distributed in the hope that it will be useful, but WITHOUT 10241675Suqs * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11241675Suqs * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12241675Suqs * version 2 for more details (a copy is included in the LICENSE file that 13241675Suqs * accompanied this code). 14241675Suqs * 15241675Suqs * You should have received a copy of the GNU General Public License version 16241675Suqs * 2 along with this work; if not, write to the Free Software Foundation, 17241675Suqs * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18241675Suqs * 19241675Suqs * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20241675Suqs * or visit www.oracle.com if you need additional information or have any 21241675Suqs * questions. 22241675Suqs */ 23241675Suqs 24241675Suqs/* 25241675Suqs * @test 26241675Suqs * @bug 6421111 27241675Suqs * @summary NullPointerException thrown when retrieving bounds for the type parameter 28241675Suqs * @author Peter von der Ah\u00e9 29241675Suqs * @library ../lib 30241675Suqs * @compile -Xlint:all T6421111.java 31241675Suqs * @run main T6421111 32241675Suqs */ 33241675Suqs 34241675Suqsimport java.io.File; 35241675Suqsimport java.net.URI; 36241675Suqsimport java.util.Arrays; 37241675Suqsimport java.util.Collections; 38241675Suqsimport java.util.Set; 39241675Suqsimport javax.annotation.processing.AbstractProcessor; 40241675Suqsimport javax.annotation.processing.RoundEnvironment; 41241675Suqsimport javax.annotation.processing.SupportedAnnotationTypes; 42241675Suqsimport javax.annotation.processing.SupportedSourceVersion; 43241675Suqsimport javax.lang.model.SourceVersion; 44241675Suqsimport javax.lang.model.element.TypeElement; 45241675Suqsimport javax.lang.model.element.TypeParameterElement; 46241675Suqsimport javax.lang.model.type.DeclaredType; 47241675Suqsimport javax.lang.model.type.TypeVariable; 48241675Suqsimport javax.tools.SimpleJavaFileObject; 49241675Suqs 50241675Suqsimport static javax.tools.JavaFileObject.Kind.SOURCE; 51241675Suqs 52241675Suqspublic class T6421111 extends ToolTester { 53241675Suqs void test(String... args) { 54241675Suqs class Test1 extends SimpleJavaFileObject { 55241675Suqs Test1() { 56241675Suqs super(URI.create("myfo:///Test1.java"), SOURCE); 57241675Suqs } 58241675Suqs @Override 59241675Suqs public String getCharContent(boolean ignoreEncodingErrors) { 60241675Suqs return "class Test1<T extends Thread & Runnable> {}"; 61241675Suqs } 62241675Suqs } 63241675Suqs class Test2 extends SimpleJavaFileObject { 64241675Suqs Test2() { 65241675Suqs super(URI.create("myfo:///Test2.java"), SOURCE); 66241675Suqs } 67241675Suqs @Override 68241675Suqs public String getCharContent(boolean ignoreEncodingErrors) { 69241675Suqs return "class Test2<T extends Test2<T> & Runnable> {}"; 70241675Suqs } 71241675Suqs } 72241675Suqs task = tool.getTask(null, fm, null, Collections.singleton("-Xlint:all"), null, 73241675Suqs Arrays.asList(new Test1(), new Test2())); 74241675Suqs task.setProcessors(Collections.singleton(new MyProcessor())); 75241675Suqs if (!task.call()) 76241675Suqs throw new AssertionError("Annotation processor failed"); 77241675Suqs } 78241675Suqs @SupportedAnnotationTypes("*") 79241675Suqs static class MyProcessor extends AbstractProcessor { 80241675Suqs void test(TypeElement element, boolean fbound) { 81241675Suqs TypeParameterElement tpe = element.getTypeParameters().iterator().next(); 82241675Suqs tpe.getBounds().getClass(); 83241675Suqs if (fbound) { 84241675Suqs DeclaredType type = (DeclaredType)tpe.getBounds().get(0); 85241675Suqs if (type.asElement() != element) 86241675Suqs throw error("%s != %s", type.asElement(), element); 87241675Suqs TypeVariable tv = (TypeVariable)type.getTypeArguments().get(0); 88241675Suqs if (tv.asElement() != tpe) 89241675Suqs throw error("%s != %s", tv.asElement(), tpe); 90241675Suqs } 91241675Suqs } 92241675Suqs public boolean process(Set<? extends TypeElement> annotations, 93241675Suqs RoundEnvironment roundEnv) { 94241675Suqs test(processingEnv.getElementUtils().getTypeElement("Test1"), false); 95241675Suqs test(processingEnv.getElementUtils().getTypeElement("Test2"), true); 96241675Suqs return false; 97241675Suqs } 98241675Suqs @Override 99241675Suqs public SourceVersion getSupportedSourceVersion() { 100241675Suqs return SourceVersion.latest(); 101241675Suqs } 102241675Suqs } 103241675Suqs public static void main(String... args) { 104241675Suqs new T6421111().test(args); 105241675Suqs } 106241675Suqs public static AssertionError error(String format, Object... args) { 107241675Suqs return new AssertionError(String.format(format, args)); 108241675Suqs } 109241675Suqs} 110241675Suqs