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