...
This commit is contained in:
@@ -11,6 +11,7 @@ public class Diagnostic
|
||||
private readonly string _message;
|
||||
private SourceSpan? _span;
|
||||
private string? _help;
|
||||
private List<Token>? _tokens;
|
||||
|
||||
public DiagnosticBuilder(DiagnosticSeverity severity, string message)
|
||||
{
|
||||
@@ -18,18 +19,32 @@ public class Diagnostic
|
||||
_message = message;
|
||||
}
|
||||
|
||||
public DiagnosticBuilder At(SyntaxNode? node)
|
||||
public DiagnosticBuilder At(SyntaxNode? node, List<Token>? tokens = null)
|
||||
{
|
||||
if (tokens != null)
|
||||
{
|
||||
_tokens = tokens;
|
||||
}
|
||||
|
||||
if (node != null)
|
||||
{
|
||||
_span = SourceSpan.Merge(node.Tokens.Select(x => x.Span));
|
||||
var first = node.Tokens.FirstOrDefault();
|
||||
if (first != null)
|
||||
{
|
||||
_span = SourceSpan.Merge(node.Tokens.Select(x => x.Span));
|
||||
}
|
||||
}
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
public DiagnosticBuilder At(Token? token)
|
||||
public DiagnosticBuilder At(Token? token, List<Token>? tokens = null)
|
||||
{
|
||||
if (tokens != null)
|
||||
{
|
||||
_tokens = tokens;
|
||||
}
|
||||
|
||||
if (token != null)
|
||||
{
|
||||
At(token.Span);
|
||||
@@ -48,11 +63,11 @@ public class Diagnostic
|
||||
return this;
|
||||
}
|
||||
|
||||
public DiagnosticBuilder At(string filePath, int line, int column)
|
||||
{
|
||||
_span = new SourceSpan(filePath, new SourceLocation(line, column), new SourceLocation(line, column));
|
||||
return this;
|
||||
}
|
||||
// public DiagnosticBuilder At(string filePath, int line, int column)
|
||||
// {
|
||||
// _span = new SourceSpan(filePath, new SourceLocation(line, column), new SourceLocation(line, column));
|
||||
// return this;
|
||||
// }
|
||||
|
||||
public DiagnosticBuilder WithHelp(string help)
|
||||
{
|
||||
@@ -60,20 +75,23 @@ public class Diagnostic
|
||||
return this;
|
||||
}
|
||||
|
||||
public Diagnostic Build() => new(_severity, _message, _help, _span);
|
||||
public Diagnostic Build() => new(_severity, _message, _help, _span, _tokens);
|
||||
}
|
||||
|
||||
public static DiagnosticBuilder Error(string message) => new(DiagnosticSeverity.Error, message);
|
||||
public static DiagnosticBuilder Warning(string message) => new(DiagnosticSeverity.Warning, message);
|
||||
public static DiagnosticBuilder Info(string message) => new(DiagnosticSeverity.Info, message);
|
||||
|
||||
private readonly List<Token>? _tokens;
|
||||
|
||||
public DiagnosticSeverity Severity { get; }
|
||||
public string Message { get; }
|
||||
public string? Help { get; }
|
||||
public SourceSpan? Span { get; }
|
||||
|
||||
private Diagnostic(DiagnosticSeverity severity, string message, string? help, SourceSpan? span)
|
||||
private Diagnostic(DiagnosticSeverity severity, string message, string? help, SourceSpan? span, List<Token>? tokens)
|
||||
{
|
||||
_tokens = tokens;
|
||||
Severity = severity;
|
||||
Message = message;
|
||||
Help = help;
|
||||
@@ -103,15 +121,12 @@ public class Diagnostic
|
||||
if (Span.HasValue)
|
||||
{
|
||||
sb.AppendLine();
|
||||
var text = File.ReadAllText(Span.Value.FilePath);
|
||||
|
||||
var tokenizer = new Tokenizer();
|
||||
var tokens = tokenizer.Tokenize(Span.Value.FilePath, text);
|
||||
var text = Span.Value.Source;
|
||||
|
||||
var lines = text.Split('\n');
|
||||
|
||||
var startLine = Span.Value.Start.Line;
|
||||
var endLine = Span.Value.End.Line;
|
||||
var startLine = Span.Value.StartLine;
|
||||
var endLine = Span.Value.EndLine;
|
||||
|
||||
const int CONTEXT_LINES = 3;
|
||||
|
||||
@@ -144,8 +159,15 @@ public class Diagnostic
|
||||
sb.Append("│ ");
|
||||
sb.Append(i.ToString().PadRight(numberPadding));
|
||||
sb.Append(" │ ");
|
||||
sb.Append(ApplySyntaxHighlighting(line.PadRight(codePadding), i, tokens));
|
||||
// sb.Append(line.PadRight(codePadding));
|
||||
if (_tokens != null)
|
||||
{
|
||||
sb.Append(ApplySyntaxHighlighting(line.PadRight(codePadding), i, _tokens));
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append(line.PadRight(codePadding));
|
||||
}
|
||||
|
||||
sb.Append(" │");
|
||||
sb.AppendLine();
|
||||
|
||||
@@ -156,12 +178,12 @@ public class Diagnostic
|
||||
|
||||
if (i == startLine)
|
||||
{
|
||||
markerStartColumn = Span.Value.Start.Column;
|
||||
markerStartColumn = Span.Value.StartColumn;
|
||||
}
|
||||
|
||||
if (i == endLine)
|
||||
{
|
||||
markerEndColumn = Span.Value.End.Column;
|
||||
markerEndColumn = Span.Value.EndColumn;
|
||||
}
|
||||
|
||||
var markerLength = markerEndColumn - markerStartColumn;
|
||||
@@ -206,8 +228,8 @@ public class Diagnostic
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
var lineTokens = tokens
|
||||
.Where(t => t.Span.Start.Line == lineNumber)
|
||||
.OrderBy(t => t.Span.Start.Column)
|
||||
.Where(t => t.Span.StartLine == lineNumber)
|
||||
.OrderBy(t => t.Span.StartColumn)
|
||||
.ToList();
|
||||
|
||||
if (lineTokens.Count == 0)
|
||||
@@ -219,8 +241,10 @@ public class Diagnostic
|
||||
|
||||
foreach (var token in lineTokens)
|
||||
{
|
||||
var tokenStart = token.Span.Start.Column;
|
||||
var tokenEnd = token.Span.End.Column;
|
||||
if (token is WhitespaceToken) continue;
|
||||
|
||||
var tokenStart = token.Span.StartColumn;
|
||||
var tokenEnd = token.Span.EndColumn;
|
||||
|
||||
if (tokenStart > currentColumn && currentColumn - 1 < line.Length)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user