Fix diagnostic print

This commit is contained in:
nub31
2025-10-20 19:07:08 +02:00
parent b71e10f55b
commit 7697f7b7cc
3 changed files with 116 additions and 104 deletions

View File

@@ -81,8 +81,6 @@ public class Diagnostic
} }
public string FormatANSI() public string FormatANSI()
{
try
{ {
var sb = new StringBuilder(); var sb = new StringBuilder();
@@ -107,6 +105,9 @@ public class Diagnostic
sb.AppendLine(); sb.AppendLine();
var text = File.ReadAllText(Span.Value.FilePath); var text = File.ReadAllText(Span.Value.FilePath);
var tokenizer = new Tokenizer(Span.Value.FilePath, text);
tokenizer.Tokenize();
var lines = text.Split('\n'); var lines = text.Split('\n');
var startLine = Span.Value.Start.Line; var startLine = Span.Value.Start.Line;
@@ -118,7 +119,16 @@ public class Diagnostic
var contextEndLine = Math.Min(lines.Length, endLine + CONTEXT_LINES); var contextEndLine = Math.Min(lines.Length, endLine + CONTEXT_LINES);
var numberPadding = contextEndLine.ToString().Length; var numberPadding = contextEndLine.ToString().Length;
var codePadding = lines.Skip(contextStartLine - 1).Take(contextEndLine - contextStartLine + 1).Max(x => x.Length);
var codePadding = 0;
for (var i = contextStartLine - 1; i < contextEndLine && i < lines.Length; i++)
{
var lineLength = lines[i].Length;
if (lineLength > codePadding)
{
codePadding = lineLength;
}
}
sb.Append('╭'); sb.Append('╭');
sb.Append(new string('─', numberPadding + 2)); sb.Append(new string('─', numberPadding + 2));
@@ -127,9 +137,6 @@ public class Diagnostic
sb.Append('╮'); sb.Append('╮');
sb.AppendLine(); sb.AppendLine();
var tokenizer = new Tokenizer(Span.Value.FilePath, text);
tokenizer.Tokenize();
for (var i = contextStartLine; i <= contextEndLine; i++) for (var i = contextStartLine; i <= contextEndLine; i++)
{ {
var line = lines[i - 1]; var line = lines[i - 1];
@@ -138,6 +145,7 @@ public class Diagnostic
sb.Append(i.ToString().PadRight(numberPadding)); sb.Append(i.ToString().PadRight(numberPadding));
sb.Append(" │ "); sb.Append(" │ ");
sb.Append(ApplySyntaxHighlighting(line.PadRight(codePadding), i, tokenizer.Tokens)); sb.Append(ApplySyntaxHighlighting(line.PadRight(codePadding), i, tokenizer.Tokens));
// sb.Append(line.PadRight(codePadding));
sb.Append(" │"); sb.Append(" │");
sb.AppendLine(); sb.AppendLine();
@@ -148,12 +156,12 @@ public class Diagnostic
if (i == startLine) if (i == startLine)
{ {
markerStartColumn = Math.Min(Span.Value.Start.Column, 1); markerStartColumn = Span.Value.Start.Column;
} }
if (i == endLine) if (i == endLine)
{ {
markerEndColumn = Math.Min(Span.Value.End.Column, line.Length); markerEndColumn = Span.Value.End.Column;
} }
var markerLength = markerEndColumn - markerStartColumn; var markerLength = markerEndColumn - markerStartColumn;
@@ -172,7 +180,7 @@ public class Diagnostic
sb.Append(" │ "); sb.Append(" │ ");
sb.Append(new string(' ', markerStartColumn - 1)); sb.Append(new string(' ', markerStartColumn - 1));
sb.Append(ConsoleColors.Colorize(marker, markerColor)); sb.Append(ConsoleColors.Colorize(marker, markerColor));
sb.Append(new string(' ', codePadding - markerEndColumn + 1)); sb.Append(new string(' ', codePadding - (markerStartColumn - 1) - markerLength));
sb.Append(" │"); sb.Append(" │");
sb.AppendLine(); sb.AppendLine();
} }
@@ -193,11 +201,6 @@ public class Diagnostic
return sb.ToString(); return sb.ToString();
} }
catch (Exception)
{
return ConsoleColors.Colorize("Failed to generate error message", ConsoleColors.Red);
}
}
private static string ApplySyntaxHighlighting(string line, int lineNumber, List<Token> tokens) private static string ApplySyntaxHighlighting(string line, int lineNumber, List<Token> tokens)
{ {
@@ -219,25 +222,34 @@ public class Diagnostic
var tokenStart = token.Span.Start.Column; var tokenStart = token.Span.Start.Column;
var tokenEnd = token.Span.End.Column; var tokenEnd = token.Span.End.Column;
if (tokenStart > currentColumn) if (tokenStart > currentColumn && currentColumn - 1 < line.Length)
{ {
var beforeToken = line.Substring(currentColumn - 1, tokenStart - currentColumn); var beforeLength = Math.Min(tokenStart - currentColumn, line.Length - (currentColumn - 1));
if (beforeLength > 0)
{
var beforeToken = line.Substring(currentColumn - 1, beforeLength);
sb.Append(beforeToken); sb.Append(beforeToken);
} }
}
var tokenLength = tokenEnd - tokenStart; var tokenLength = tokenEnd - tokenStart;
if (tokenStart - 1 + tokenLength <= line.Length) if (tokenStart >= 1 && tokenStart - 1 < line.Length && tokenLength > 0)
{ {
var tokenText = line.Substring(tokenStart - 1, tokenLength); var availableLength = line.Length - (tokenStart - 1);
var actualLength = Math.Min(tokenLength, availableLength);
if (actualLength > 0)
{
var tokenText = line.Substring(tokenStart - 1, actualLength);
var coloredToken = ColorizeToken(token, tokenText); var coloredToken = ColorizeToken(token, tokenText);
sb.Append(coloredToken); sb.Append(coloredToken);
} }
}
currentColumn = tokenEnd; currentColumn = tokenEnd;
} }
if (currentColumn <= line.Length) if (currentColumn - 1 < line.Length)
{ {
var remaining = line[(currentColumn - 1)..]; var remaining = line[(currentColumn - 1)..];
sb.Append(remaining); sb.Append(remaining);

View File

@@ -90,23 +90,23 @@ public sealed class Tokenizer
{ {
try try
{ {
// Skip whitespace and increment line counter if newline
var current = Peek()!.Value; var current = Peek()!.Value;
if (char.IsWhiteSpace(current)) if (char.IsWhiteSpace(current))
{ {
if (current is '\n') if (current is '\n')
{ {
_line += 1; _line += 1;
_column = 1; // note(nub31): Next increments the column, so 0 is correct here
_column = 0;
} }
Next(); Next();
continue; continue;
} }
// Skip single line comments but keep newline so next iteration increments the line counter
if (current == '/' && Peek(1) == '/') if (current == '/' && Peek(1) == '/')
{ {
// note(nub31): Keep newline so next iteration increments the line counter
while (Peek() is not '\n') while (Peek() is not '\n')
{ {
Next(); Next();

View File

@@ -4,7 +4,7 @@ module "main"
extern "main" func main(args: []cstring): i64 extern "main" func main(args: []cstring): i64
{ {
raylib::SetConfigFlags(4 | 64) raylib: :SetConfigFlags(4 | 64)
raylib::InitWindow(1600, 900, "Hi from nub-lang") raylib::InitWindow(1600, 900, "Hi from nub-lang")
defer raylib::CloseWindow() defer raylib::CloseWindow()