Fix some bugs in print logic of CST nodes

This commit is contained in:
Sam Vervaeck 2023-05-31 15:05:47 +02:00
parent 25928c288b
commit a460b3b28a
Signed by: samvv
SSH key fingerprint: SHA256:dIg0ywU1OP+ZYifrYxy8c5esO72cIKB+4/9wkZj1VaY
4 changed files with 34 additions and 21 deletions

View file

@ -77,7 +77,8 @@ namespace bolt {
size_t getLine(size_t Offset) const;
size_t getColumn(size_t Offset) const;
size_t getStartOffset(size_t Line) const;
size_t getStartOffsetOfLine(size_t Line) const;
size_t getEndOffsetOfLine(size_t Line) const;
size_t getLineCount() const;

View file

@ -174,7 +174,7 @@ namespace bolt {
void writeGutter(
std::size_t GutterWidth,
std::size_t Line
std::string Text
);
void writeHighlight(

View file

@ -19,13 +19,22 @@ namespace bolt {
}
size_t TextFile::getLineCount() const {
return LineOffsets.size();
return LineOffsets.size()-1;
}
size_t TextFile::getStartOffset(size_t Line) const {
size_t TextFile::getStartOffsetOfLine(size_t Line) const {
ZEN_ASSERT(Line-1 < LineOffsets.size());
return LineOffsets[Line-1];
}
size_t TextFile::getEndOffsetOfLine(size_t Line) const {
ZEN_ASSERT(Line <= LineOffsets.size());
if (Line == LineOffsets.size()) {
return Text.size();
}
return LineOffsets[Line];
}
size_t TextFile::getLine(size_t Offset) const {
ZEN_ASSERT(Offset < Text.size());
for (size_t I = 0; I < LineOffsets.size(); ++I) {
@ -38,7 +47,7 @@ namespace bolt {
size_t TextFile::getColumn(size_t Offset) const {
auto Line = getLine(Offset);
auto StartOffset = getStartOffset(Line);
auto StartOffset = getStartOffsetOfLine(Line);
return Offset - StartOffset + 1 ;
}

View file

@ -387,17 +387,17 @@ namespace bolt {
void ConsoleDiagnostics::writeGutter(
std::size_t GutterWidth,
std::size_t Line
std::string Text
) {
auto LineNumberDigitCount = countDigits(Line);
auto LeadingSpaces = GutterWidth - LineNumberDigitCount;
ZEN_ASSERT(Text.size() <= GutterWidth);
auto LeadingSpaces = GutterWidth - Text.size();
Out << " ";
setForegroundColor(Color::Black);
setBackgroundColor(Color::White);
for (std::size_t i = 0; i < LeadingSpaces; i++) {
Out << ' ';
}
Out << Line;
Out << Text;
resetStyles();
Out << " ";
}
@ -443,13 +443,14 @@ namespace bolt {
Color HighlightColor
) {
auto LineCount = File.getLineCount();
auto Text = File.getText();
auto StartPos = ToPrint.Start;
auto EndPos = ToPrint.End;
auto StartLine = StartPos.Line-1 > ExcerptLinesPre ? StartPos.Line - ExcerptLinesPost : 1;
auto StartOffset = File.getStartOffset(StartLine);
auto EndLine = std::min(File.getLineCount(), EndPos.Line + ExcerptLinesPost);
auto EndOffset = File.getStartOffset(EndLine+1);
auto StartLine = StartPos.Line-1 > ExcerptLinesPre ? StartPos.Line - ExcerptLinesPre : 1;
auto StartOffset = File.getStartOffsetOfLine(StartLine);
auto EndLine = std::min(LineCount, EndPos.Line + ExcerptLinesPost);
auto EndOffset = File.getEndOffsetOfLine(EndLine);
auto GutterWidth = std::max<std::size_t>(2, countDigits(EndLine+1));
auto HighlightStart = ToHighlight.Start;
auto HighlightEnd = ToHighlight.End;
@ -457,19 +458,21 @@ namespace bolt {
std::size_t CurrColumn = 1;
std::size_t CurrLine = StartLine;
writeGutter(GutterWidth, CurrLine);
for (std::size_t i = StartOffset; i < EndOffset; i++) {
auto C = Text[i];
Out << C;
bool AtBlankLine = true;
for (std::size_t I = StartOffset; I < EndOffset; I++) {
auto C = Text[I];
if (AtBlankLine) {
writeGutter(GutterWidth, std::to_string(CurrLine));
}
if (C == '\n') {
Out << C;
writeHighlight(GutterWidth, HighlightRange, HighlightColor, CurrLine, CurrColumn);
if (CurrLine == EndLine && C == '\n') {
break;
}
CurrLine++;
writeGutter(GutterWidth, CurrLine);
CurrColumn = 1;
AtBlankLine = true;
} else {
AtBlankLine = false;
Out << C;
CurrColumn++;
}
}