/* * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/* * @test * @bug 6346249 6392177 6411385 * @summary new Trees API * @modules jdk.compiler/com.sun.tools.javac.tree
*/
void testElement(Trees trees, Element e) {
trees.getClass();
e.getClass();
System.err.println("testElement: " + e);
Tree tree = trees.getTree(e); //System.err.println(tree);
if (TreeInfo.symbolFor((JCTree)tree) != e)
error("bad result from getTree");
TreePath path = trees.getPath(e); if (path == null) {
error("getPath returned null"); return;
} if (path.getLeaf() != tree)
error("bad result from getPath");
Element e2 = trees.getElement(path); if (e2 == null) {
error("getElement returned null"); return;
} if (e2 != e)
error("bad result from getElement");
// The TypeMirror is not available yet when annotation processing; // it is set up later during ANALYSE.
TypeMirror t = trees.getTypeMirror(path); if (t != null && t.getKind() == TypeKind.DECLARED &&
((DeclaredType)t).asElement() != e2)
error("bad result from getTypeMirror");
for (AnnotationMirror m: e.getAnnotationMirrors()) {
testAnnotation(trees, e, m);
}
}
void testAnnotation(Trees trees, Element e, AnnotationMirror a) {
System.err.println("testAnnotation: " + e + " " + a);
Tree tree = trees.getTree(e, a);
if (tree.getKind() != Tree.Kind.ANNOTATION && tree.getKind() != Tree.Kind.TYPE_ANNOTATION)
error("bad result from getTree");
TreePath path = trees.getPath(e, a); if (path.getLeaf() != tree)
error("bad result from getPath");
}
void testAllDeclarations(Trees trees, CompilationUnitTree cut) { new TreePathScanner<Void, Void>() {
@Override publicVoid scan(Tree tree, Void p) { if (tree == null) returnnull; switch (tree.getKind()) { case METHOD: caseCLASS: case VARIABLE: case TYPE_PARAMETER:
TreePath path = new TreePath(getCurrentPath(), tree);
Element el = trees.getElement(path); if (el == null) {
error("null element");
} else {
TreePath inferred = trees.getPath(el); if (inferred == null) {
error("null path");
} else { if (inferred.getLeaf() != path.getLeaf())
error("bad result from getPath");
} if (trees.getTree(el) != path.getLeaf())
error("bad result from getTree"); for (AnnotationMirror m: el.getAnnotationMirrors()) {
testAnnotation(trees, el, m);
}
}
} returnsuper.scan(tree, p);
}
}.scan(cut, null);
}
void error(String msg) { if (messager != null) // annotation processing will happen in a separate instance/classloader // so pass the message back to the calling instance.
messager.printError(msg); else {
System.err.println(msg);
errors++;
}
}
Messager messager; int errors;
publicboolean process(Set<? extends TypeElement> annos, RoundEnvironment rEnv) {
Trees trees = Trees.instance(processingEnv);
messager = processingEnv.getMessager();
for (Element e: rEnv.getRootElements()) {
testElement(trees, e);
}
for (TypeElement anno: annos) {
Set<? extends Element> elts = rEnv.getElementsAnnotatedWith(anno);
System.err.println("anno: " + anno);
System.err.println("elts: " + elts); if (elts != null) { // 6397298, should return empty set for (Element e: rEnv.getElementsAnnotatedWith(anno))
testElement(trees, e);
}
}
returntrue;
}
@Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest();
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.