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