/*******************************************************************************
* Copyright (c) 2008, 2017 xored software, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Andrei Sobolev)
*******************************************************************************/
package org.eclipse.dltk.tcl.parser;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.dltk.compiler.problem.DefaultProblem;
import org.eclipse.dltk.compiler.problem.IProblemReporter;
import org.eclipse.dltk.compiler.problem.ProblemSeverity;
import org.eclipse.dltk.core.builder.ISourceLineTracker;
public class TclErrorCollector implements ITclErrorReporter {
private Set<TclError> errors = new HashSet<>();
@Override
public void report(int code, String message, String[] extraMessage,
int start, int end, ProblemSeverity kind) {
boolean insertNewError = true;
TclError errorToReplace = null;
for (TclError error : errors) {
if (error.getStart() == start && error.getEnd() == end) {
if (error.getCode() < code) {
errorToReplace = error;
break;
} else {
insertNewError = false;
break;
}
}
}
if (errorToReplace != null)
errors.remove(errorToReplace);
if (insertNewError)
errors.add(new TclError(code, message, extraMessage, start, end,
kind));
}
public void report(TclError e) {
boolean insertNewError = true;
TclError errorToReplace = null;
int start = e.getStart();
int end = e.getEnd();
int code = e.getCode();
for (TclError error : errors) {
if (error.getStart() == start && error.getEnd() == end) {
if (error.getCode() < code) {
errorToReplace = error;
break;
} else {
insertNewError = false;
break;
}
}
}
if (errorToReplace != null)
errors.remove(errorToReplace);
if (insertNewError)
errors.add(e);
}
public void addAll(TclErrorCollector collector) {
for (TclError e : collector.errors) {
report(e);
}
}
public void reportAll(ITclErrorReporter reporter) {
if (reporter != null) {
for (TclError error : this.errors) {
reporter.report(error.getCode(), error.getMessage(),
error.getExtraArguments(), error.getStart(),
error.getEnd(), error.getErrorKind());
}
}
}
public void reportAll(final IProblemReporter reporter,
final ISourceLineTracker tracker) {
reportAll((code, message, extraMessage, start, end,
kind) -> reporter.reportProblem(new DefaultProblem(message,
code, extraMessage, kind, start, end,
tracker.getLineNumberOfOffset(start))));
}
public int getCount() {
return this.errors.size();
}
public TclError[] getErrors() {
return this.errors.toArray(new TclError[this.errors.size()]);
}
}