diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/AST.h b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/AST.h index 77df78963f..c6bde40165 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/AST.h +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/AST.h @@ -312,11 +312,11 @@ protected: class FunctionPointer : public Node { public: FunctionPointer(StringView function_name) - : m_function_name(function_name) + : m_function(function_name) { } - StringView m_function_name; + Variant m_function; protected: void dump_tree(StringBuilder& builder) override; diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/ASTPrinting.cpp b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/ASTPrinting.cpp index 32dd6a1c8e..e80ba6d8a8 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/ASTPrinting.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/AST/ASTPrinting.cpp @@ -8,6 +8,7 @@ #include #include "AST/AST.h" +#include "Function.h" namespace JSSpecCompiler { @@ -131,7 +132,13 @@ void Variable::dump_tree(StringBuilder& builder) void FunctionPointer::dump_tree(StringBuilder& builder) { - dump_node(builder, "Func {}", m_function_name); + m_function.visit( + [&](StringView name) { + dump_node(builder, "Func external \"{}\"", name); + }, + [&](FunctionRef function) { + dump_node(builder, "Func local \"{}\"", function->m_name); + }); } } diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/CMakeLists.txt b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/CMakeLists.txt index 5a1684f4d8..11a4b565d8 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/CMakeLists.txt +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/CMakeLists.txt @@ -5,6 +5,7 @@ set(SOURCES Parser/SpecParser.cpp Parser/TextParser.cpp Parser/XMLUtils.cpp + Function.cpp main.cpp ) diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Forward.h b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Forward.h index 8c217a901c..a6cd0f0e6b 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Forward.h +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Forward.h @@ -35,6 +35,7 @@ class FunctionCall; class SlotName; class Variable; class FunctionPointer; +using FunctionPointerRef = NonnullRefPtr; // Parser/SpecParser.h class AlgorithmStep; @@ -42,4 +43,9 @@ class AlgorithmStepList; class Algorithm; class SpecFunction; +// Function.h +class ExecutionContext; +class Function; +using FunctionRef = Function*; + } diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.cpp b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.cpp new file mode 100644 index 0000000000..5694eebf30 --- /dev/null +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023, Dan Klishch + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "Function.h" +#include "AST/AST.h" + +namespace JSSpecCompiler { + +Function::Function(ExecutionContext* context, StringView name, Tree ast) + : m_context(context) + , m_name(name) + , m_ast(move(ast)) +{ +} + +} diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.h b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.h new file mode 100644 index 0000000000..470dfbbecc --- /dev/null +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2023, Dan Klishch + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include + +#include "Forward.h" + +namespace JSSpecCompiler { + +class ExecutionContext { +public: + HashMap m_functions; +}; + +class Function : public RefCounted { +public: + Function(ExecutionContext* context, StringView name, Tree ast); + + ExecutionContext* m_context; + StringView m_name; + Tree m_ast; +}; + +} diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.cpp b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.cpp index f5485e289a..9c888470ec 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.cpp @@ -103,11 +103,11 @@ ParseErrorOr Algorithm::create(XML::Node const* node) return algorithm; } -ParseErrorOr Function::create(XML::Node const* element) +ParseErrorOr SpecFunction::create(XML::Node const* element) { VERIFY(element->as_element().name == tag_emu_clause); - Function result; + SpecFunction result; result.m_id = TRY(get_attribute_by_name(element, attribute_id)); result.m_name = TRY(get_attribute_by_name(element, attribute_aoid)); @@ -156,7 +156,7 @@ ParseErrorOr Function::create(XML::Node const* element) return result; } -ParseErrorOr Function::parse_definition(XML::Node const* element) +ParseErrorOr SpecFunction::parse_definition(XML::Node const* element) { auto tokens = TRY(tokenize_tree(element)); TextParser parser(tokens.tokens, element); diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.h b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.h index 1d81c798bd..72ba05ddc4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.h +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Parser/SpecParser.h @@ -40,13 +40,13 @@ public: Tree m_tree = error_tree; }; -class Function { +class SpecFunction { public: struct Argument { StringView name; }; - static ParseErrorOr create(XML::Node const* element); + static ParseErrorOr create(XML::Node const* element); ParseErrorOr parse_definition(XML::Node const* element); diff --git a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/main.cpp b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/main.cpp index 276ac45784..771c0cf26d 100644 --- a/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/main.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/main.cpp @@ -25,7 +25,7 @@ ErrorOr serenity_main(Main::Arguments) } auto document = maybe_document.release_value(); - auto maybe_function = JSSpecCompiler::Function::create(&document.root()); + auto maybe_function = JSSpecCompiler::SpecFunction::create(&document.root()); if (maybe_function.is_error()) { outln("{}", maybe_function.error()->to_string()); return 1;