| package org.checkerframework.framework.type.treeannotator; |
| |
| import com.sun.source.tree.Tree; |
| import com.sun.source.tree.Tree.Kind; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.HashSet; |
| import java.util.Set; |
| import org.checkerframework.framework.type.AnnotatedTypeMirror; |
| |
| /** A ListTreeAnnotator implementation that additionally outputs debugging information. */ |
| public class DebugListTreeAnnotator extends ListTreeAnnotator { |
| private final Set<Kind> kinds; |
| |
| public DebugListTreeAnnotator(TreeAnnotator... annotators) { |
| super(annotators); |
| kinds = Collections.emptySet(); |
| } |
| |
| public DebugListTreeAnnotator(Tree.Kind[] kinds, TreeAnnotator... annotators) { |
| super(annotators); |
| this.kinds = new HashSet<>(Arrays.asList(kinds)); |
| } |
| |
| @Override |
| public Void defaultAction(Tree node, AnnotatedTypeMirror type) { |
| if (kinds.contains(node.getKind())) { |
| System.out.println("DebugListTreeAnnotator input tree: " + node); |
| System.out.println(" Initial type: " + type); |
| for (TreeAnnotator annotator : annotators) { |
| System.out.println(" Running annotator: " + annotator.getClass()); |
| annotator.visit(node, type); |
| System.out.println(" Current type: " + type); |
| } |
| } else { |
| super.defaultAction(node, type); |
| } |
| |
| return null; |
| } |
| } |