CommonSource.java

package edu.udel.cis.vsl.abc.token.common;

import java.io.PrintStream;
import java.util.Iterator;

import edu.udel.cis.vsl.abc.token.IF.CivlcToken;
import edu.udel.cis.vsl.abc.token.IF.Source;
import edu.udel.cis.vsl.abc.token.IF.TokenUtils;

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) {
		return TokenUtils.summarizeRangeLocation(firstToken, lastToken,
				abbreviated);
	}

	@Override
	public String getSummary(boolean abbreviated, boolean isException) {
		return TokenUtils.summarizeRange(firstToken, lastToken, abbreviated,
				isException);
	}

	@Override
	public String getContent(boolean abbreviated) {
		return TokenUtils.contentOfRange(firstToken, lastToken, abbreviated);
	}
}

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();
	}
}