summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS/Parser.h
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-11-23 12:39:23 +0100
committerLinus Groh <mail@linusgroh.de>2022-11-23 16:05:59 +0000
commite6331031c4cab0c29dfe6b4ae52940100eb11ff2 (patch)
tree2a98e599b05bfb5bbc987f3d98cd39801c4a2421 /Userland/Libraries/LibJS/Parser.h
parente0916dbb359d6181290daf1748fe5dce85015be1 (diff)
downloadserenity-e6331031c4cab0c29dfe6b4ae52940100eb11ff2.zip
LibJS: Make Parser::Error a standalone ParserError class
This allows us to forward declare it and reduce the number of things that need to include Parser.h.
Diffstat (limited to 'Userland/Libraries/LibJS/Parser.h')
-rw-r--r--Userland/Libraries/LibJS/Parser.h33
1 files changed, 3 insertions, 30 deletions
diff --git a/Userland/Libraries/LibJS/Parser.h b/Userland/Libraries/LibJS/Parser.h
index 9d00032463..43cb378d8e 100644
--- a/Userland/Libraries/LibJS/Parser.h
+++ b/Userland/Libraries/LibJS/Parser.h
@@ -13,6 +13,7 @@
#include <AK/StringBuilder.h>
#include <LibJS/AST.h>
#include <LibJS/Lexer.h>
+#include <LibJS/ParserError.h>
#include <LibJS/Runtime/FunctionConstructor.h>
#include <LibJS/SourceRange.h>
#include <LibJS/Token.h>
@@ -173,36 +174,8 @@ public:
Vector<CallExpression::Argument> parse_arguments();
- struct Error {
- String message;
- Optional<Position> position;
-
- String to_string() const
- {
- if (!position.has_value())
- return message;
- return String::formatted("{} (line: {}, column: {})", message, position.value().line, position.value().column);
- }
-
- String source_location_hint(StringView source, char const spacer = ' ', char const indicator = '^') const
- {
- 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.replace("\r\n"sv, "\n"sv, ReplaceMode::All).replace("\r"sv, "\n"sv, ReplaceMode::All).replace(LINE_SEPARATOR_STRING, "\n"sv, ReplaceMode::All).replace(PARAGRAPH_SEPARATOR_STRING, "\n"sv, ReplaceMode::All);
- StringBuilder builder;
- builder.append(source_string.split_view('\n', SplitBehavior::KeepEmpty)[position.value().line - 1]);
- builder.append('\n');
- for (size_t i = 0; i < position.value().column - 1; ++i)
- builder.append(spacer);
- builder.append(indicator);
- return builder.build();
- }
- };
-
bool has_errors() const { return m_state.errors.size(); }
- Vector<Error> const& errors() const { return m_state.errors; }
+ Vector<ParserError> const& errors() const { return m_state.errors; }
void print_errors(bool print_hint = true) const
{
for (auto& error : m_state.errors) {
@@ -305,7 +278,7 @@ private:
struct ParserState {
Lexer lexer;
Token current_token;
- Vector<Error> errors;
+ Vector<ParserError> errors;
ScopePusher* current_scope_pusher { nullptr };
HashMap<StringView, Optional<Position>> labels_in_scope;