diff --git a/furc/include/furc/ast/declaration.hpp b/furc/include/furc/ast/declaration.hpp index 470dd38..9980ee6 100644 --- a/furc/include/furc/ast/declaration.hpp +++ b/furc/include/furc/ast/declaration.hpp @@ -3,7 +3,8 @@ #include "furc/ast/node.hpp" #include "furc/ast/statement.hpp" -#include "furc/front/token.hpp" + +#include namespace furc { namespace ast { @@ -64,8 +65,9 @@ public: * @param location Node location. * @param name Name of the function. */ - function_declaration_node(struct location location, front::token name) - : declaration_node(location), p_name(name) {} + template + function_declaration_node(struct location location, T&& name) + : declaration_node(location), p_name(std::forward(name)) {} public: /** * @brief Returns this node's declaration type. @@ -79,7 +81,7 @@ public: * * @return Name of the function. */ - front::token name() const { return p_name; } + std::string name() const { return p_name; } public: void accept(visitor& visitor) const override; @@ -90,7 +92,7 @@ protected: /** * @brief Name of the function. */ - front::token p_name; + std::string p_name; }; /** @@ -105,8 +107,9 @@ public: * @param name Name of the function. * @param body Body of the function. */ - function_definition_node(struct location location, front::token name, body_r&& body) - : function_declaration_node(location, name), m_body(std::move(body)) {} + template + function_definition_node(struct location location, T&& name, body_r&& body) + : function_declaration_node(location, std::forward(name)), m_body(std::move(body)) {} public: /** * @brief Returns this node's declaration type. diff --git a/furc/src/ast.cpp b/furc/src/ast.cpp index cfba539..e9cd810 100644 --- a/furc/src/ast.cpp +++ b/furc/src/ast.cpp @@ -118,7 +118,7 @@ void function_declaration_node::accept(visitor& visitor) const { } std::ostream& function_declaration_node::print(std::ostream& os) const { - return os << "function " << p_name->string << " declaration"; + return os << "function " << p_name << " declaration"; } bool function_declaration_node::equal(const node& rhs) const { @@ -135,7 +135,7 @@ std::ostream& function_definition_node::print(std::ostream& os) const { if (m_body.has_value()) { for (const auto& entry : m_body->statements) os << entry << '\n'; - return os << m_body->end << ": " << p_name->string << " end"; + return os << m_body->end << ": " << p_name << " end"; } return os << m_body.error(); } diff --git a/furc/src/front/ir_generator.cpp b/furc/src/front/ir_generator.cpp index a256200..050f70e 100644 --- a/furc/src/front/ir_generator.cpp +++ b/furc/src/front/ir_generator.cpp @@ -5,6 +5,7 @@ #include "furc/ast/literal.hpp" // IWYU pragma: keep #include "furc/ast/statement.hpp" // IWYU pragma: keep +#include #include namespace furc::front { @@ -14,7 +15,7 @@ namespace ir = furlang::ir; } void ir_generator::visit(const ast::function_definition_node& funcDef) { - m_currentFunction = std::make_unique(std::string(funcDef.name()->string)); + m_currentFunction = std::make_unique(std::string(funcDef.name())); push_block(); if (funcDef.body().has_error()) { diff --git a/furc/src/front/parser.cpp b/furc/src/front/parser.cpp index 9506e1c..57e255b 100644 --- a/furc/src/front/parser.cpp +++ b/furc/src/front/parser.cpp @@ -37,7 +37,7 @@ ast::program_node_r parser::parse() & { program->push(std::move(parse_declaration())); } - return program; + return std::move(program); } ast::declaration_node_r parser::parse_declaration() { @@ -61,11 +61,13 @@ ast::declaration_node_r parser::parse_declaration() { case token_t::LBrace: { ast::body_r body = parse_body(); if (body.has_error()) return ast::declaration_node_r(ast::error{ body.error().location }); - return m_arena.allocate_shared(first->location, *name, std::move(body)); + return m_arena.allocate_shared(first->location, + name->value.string, + std::move(body)); } case token_t::Semicolon: { m_peekBuffer.clear(); - return m_arena.allocate_shared(first->location, *name); + return m_arena.allocate_shared(first->location, name->value.string); } default: return ast::declaration_node_r(ast::error{ tok->location }); }