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 getLine(size_t Offset) const;
size_t getColumn(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; size_t getLineCount() const;

View file

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

View file

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

View file

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