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 + "'";
}
}