This commit is contained in:
nub31
2025-11-03 17:10:15 +01:00
parent 7d49bf43b7
commit 47fef6bc9f
7 changed files with 175 additions and 210 deletions

View File

@@ -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)
{