CommonSource.java
package dev.civl.abc.token.common;
import java.io.PrintStream;
import java.util.Iterator;
import dev.civl.abc.token.IF.CivlcToken;
import dev.civl.abc.token.IF.Source;
import dev.civl.abc.token.IF.SourceFormatter;
public class CommonSource implements Source {
private CivlcToken firstToken;
private CivlcToken lastToken;
public CommonSource(CivlcToken firstToken, CivlcToken lastToken) {
if (firstToken == null)
throw new IllegalArgumentException("Null firstToken");
if (lastToken == null)
throw new IllegalArgumentException("Null lastToken");
int first = firstToken.getIndex();
int last = lastToken.getIndex();
if (last < first)
throw new IllegalArgumentException("Last token precedes first:\n"
+ firstToken + "\n" + lastToken);
this.firstToken = firstToken;
this.lastToken = lastToken;
}
@Override
public CivlcToken getFirstToken() {
return firstToken;
}
@Override
public CivlcToken getLastToken() {
return lastToken;
}
@Override
public Iterator<CivlcToken> tokens() {
return new SourceTokenIterator(firstToken, lastToken);
}
@Override
public int getNumTokens() {
return lastToken.getIndex() - firstToken.getIndex() + 1;
}
@Override
public String toString() {
return getSummary(false, false);
}
@Override
public void print(PrintStream out) {
out.print(getSummary(false, false));
}
@Override
public String getLocation(boolean abbreviated) {
if (firstToken.getIndex() < 0)
return "";
SourceFormatter formatter = new SourceFormatter(firstToken, lastToken);
return formatter.getLocator(abbreviated);
}
@Override
public String getSummary(boolean abbreviated, boolean multiline) {
SourceFormatter formatter = new SourceFormatter(firstToken, lastToken);
if (!multiline)
return formatter.getShortString(abbreviated);
else {
StringBuffer buf = new StringBuffer();
formatter.getDetailedReport(buf);
return buf.toString();
}
}
@Override
public String getContent(boolean abbreviated) {
SourceFormatter formatter = new SourceFormatter(firstToken, lastToken);
return formatter.getContent();
}
}
class SourceTokenIterator implements Iterator<CivlcToken> {
CivlcToken nextToken;
CivlcToken last;
SourceTokenIterator(CivlcToken firstToken, CivlcToken lastToken) {
nextToken = firstToken;
last = lastToken;
}
public CivlcToken next() {
CivlcToken result = nextToken;
if (nextToken == last)
nextToken = null;
else
nextToken = nextToken.getNext();
return result;
}
public boolean hasNext() {
return nextToken != null;
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}