module analysis.output; import std.stdio; import std.algorithm; import stdx.d.lexer; import analysis.base; import analysis.linespan; import highlighter; void writeWhitespace(File file, string text, ref uint line, MessageSet messages, ref const LineSpans spans) { foreach (char c; text) { if (c == '\r') continue; else if (c == '\n') { if (spans.containsLine(line)) file.write("\n"); foreach (message; messages[].filter!(a => a.line == line - 1)) writeMessage(file, message); bool prevWasVisible = false; if (spans.containsLine(line)) { prevWasVisible = true; file.writef("%d", line); } line++; if (!spans.containsLine(line) && prevWasVisible) file.writeln("
"); } else if (spans.containsLine(line)) { if (c == '\t') file.write(" "); else file.write(c); } } } void writeStrOrCom(File file, string text, string cssClass, ref uint line, ref const LineSpans spans) { file.write(""); foreach (char c; text) { if (c == '\r') continue; else if (c == '\n') { bool prevWasVisible = false; if (spans.containsLine(line)) { prevWasVisible = true; file.writef("\n%d", line, cssClass); } line++; if (!spans.containsLine(line) && prevWasVisible) file.writeln(""); } else if (spans.containsLine(line)) { if (c == '<') file.write("<"); else if (c == '&') file.write("&"); else file.write(c); } } file.write(""); } void writeToken(File file, ref const Token t, ref uint line, MessageSet messages, ref const LineSpans spans) { if (t == tok!"whitespace") writeWhitespace(file, t.text, line, messages, spans); else if (t.type == tok!"comment") writeStrOrCom(file, t.text, "com", line, spans); else if (isStringLiteral(t.type) || t.type == tok!"characterLiteral") writeStrOrCom(file, t.text, "str", line, spans); else if (spans.containsLine(line)) { if (isBasicType(t.type)) file.writeSpan("type", str(t.type)); else if (isKeyword(t.type)) file.writeSpan("kwrd", str(t.type)); else if (isNumberLiteral(t.type)) file.writeSpan("num", t.text); else if (isOperator(t.type)) file.writeSpan("op", str(t.type)); else file.write(t.text); } } void writeMessage(File file, ref const Message message) { file.write("");
uint currentLine = 2;
LineSpans ls = generateLineSpans(messageSet);
if (ls.containsLine(1))
file.write("1");
foreach (token; tokens)
{
writeToken(file, token, currentLine, messageSet, ls);
}
file.writeln("
");
file.writeln("File | Warning Count |
---|---|
", fileName, " | ", warningCount, " |