Skip to content

Commit

Permalink
LibJS: Optimize source_location_hint and add flag in print_errors
Browse files Browse the repository at this point in the history
This optimizes the algorithm used in source_location_hint and adds a
flag to not print hints in print_errors.
  • Loading branch information
ElectrodeYT authored and gunnarbeutner committed Jul 20, 2021
1 parent 2ce8cca commit e3fa32b
Showing 1 changed file with 25 additions and 12 deletions.
37 changes: 25 additions & 12 deletions Userland/Libraries/LibJS/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,15 +107,26 @@ class Parser {
{
if (!position.has_value())
return {};
// We need to modify the source to match what the lexer considers one line - normalizing
// line terminators to \n is easier than splitting using all different LT characters.
String source_string { source };
source_string.replace("\r\n", "\n");
source_string.replace("\r", "\n");
source_string.replace(LINE_SEPARATOR, "\n");
source_string.replace(PARAGRAPH_SEPARATOR, "\n");

StringBuilder builder;
builder.append(source_string.split_view('\n', true)[position.value().line - 1]);
String source_string { source };
GenericLexer lexer(source_string);
// Skip to the line we want
size_t current_line = 0;
while (current_line < position.value().line - 1) {
if (lexer.consume_specific("\n") || lexer.consume_specific("\r\n") || lexer.consume_specific(LINE_SEPARATOR) || lexer.consume_specific(PARAGRAPH_SEPARATOR))
current_line++;
else
lexer.ignore();
VERIFY(!lexer.is_eof());
}
// We are at the line, now add the chars to the string
while (!lexer.is_eof()) {
if (lexer.consume_specific("\n") || lexer.consume_specific("\r\n") || lexer.consume_specific(LINE_SEPARATOR) || lexer.consume_specific(PARAGRAPH_SEPARATOR))
break;
else
builder.append(lexer.consume());
}
builder.append('\n');
for (size_t i = 0; i < position.value().column - 1; ++i)
builder.append(spacer);
Expand All @@ -126,12 +137,14 @@ class Parser {

bool has_errors() const { return m_state.errors.size(); }
const Vector<Error>& errors() const { return m_state.errors; }
void print_errors() const
void print_errors(bool print_hint = true) const
{
for (auto& error : m_state.errors) {
auto hint = error.source_location_hint(m_state.lexer.source());
if (!hint.is_empty())
warnln("{}", hint);
if (print_hint) {
auto hint = error.source_location_hint(m_state.lexer.source());
if (!hint.is_empty())
warnln("{}", hint);
}
warnln("SyntaxError: {}", error.to_string());
}
}
Expand Down

0 comments on commit e3fa32b

Please sign in to comment.