package annotator.find; import javax.lang.model.element.Modifier; import annotator.Main; import com.sun.source.tree.*; import com.sun.source.util.TreePath; /** * Represents the criterion that a program element is in a method with a * certain name. */ final class InMethodCriterion implements Criterion { public final String name; private final IsSigMethodCriterion sigMethodCriterion; InMethodCriterion(String name) { this.name = name; sigMethodCriterion = new IsSigMethodCriterion(name); } /** * {@inheritDoc} */ @Override public Kind getKind() { return Kind.IN_METHOD; } /** {@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) { Criteria.dbug.debug("InMethodCriterion.isSatisfiedBy(%s); this=%s%n", Main.pathToString(path), this.toString()); boolean staticDecl = false; boolean result = false; do { if (path.getLeaf().getKind() == Tree.Kind.METHOD) { boolean b = sigMethodCriterion.isSatisfiedBy(path); Criteria.dbug.debug("%s%n", "InMethodCriterion.isSatisfiedBy => b"); return b; } if (path.getLeaf().getKind() == Tree.Kind.VARIABLE) { ModifiersTree mods = ((VariableTree) path.getLeaf()).getModifiers(); staticDecl = mods.getFlags().contains(Modifier.STATIC); } path = path.getParentPath(); } while (path != null && path.getLeaf() != null); result = (staticDecl ? "<clinit>()V" : "<init>()V").equals(name); Criteria.dbug.debug("InMethodCriterion.isSatisfiedBy => %s%n", result); return result; } /** * {@inheritDoc} */ @Override public String toString() { return "in method '" + name + "'"; } }