Skip to content

Commit a460b3b

Browse files
committed
Fix some bugs in print logic of CST nodes
1 parent 25928c2 commit a460b3b

File tree

4 files changed

+34
-21
lines changed

4 files changed

+34
-21
lines changed

include/bolt/CST.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ namespace bolt {
7777

7878
size_t getLine(size_t Offset) const;
7979
size_t getColumn(size_t Offset) const;
80-
size_t getStartOffset(size_t Line) const;
80+
size_t getStartOffsetOfLine(size_t Line) const;
81+
size_t getEndOffsetOfLine(size_t Line) const;
8182

8283
size_t getLineCount() const;
8384

include/bolt/DiagnosticEngine.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ namespace bolt {
174174

175175
void writeGutter(
176176
std::size_t GutterWidth,
177-
std::size_t Line
177+
std::string Text
178178
);
179179

180180
void writeHighlight(

src/CST.cc

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,22 @@ namespace bolt {
1919
}
2020

2121
size_t TextFile::getLineCount() const {
22-
return LineOffsets.size();
22+
return LineOffsets.size()-1;
2323
}
2424

25-
size_t TextFile::getStartOffset(size_t Line) const {
25+
size_t TextFile::getStartOffsetOfLine(size_t Line) const {
26+
ZEN_ASSERT(Line-1 < LineOffsets.size());
2627
return LineOffsets[Line-1];
2728
}
2829

30+
size_t TextFile::getEndOffsetOfLine(size_t Line) const {
31+
ZEN_ASSERT(Line <= LineOffsets.size());
32+
if (Line == LineOffsets.size()) {
33+
return Text.size();
34+
}
35+
return LineOffsets[Line];
36+
}
37+
2938
size_t TextFile::getLine(size_t Offset) const {
3039
ZEN_ASSERT(Offset < Text.size());
3140
for (size_t I = 0; I < LineOffsets.size(); ++I) {
@@ -38,7 +47,7 @@ namespace bolt {
3847

3948
size_t TextFile::getColumn(size_t Offset) const {
4049
auto Line = getLine(Offset);
41-
auto StartOffset = getStartOffset(Line);
50+
auto StartOffset = getStartOffsetOfLine(Line);
4251
return Offset - StartOffset + 1 ;
4352
}
4453

src/Diagnostics.cc

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -387,17 +387,17 @@ namespace bolt {
387387

388388
void ConsoleDiagnostics::writeGutter(
389389
std::size_t GutterWidth,
390-
std::size_t Line
390+
std::string Text
391391
) {
392-
auto LineNumberDigitCount = countDigits(Line);
393-
auto LeadingSpaces = GutterWidth - LineNumberDigitCount;
392+
ZEN_ASSERT(Text.size() <= GutterWidth);
393+
auto LeadingSpaces = GutterWidth - Text.size();
394394
Out << " ";
395395
setForegroundColor(Color::Black);
396396
setBackgroundColor(Color::White);
397397
for (std::size_t i = 0; i < LeadingSpaces; i++) {
398398
Out << ' ';
399399
}
400-
Out << Line;
400+
Out << Text;
401401
resetStyles();
402402
Out << " ";
403403
}
@@ -443,33 +443,36 @@ namespace bolt {
443443
Color HighlightColor
444444
) {
445445

446+
auto LineCount = File.getLineCount();
446447
auto Text = File.getText();
447448
auto StartPos = ToPrint.Start;
448449
auto EndPos = ToPrint.End;
449-
auto StartLine = StartPos.Line-1 > ExcerptLinesPre ? StartPos.Line - ExcerptLinesPost : 1;
450-
auto StartOffset = File.getStartOffset(StartLine);
451-
auto EndLine = std::min(File.getLineCount(), EndPos.Line + ExcerptLinesPost);
452-
auto EndOffset = File.getStartOffset(EndLine+1);
450+
auto StartLine = StartPos.Line-1 > ExcerptLinesPre ? StartPos.Line - ExcerptLinesPre : 1;
451+
auto StartOffset = File.getStartOffsetOfLine(StartLine);
452+
auto EndLine = std::min(LineCount, EndPos.Line + ExcerptLinesPost);
453+
auto EndOffset = File.getEndOffsetOfLine(EndLine);
453454
auto GutterWidth = std::max<std::size_t>(2, countDigits(EndLine+1));
454455
auto HighlightStart = ToHighlight.Start;
455456
auto HighlightEnd = ToHighlight.End;
456457
auto HighlightRange = TextRange { HighlightStart, HighlightEnd };
457458

458459
std::size_t CurrColumn = 1;
459460
std::size_t CurrLine = StartLine;
460-
writeGutter(GutterWidth, CurrLine);
461-
for (std::size_t i = StartOffset; i < EndOffset; i++) {
462-
auto C = Text[i];
463-
Out << C;
461+
bool AtBlankLine = true;
462+
for (std::size_t I = StartOffset; I < EndOffset; I++) {
463+
auto C = Text[I];
464+
if (AtBlankLine) {
465+
writeGutter(GutterWidth, std::to_string(CurrLine));
466+
}
464467
if (C == '\n') {
468+
Out << C;
465469
writeHighlight(GutterWidth, HighlightRange, HighlightColor, CurrLine, CurrColumn);
466-
if (CurrLine == EndLine && C == '\n') {
467-
break;
468-
}
469470
CurrLine++;
470-
writeGutter(GutterWidth, CurrLine);
471471
CurrColumn = 1;
472+
AtBlankLine = true;
472473
} else {
474+
AtBlankLine = false;
475+
Out << C;
473476
CurrColumn++;
474477
}
475478
}

0 commit comments

Comments
 (0)