package org.checkerframework.javacutil; import javax.lang.model.element.TypeElement; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; /** * Process the types in an AST in a trivial manner, with hooks for derived classes * to actually do something. */ public abstract class BasicTypeProcessor extends AbstractTypeProcessor { /** The source tree that's being scanned. */ protected CompilationUnitTree currentRoot; /** * Create a TreePathScanner at the given root. */ protected abstract TreePathScanner<?, ?> createTreePathScanner(CompilationUnitTree root); /** * Visit the tree path for the type element. */ @Override public void typeProcess(TypeElement e, TreePath p) { currentRoot = p.getCompilationUnit(); TreePathScanner<?, ?> scanner = null; try { scanner = createTreePathScanner(currentRoot); scanner.scan(p, null); } catch (Throwable t) { System.err.println("BasicTypeProcessor.typeProcess: unexpected Throwable (" + t.getClass().getSimpleName() + ") when processing " + currentRoot.getSourceFile().getName() + (t.getMessage()!=null ? "; message: " + t.getMessage() : "")); } } }