jjg@900: /* jjg@900: * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. jjg@900: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jjg@900: * jjg@900: * This code is free software; you can redistribute it and/or modify it jjg@900: * under the terms of the GNU General Public License version 2 only, as jjg@900: * published by the Free Software Foundation. jjg@900: * jjg@900: * This code is distributed in the hope that it will be useful, but WITHOUT jjg@900: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jjg@900: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jjg@900: * version 2 for more details (a copy is included in the LICENSE file that jjg@900: * accompanied this code). jjg@900: * jjg@900: * You should have received a copy of the GNU General Public License version jjg@900: * 2 along with this work; if not, write to the Free Software Foundation, jjg@900: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jjg@900: * jjg@900: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jjg@900: * or visit www.oracle.com if you need additional information or have any jjg@900: * questions. jjg@900: */ jjg@900: jjg@900: /* jjg@900: * @test jjg@900: * @bug 7021183 jjg@900: * @summary 269: assertion failure getting enclosing element of an undefined name jjg@900: */ jjg@900: jjg@900: import java.lang.reflect.Field; jjg@900: import javax.lang.model.element.Element; jjg@900: import javax.lang.model.element.ExecutableElement; jjg@900: import javax.lang.model.element.PackageElement; jjg@900: import javax.lang.model.element.TypeElement; jjg@900: import javax.lang.model.element.TypeParameterElement; jjg@900: import javax.lang.model.element.UnknownElementException; jjg@900: import javax.lang.model.element.VariableElement; jjg@900: import javax.lang.model.type.TypeMirror; jjg@900: import javax.lang.model.type.UnknownTypeException; jjg@900: import javax.lang.model.util.ElementScanner7; jjg@900: import javax.lang.model.util.SimpleTypeVisitor7; jjg@900: import javax.lang.model.util.Types; jjg@900: jjg@900: import com.sun.tools.javac.code.Symbol.ClassSymbol; jjg@900: import com.sun.tools.javac.code.Symtab; jjg@900: import com.sun.tools.javac.file.JavacFileManager; jjg@983: import com.sun.tools.javac.main.JavaCompiler; jjg@900: import com.sun.tools.javac.model.JavacTypes; jjg@900: import com.sun.tools.javac.util.Context; jjg@900: jjg@900: /** jjg@900: * Scan javac Symtab looking for TypeMirrors and Elements, and ensure that jjg@900: * no exceptions are thrown when used with javax.lang.model visitors. jjg@900: * jjg@900: */ jjg@900: public class TestSymtabItems { jjg@900: public static void main(String... args) throws Exception { jjg@900: new TestSymtabItems().run(); jjg@900: } jjg@900: jjg@900: void run() throws Exception { jjg@900: Context c = new Context(); jjg@900: JavacFileManager.preRegister(c); jjg@900: Symtab syms = Symtab.instance(c); jjg@900: JavacTypes types = JavacTypes.instance(c); jjg@983: JavaCompiler.instance(c); // will init ClassReader.sourceCompleter jjg@900: jjg@900: // print("noSymbol", syms.noSymbol); jjg@900: // print("errSymbol", syms.errSymbol); jjg@900: // print("unknownSymbol", syms.unknownSymbol); jjg@900: // print("botType", syms.botType); jjg@900: // print("errType", syms.errType); jjg@900: // print("unknownType", syms.unknownType); jjg@900: jjg@900: for (Field f: Symtab.class.getDeclaredFields()) { jjg@900: // System.err.println(f.getType() + " " + f.getName()); jjg@900: jjg@900: // Temporarily ignore methodHandle and transientMethodHandle jjg@900: // during API evolution jjg@900: if (f.getName().toLowerCase().contains("methodhandle")) jjg@900: continue; jjg@900: jjg@900: Class ft = f.getType(); jjg@900: if (TypeMirror.class.isAssignableFrom(ft)) jjg@900: print(f.getName(), (TypeMirror) f.get(syms), types); jjg@900: else if(Element.class.isAssignableFrom(ft)) jjg@900: print(f.getName(), (Element) f.get(syms)); jjg@900: } jjg@900: jjg@900: if (errors > 0) jjg@900: throw new Exception(errors + " errors occurred"); jjg@900: } jjg@900: jjg@900: void print(String label, Element e) { jjg@900: ElemPrinter ep = new ElemPrinter(); jjg@900: System.err.println("Test " + label); jjg@900: ep.visit(e); jjg@900: System.err.println(); jjg@900: } jjg@900: jjg@900: void print(String label, TypeMirror t, Types types) { jjg@900: TypePrinter tp = new TypePrinter(); jjg@900: System.err.println("Test " + label); jjg@900: tp.visit(t, types); jjg@900: System.err.println(); jjg@900: } jjg@900: jjg@900: void error(String msg) { jjg@900: System.err.println("Error: " + msg); jjg@900: errors++; jjg@900: } jjg@900: jjg@900: int errors; jjg@900: jjg@900: class ElemPrinter extends ElementScanner7 { jjg@900: @Override jjg@900: public Void visitPackage(PackageElement e, Void p) { jjg@900: show("package", e); jjg@900: indent(+1); jjg@900: super.visitPackage(e, p); jjg@900: indent(-1); jjg@900: return null; jjg@900: } jjg@900: jjg@900: @Override jjg@900: public Void visitType(TypeElement e, Void p) { jjg@900: show("type", e); jjg@900: indent(+1); jjg@900: super.visitType(e, p); jjg@900: indent(-1); jjg@900: return null; jjg@900: } jjg@900: jjg@900: @Override jjg@900: public Void visitVariable(VariableElement e, Void p) { jjg@900: show("variable", e); jjg@900: indent(+1); jjg@900: super.visitVariable(e, p); jjg@900: indent(-1); jjg@900: return null; jjg@900: } jjg@900: jjg@900: @Override jjg@900: public Void visitExecutable(ExecutableElement e, Void p) { jjg@900: show("executable", e); jjg@900: indent(+1); jjg@900: super.visitExecutable(e, p); jjg@900: indent(-1); jjg@900: return null; jjg@900: } jjg@900: jjg@900: @Override jjg@900: public Void visitTypeParameter(TypeParameterElement e, Void p) { jjg@900: show("type parameter", e); jjg@900: indent(+1); jjg@900: super.visitTypeParameter(e, p); jjg@900: indent(-1); jjg@900: return null; jjg@900: } jjg@900: jjg@900: @Override jjg@900: public Void visitUnknown(Element e, Void p) { jjg@900: show("unknown", e); jjg@900: indent(+1); jjg@900: try { jjg@900: super.visitUnknown(e, p); jjg@900: } catch (UnknownElementException ex) { jjg@900: System.err.println("caught " + ex); jjg@900: } jjg@900: indent(-1); jjg@900: return null; jjg@900: } jjg@900: jjg@900: void indent(int i) { jjg@900: indent += i; jjg@900: } jjg@900: jjg@900: String sp(int w) { jjg@900: StringBuilder sb = new StringBuilder(); jjg@900: for (int i = 0; i < w; i++) jjg@900: sb.append(" "); jjg@900: return sb.toString(); jjg@900: } jjg@900: jjg@900: void show(String label, Element e) { jjg@900: System.err.println(sp(indent) + label jjg@900: + ": mods:" + e.getModifiers() jjg@900: + " " + e.getSimpleName() jjg@900: + ", kind: " + e.getKind() jjg@900: + ", type: " + e.asType() jjg@900: + ", encl: " + e.getEnclosingElement()); jjg@900: jjg@900: // The following checks help establish why NPE might occur when trying to scan children jjg@900: if (e instanceof ClassSymbol) { jjg@900: ClassSymbol csym = (ClassSymbol) e; jjg@900: if (csym.members_field == null) jjg@900: error("members_field is null"); jjg@900: if (csym.type == null) jjg@900: System.err.println("type is null"); jjg@900: } jjg@900: } jjg@900: jjg@900: int indent; jjg@900: }; jjg@900: jjg@900: class TypePrinter extends SimpleTypeVisitor7 { jjg@900: @Override jjg@900: public Void defaultAction(TypeMirror m, Types types) { jjg@900: System.err.println(m.getKind() + " " + m + " " + types.asElement(m)); jjg@900: return null; jjg@900: } jjg@900: jjg@900: @Override jjg@900: public Void visitUnknown(TypeMirror t, Types types) { jjg@900: try { jjg@900: return super.visitUnknown(t, types); jjg@900: } catch (UnknownTypeException ex) { jjg@900: System.err.println("caught " + ex); jjg@900: return null; jjg@900: } jjg@900: } jjg@900: }; jjg@900: }