Home | History | Annotate | Download | only in javaparser
      1 package com.github.javaparser;
      2 
      3 import java.util.Iterator;
      4 import java.util.Optional;
      5 
      6 import static com.github.javaparser.utils.Utils.assertNotNull;
      7 
      8 /**
      9  * The range of tokens covered by this node.
     10  */
     11 public class TokenRange implements Iterable<JavaToken> {
     12     public static final TokenRange INVALID = new TokenRange(JavaToken.INVALID, JavaToken.INVALID);
     13 
     14     private final JavaToken begin;
     15     private final JavaToken end;
     16 
     17     public TokenRange(JavaToken begin, JavaToken end) {
     18         this.begin = assertNotNull(begin);
     19         this.end = assertNotNull(end);
     20     }
     21 
     22     public JavaToken getBegin() {
     23         return begin;
     24     }
     25 
     26     public JavaToken getEnd() {
     27         return end;
     28     }
     29 
     30     public Optional<Range> toRange() {
     31         if (begin.getRange().isPresent() && end.getRange().isPresent()) {
     32             return Optional.of(new Range(begin.getRange().get().begin, end.getRange().get().end));
     33         }
     34         return Optional.empty();
     35     }
     36 
     37     public TokenRange withBegin(JavaToken begin) {
     38         return new TokenRange(assertNotNull(begin), end);
     39     }
     40 
     41     public TokenRange withEnd(JavaToken end) {
     42         return new TokenRange(begin, assertNotNull(end));
     43     }
     44 
     45     @Override
     46     public String toString() {
     47         StringBuilder result = new StringBuilder();
     48         for(JavaToken t: this) {
     49             result.append(t.getText());
     50         }
     51         return result.toString();
     52     }
     53 
     54     @Override
     55     public Iterator<JavaToken> iterator() {
     56         return new Iterator<JavaToken>() {
     57             private boolean hasNext = true;
     58             private JavaToken current = begin;
     59 
     60             @Override
     61             public boolean hasNext() {
     62                 return hasNext;
     63             }
     64 
     65             @Override
     66             public JavaToken next() {
     67                 JavaToken retval = current;
     68                 if(current == null){
     69                     throw new IllegalStateException("Attempting to move past end of range.");
     70                 }
     71                 if (current == end) {
     72                     hasNext = false;
     73                 }
     74                 current = current.getNextToken().orElse(null);
     75                 if(current == null && hasNext){
     76                     throw new IllegalStateException("End token is not linked to begin token.");
     77                 }
     78                 return retval;
     79             }
     80         };
     81     }
     82 }
     83