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 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;
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
15
src/CST.cc
15
src/CST.cc
|
@ -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 ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue