Fix some bugs in print logic of CST nodes
This commit is contained in:
parent
25928c288b
commit
a460b3b28a
4 changed files with 34 additions and 21 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -174,7 +174,7 @@ namespace bolt {
|
|||
|
||||
void writeGutter(
|
||||
std::size_t GutterWidth,
|
||||
std::size_t Line
|
||||
std::string Text
|
||||
);
|
||||
|
||||
void writeHighlight(
|
||||
|
|
15
src/CST.cc
15
src/CST.cc
|
@ -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 ;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
if (C == '\n') {
|
||||
writeHighlight(GutterWidth, HighlightRange, HighlightColor, CurrLine, CurrColumn);
|
||||
if (CurrLine == EndLine && C == '\n') {
|
||||
break;
|
||||
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);
|
||||
CurrLine++;
|
||||
writeGutter(GutterWidth, CurrLine);
|
||||
CurrColumn = 1;
|
||||
AtBlankLine = true;
|
||||
} else {
|
||||
AtBlankLine = false;
|
||||
Out << C;
|
||||
CurrColumn++;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue