package annotator.find; import annotator.scanner.CommonScanner; import com.sun.source.tree.*; import com.sun.source.util.TreePath; /** * Represents the criterion that a program element has a particular type and * name. */ final class IsCriterion implements Criterion { private final Tree.Kind kind; private final String name; IsCriterion(Tree.Kind kind, String name) { this.kind = kind; this.name = name; } /** * {@inheritDoc} */ @Override public Kind getKind() { return Kind.HAS_KIND; } /** {@inheritDoc} */ @Override public boolean isSatisfiedBy(TreePath path, Tree leaf) { assert path == null || path.getLeaf() == leaf; return isSatisfiedBy(path); } /** {@inheritDoc} */ @Override public boolean isSatisfiedBy(TreePath path) { if (path == null) { return false; } Tree tree = path.getLeaf(); if (CommonScanner.hasClassKind(tree)) { return InClassCriterion.isSatisfiedBy(path, name, /*exactMatch=*/ true); } if (tree.getKind() != kind) { return false; } switch (tree.getKind()) { case VARIABLE: String varName = ((VariableTree)tree).getName().toString(); return varName.equals(name); case METHOD: String methodName = ((MethodTree)tree).getName().toString(); return methodName.equals(name); // case CLASS: // return InClassCriterion.isSatisfiedBy(path, name, /*exactMatch=*/ true); default: throw new Error("unknown tree kind " + kind); } } /** * {@inheritDoc} */ @Override public String toString() { return "is " + kind.toString().toLowerCase() + " '" + name + "'"; } }