BoundLocationCriterion.java revision 10353ed766fc48a0af6bd33d934439e695c03e3
110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Alipackage annotator.find;
210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport java.util.List;
410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport annotations.el.BoundLocation;
610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport com.sun.source.tree.ClassTree;
810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport com.sun.source.tree.MethodTree;
910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport com.sun.source.tree.Tree;
1010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport com.sun.source.tree.TypeParameterTree;
1110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Aliimport com.sun.source.util.TreePath;
1210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
1310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Alipublic class BoundLocationCriterion implements Criterion {
1410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
1510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  private Criterion parentCriterion;
1610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  private Integer boundIndex;
1710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  private Integer paramIndex;
1810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
1910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
2010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  public BoundLocationCriterion(BoundLocation boundLoc) {
2110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    this(boundLoc.boundIndex, boundLoc.paramIndex);
2210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  }
2310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
2410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  private BoundLocationCriterion(Integer boundIndex, Integer paramIndex) {
2510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    this.boundIndex = boundIndex;
2610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    this.paramIndex = paramIndex;
2710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
2810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    if (boundIndex != null) {
2910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      this.parentCriterion = new BoundLocationCriterion(null, paramIndex);
3010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    } else if (paramIndex != null) {
3110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      this.parentCriterion = null;
3210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
3310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  }
3410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
3510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  /**
3610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   * {@inheritDoc}
3710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   */
3810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  public boolean isSatisfiedBy(TreePath path) {
3910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   if (path == null) {
4010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      return false;
4110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
4210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
4310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    Tree leaf = path.getLeaf();
4410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
4510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    TreePath parentPath = path.getParentPath();
4610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    if (parentPath == null) {
4710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      return false;
4810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
4910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
5010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    Tree parent = parentPath.getLeaf();
5110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    if (parent == null) {
5210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      return false;
5310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
5410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
5510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    boolean returnValue = false;
5610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
5710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    // if boundIndex is not null, need to check that this is right bound
5810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    // in parent
5910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    if (boundIndex != null) {
6010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      if (parent instanceof TypeParameterTree) {
6110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        TypeParameterTree tpt = (TypeParameterTree) parent;
6210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        List<? extends Tree> bounds = tpt.getBounds();
6310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (boundIndex < bounds.size()) {
6410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali          if (bounds.get(boundIndex) == leaf) {
6510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            returnValue = parentCriterion.isSatisfiedBy(parentPath);
6610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali          }
6710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
6810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      }
6910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    } else if (paramIndex != null) {
7010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      // if paramIndex is not null, need to ensure this present
7110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      // typeparameter tree represents the correct parameter
7210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      if (parent instanceof MethodTree || parent instanceof ClassTree) {
7310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        List<? extends TypeParameterTree> params = null;
7410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
7510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (parent instanceof MethodTree) {
7610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali          params = ((MethodTree) parent).getTypeParameters();
7710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        } else if (parent instanceof ClassTree) {
7810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali          params = ((ClassTree) parent).getTypeParameters();
7910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
8010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
8110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        if (paramIndex < params.size()) {
8210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali          if (params.get(paramIndex) == leaf) {
8310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali            returnValue = true;
8410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali          }
8510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali        }
8610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      }
8710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
8810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
8910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    if (!returnValue) {
9010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      return this.isSatisfiedBy(parentPath);
9110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    } else {
9210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      return true;
9310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    }
9410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  }
9510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
9610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  /**
9710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   * {@inheritDoc}
9810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   */
9910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  public Kind getKind() {
10010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    return Kind.BOUND_LOCATION;
10110353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  }
10210353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali
10310353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  /**
10410353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   * {@inheritDoc}
10510353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali   */
10610353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  public String toString() {
10710353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali    return "BoundCriterion: at param index: " + paramIndex +
10810353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali      " at bound index: " + boundIndex;
10910353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali  }
11010353ed766fc48a0af6bd33d934439e695c03e3Mahmood Ali}
111