1package annotator.find;
2
3import annotations.el.RelativeLocation;
4import annotator.scanner.LambdaScanner;
5
6import com.sun.source.tree.LambdaExpressionTree;
7import com.sun.source.tree.Tree;
8import com.sun.source.util.TreePath;
9
10public class LambdaCriterion implements Criterion {
11  private final String methodName;
12  private final RelativeLocation loc;
13
14  public LambdaCriterion(String methodName, RelativeLocation loc) {
15    this.methodName = methodName;
16    this.loc = loc;
17  }
18
19  /** {@inheritDoc} */
20  @Override
21  public boolean isSatisfiedBy(TreePath path, Tree leaf) {
22    assert path == null || path.getLeaf() == leaf;
23    return isSatisfiedBy(path);
24  }
25
26  /** {@inheritDoc} */
27  @Override
28  public boolean isSatisfiedBy(TreePath path) {
29    if (path == null) {
30      Criteria.dbug.debug("return null");
31      return false;
32    }
33
34    Tree leaf = path.getLeaf();
35
36    Criteria.dbug.debug("%n%s%n", this.toString());
37    Criteria.dbug.debug("LambdaCriterion.isSatisfiedBy: %s%n", leaf);
38    Criteria.dbug.debug("leaf: %s%n", leaf);
39    Criteria.dbug.debug("kind: %s%n", leaf.getKind());
40    Criteria.dbug.debug("class: %s%n", leaf.getClass());
41
42    TreePath parentPath = path.getParentPath();
43    if (parentPath == null) {
44      Criteria.dbug.debug("return: parent path null%n");
45      return false;
46    }
47
48    Tree parent = parentPath.getLeaf();
49    if (parent == null) {
50      Criteria.dbug.debug("return: parent null%n");
51      return false;
52    }
53
54    if (parent.getKind() == Tree.Kind.LAMBDA_EXPRESSION) {
55      // LambdaExpressionTree lambdaTree = (LambdaExpressionTree) parent;
56
57      int indexInSource = LambdaScanner.indexOfLambdaExpressionTree(path, parent);
58      Criteria.dbug.debug("return source: %d%n", indexInSource);
59      boolean b;
60      if (loc.isBytecodeOffset()) {
61        int indexInClass = LambdaScanner.getMethodLambdaExpressionIndex(methodName, loc.offset);
62        Criteria.dbug.debug("return class: %d%n", indexInClass);
63        b = (indexInSource == indexInClass);
64      } else {
65        b = (indexInSource == loc.index);
66        Criteria.dbug.debug("return loc.index: %d%n", loc.index);
67      }
68      Criteria.dbug.debug("return new: %b%n", b);
69      return b;
70    } else {
71      boolean b = this.isSatisfiedBy(path.getParentPath());
72      Criteria.dbug.debug("return parent: %b%n", b);
73      return b;
74    }
75  }
76
77  @Override
78  public Kind getKind() {
79    return Kind.LAMBDA_EXPRESSION;
80  }
81
82  @Override
83  public String toString() {
84    return "LambdaCriterion: at location: " + loc;
85  }
86}
87