Home | History | Annotate | Download | only in find
      1 package annotator.find;
      2 
      3 import java.util.List;
      4 
      5 import annotations.el.TypeIndexLocation;
      6 import annotator.scanner.CommonScanner;
      7 
      8 import com.sun.source.tree.ClassTree;
      9 import com.sun.source.tree.Tree;
     10 import com.sun.source.util.TreePath;
     11 import com.sun.tools.javac.tree.JCTree;
     12 
     13 /**
     14  * A criterion to find a given extends or implements clause.
     15  */
     16 public class ExtImplsLocationCriterion implements Criterion {
     17 
     18   private final String classname;
     19   private final Integer index;
     20 
     21   /**
     22    * @param classname the class name; for debugging purposes only, not used to constrain
     23    * @param tyLoc -1 for an extends clause, $ge; 0 for the zero-based implements clause
     24    */
     25   public ExtImplsLocationCriterion(String classname, TypeIndexLocation tyLoc) {
     26     this.classname = classname;
     27     this.index = tyLoc.typeIndex;
     28   }
     29 
     30   /** {@inheritDoc} */
     31   @Override
     32   public boolean isSatisfiedBy(TreePath path, Tree leaf) {
     33     assert path == null || path.getLeaf() == leaf;
     34     return isSatisfiedBy(path);
     35   }
     36 
     37   /** {@inheritDoc} */
     38   @Override
     39   public boolean isSatisfiedBy(TreePath path) {
     40     if (path == null) {
     41       return false;
     42     }
     43 
     44     Tree leaf = path.getLeaf();
     45 
     46     // System.out.printf("ExtImplsLocationCriterion.isSatisfiedBy(%s):%n  leaf=%s (%s)%n", path, leaf, leaf.getClass());
     47 
     48     TreePath parentPath = path.getParentPath();
     49     if (parentPath == null) {
     50       return false;
     51     }
     52 
     53     Tree parent = parentPath.getLeaf();
     54     if (parent == null) {
     55       return false;
     56     }
     57 
     58     // System.out.printf("ExtImplsLocationCriterion.isSatisfiedBy(%s):%n  leaf=%s (%s)%n  parent=%s (%s)%n", path, leaf, leaf.getClass(), parent, parent.getClass());
     59 
     60     boolean returnValue = false;
     61 
     62     if (index == -1 && leaf.getKind() == Tree.Kind.CLASS) {
     63         return ((JCTree.JCClassDecl) leaf).getExtendsClause() == null;
     64     }
     65     if (CommonScanner.hasClassKind(parent)) {
     66         ClassTree ct = (ClassTree) parent;
     67 
     68         if (index==-1) {
     69             Tree ext = ct.getExtendsClause();
     70             if (ext == leaf) {
     71                 returnValue = true;
     72             }
     73         } else {
     74             List<? extends Tree> impls = ct.getImplementsClause();
     75             if (index < impls.size() && impls.get(index) == leaf) {
     76                 returnValue = true;
     77             }
     78         }
     79     }
     80 
     81     if (!returnValue) {
     82         return this.isSatisfiedBy(parentPath);
     83     } else {
     84         return true;
     85     }
     86   }
     87 
     88   public Integer getIndex() {
     89     return index;
     90   }
     91 
     92   /** {@inheritDoc} */
     93   @Override
     94   public Kind getKind() {
     95     return Kind.EXTIMPLS_LOCATION;
     96   }
     97 
     98   /** {@inheritDoc} */
     99   @Override
    100   public String toString() {
    101     return "ExtImplsLocationCriterion: class " + classname + " at type index: " + index;
    102   }
    103 }
    104