add a util DiagnosticSink
This commit is contained in:
parent
296fe06f07
commit
176a3f7587
@ -1,4 +1,92 @@
|
|||||||
package p.studio.compiler.source.diagnostics;
|
package p.studio.compiler.source.diagnostics;
|
||||||
|
|
||||||
public class DiagnosticSink {
|
import p.studio.compiler.source.Span;
|
||||||
|
import p.studio.utilities.structures.ReadOnlyCollection;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class DiagnosticSink extends ReadOnlyCollection<Diagnostic> {
|
||||||
|
private int errorCount = 0;
|
||||||
|
private int warningCount = 0;
|
||||||
|
|
||||||
|
protected DiagnosticSink() {
|
||||||
|
super(new ArrayList<>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DiagnosticSink empty() {
|
||||||
|
return new DiagnosticSink();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticSink report(final Diagnostic diagnostic) {
|
||||||
|
Objects.requireNonNull(diagnostic);
|
||||||
|
if (diagnostic.getSeverity().isError()) {
|
||||||
|
errorCount++;
|
||||||
|
} else {
|
||||||
|
warningCount++;
|
||||||
|
}
|
||||||
|
collection.add(diagnostic);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticSink report(
|
||||||
|
final Severity severity,
|
||||||
|
final String code,
|
||||||
|
final String message,
|
||||||
|
final Span span) {
|
||||||
|
return report(severity, code, message, span, List.of());
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticSink report(
|
||||||
|
final Severity severity,
|
||||||
|
final String code,
|
||||||
|
final String message,
|
||||||
|
final Span span,
|
||||||
|
final List<RelatedSpan> related) {
|
||||||
|
return report(new Diagnostic(
|
||||||
|
Objects.requireNonNull(severity),
|
||||||
|
Objects.requireNonNull(code),
|
||||||
|
Objects.requireNonNull(message),
|
||||||
|
Objects.requireNonNull(span),
|
||||||
|
List.copyOf(Objects.requireNonNull(related))));
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticSink error(
|
||||||
|
final String code,
|
||||||
|
final String message,
|
||||||
|
final Span span) {
|
||||||
|
return report(Severity.Error, code, message, span);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticSink warning(
|
||||||
|
final String code,
|
||||||
|
final String message,
|
||||||
|
final Span span) {
|
||||||
|
return report(Severity.Warning, code, message, span);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DiagnosticSink merge(final DiagnosticSink diagnostics) {
|
||||||
|
Objects.requireNonNull(diagnostics);
|
||||||
|
for (final Diagnostic diagnostic : diagnostics) {
|
||||||
|
report(diagnostic);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasErrors() {
|
||||||
|
return errorCount > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean hasWarnings() {
|
||||||
|
return warningCount > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int errorCount() {
|
||||||
|
return errorCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int warningCount() {
|
||||||
|
return warningCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,42 @@
|
|||||||
|
package p.studio.compiler.source.diagnostics;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import p.studio.compiler.source.Span;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
class DiagnosticSinkTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldReportAndCountDiagnostics() {
|
||||||
|
final var sink = DiagnosticSink.empty();
|
||||||
|
|
||||||
|
sink.error("E001", "Unknown symbol", Span.none());
|
||||||
|
sink.warning("W001", "Unused declaration", Span.none());
|
||||||
|
|
||||||
|
assertEquals(2, sink.size());
|
||||||
|
assertTrue(sink.hasErrors());
|
||||||
|
assertTrue(sink.hasWarnings());
|
||||||
|
assertEquals(1, sink.errorCount());
|
||||||
|
assertEquals(1, sink.warningCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldMergeDiagnostics() {
|
||||||
|
final var a = DiagnosticSink.empty()
|
||||||
|
.warning("W010", "Unused import", Span.none());
|
||||||
|
final var b = DiagnosticSink.empty()
|
||||||
|
.error("E999", "Invalid type", Span.none());
|
||||||
|
|
||||||
|
a.merge(b);
|
||||||
|
|
||||||
|
assertEquals(2, a.size());
|
||||||
|
assertTrue(a.hasErrors());
|
||||||
|
assertTrue(a.hasWarnings());
|
||||||
|
assertEquals(1, a.errorCount());
|
||||||
|
assertEquals(1, a.warningCount());
|
||||||
|
assertEquals(1, b.errorCount());
|
||||||
|
assertEquals(0, b.warningCount());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user