| 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() : "")); |
| } |
| } |
| |
| } |