diff --git a/Userland/Libraries/LibJS/CMakeLists.txt b/Userland/Libraries/LibJS/CMakeLists.txt index 82e3714450..35330bfdba 100644 --- a/Userland/Libraries/LibJS/CMakeLists.txt +++ b/Userland/Libraries/LibJS/CMakeLists.txt @@ -190,6 +190,7 @@ set(SOURCES Runtime/WeakSetConstructor.cpp Runtime/WeakSetPrototype.cpp Script.cpp + SourceTextModule.cpp SyntaxHighlighter.cpp Token.cpp ) diff --git a/Userland/Libraries/LibJS/SourceTextModule.cpp b/Userland/Libraries/LibJS/SourceTextModule.cpp new file mode 100644 index 0000000000..1e6235f132 --- /dev/null +++ b/Userland/Libraries/LibJS/SourceTextModule.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +namespace JS { + +// 16.2.1.6.1 ParseModule ( sourceText, realm, hostDefined ), https://tc39.es/ecma262/#sec-parsemodule +Result, Vector> SourceTextModule::parse(StringView source_text, Realm& realm, [[maybe_unused]] StringView filename) +{ + // 1. Let body be ParseText(sourceText, Module). + auto parser = Parser(Lexer(source_text, filename), Program::Type::Module); + auto body = parser.parse_program(); + + // 2. If body is a List of errors, return body. + if (parser.has_errors()) + return parser.errors(); + + // FIXME: Implement the rest of ParseModule. + return adopt_ref(*new SourceTextModule(realm, move(body))); +} + +SourceTextModule::SourceTextModule(Realm& realm, NonnullRefPtr program) + : Module(realm) + , m_ecmascript_code(move(program)) +{ +} + +SourceTextModule::~SourceTextModule() +{ +} + +} diff --git a/Userland/Libraries/LibJS/SourceTextModule.h b/Userland/Libraries/LibJS/SourceTextModule.h new file mode 100644 index 0000000000..ac3cba673f --- /dev/null +++ b/Userland/Libraries/LibJS/SourceTextModule.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2021, Andreas Kling + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include + +namespace JS { + +// 16.2.1.6 Source Text Module Records, https://tc39.es/ecma262/#sec-source-text-module-records +class SourceTextModule final : public Module { +public: + static Result, Vector> parse(StringView source_text, Realm&, StringView filename = {}); + virtual ~SourceTextModule(); + +private: + explicit SourceTextModule(Realm&, NonnullRefPtr); + + NonnullRefPtr m_ecmascript_code; // [[ECMAScriptCode]] +}; + +}