package de.skuzzle.polly.core.parser.problems;
import java.util.Collection;
import java.util.SortedSet;
import java.util.TreeSet;
import de.skuzzle.polly.core.parser.ParseException;
import de.skuzzle.polly.core.parser.Position;
import de.skuzzle.polly.core.parser.Token;
import de.skuzzle.polly.core.parser.TokenType;
import de.skuzzle.polly.core.parser.ast.declarations.types.Type;
import de.skuzzle.polly.core.parser.ast.visitor.ASTTraversalException;
/**
* Problem reporter implementation that supports multiple problems.
*
* @author Simon Taddiken
*/
public class MultipleProblemReporter implements ProblemReporter {
protected final SortedSet<Problem> problems;
protected final Position clipping;
public MultipleProblemReporter() {
this(new TreeSet<MultipleProblemReporter.Problem>(), null);
}
protected MultipleProblemReporter(SortedSet<Problem> problems, Position clipping) {
this.problems = problems;
this.clipping = clipping;
}
protected Position clip(Position pos) {
return this.clipping == null ? pos : (pos.isInside(clipping) ? pos : clipping);
}
@Override
public ProblemReporter subReporter(Position clipping) {
return new MultipleProblemReporter(this.problems, clipping);
}
/**
* Gets a list of all reported problems.
*
* @return List of problems.
*/
public Collection<Problem> getProblems() {
return this.problems;
}
@Override
public boolean hasProblems() {
return !this.problems.isEmpty();
}
@Override
public Collection<Position> problemPositions() {
final SortedSet<Position> result = new TreeSet<Position>();
for (final Problem problem : this.problems) {
result.add(problem.getPosition());
}
return result;
}
@Override
public void lexicalProblem(String problem, Position position)
throws ParseException {
this.problems.add(new Problem(LEXICAL, this.clip(position), problem));
}
@Override
public void syntaxProblem(String problem, Position position, Object...params)
throws ParseException {
this.problems.add(new Problem(SYNTACTICAL, this.clip(position),
Problems.format(problem, params)));
}
@Override
public void syntaxProblem(TokenType expected, Token occurred, Position position)
throws ParseException {
this.problems.add(new Problem(SYNTACTICAL, this.clip(position),
Problems.format(Problems.UNEXPECTED_TOKEN, occurred.toString(false, false),
expected.toString())));
}
@Override
public void semanticProblem(String problem, Position position, Object...params)
throws ParseException {
this.problems.add(new Problem(SEMATICAL, this.clip(position),
Problems.format(problem, params)));
}
@Override
public void typeProblem(Type expected, Type occurred, Position position)
throws ASTTraversalException {
this.problems.add(new Problem(SEMATICAL, this.clip(position),
Problems.format(Problems.TYPE_ERROR, expected.getName(), occurred.getName())));
}
@Override
public void runtimeProblem(String problem, Position position, Object... params)
throws ASTTraversalException {
this.problems.add(new Problem(RUNTIME, this.clip(position),
Problems.format(problem, params)));
}
}