From 1f9a4180a3b54f85f37919ba4ca709f8e8250bb6 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 22 May 2016 22:39:26 +0800 Subject: macro_rules - Rework pattern matching to not use try-catch --- src/ast/ast.cpp | 3 +++ src/ast/ast.hpp | 21 ++++++++++----------- src/ast/crate.cpp | 2 +- src/ast/crate.hpp | 4 +++- 4 files changed, 17 insertions(+), 13 deletions(-) (limited to 'src/ast') diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp index 23e9bfea..84218591 100644 --- a/src/ast/ast.cpp +++ b/src/ast/ast.cpp @@ -313,6 +313,9 @@ void Module::add_submod(bool is_public, ::std::string name, Module mod, MetaItem DEBUG("mod.m_name = " << name << ", attrs = " << attrs); this->add_item( is_public, mv$(name), Item::make_Module({mv$(mod)}), mv$(attrs) ); } +void Module::add_macro(bool is_exported, ::std::string name, MacroRulesPtr macro) { + m_macros.push_back( Named( mv$(name), mv$(macro), is_exported ) ); +} void Module::prescan() { diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp index b7de73ac..d1e8c6a2 100644 --- a/src/ast/ast.hpp +++ b/src/ast/ast.hpp @@ -19,17 +19,18 @@ #include "../parse/tokentree.hpp" #include "../types.hpp" -#include "../macros.hpp" #include -#include "pattern.hpp" -#include "attrs.hpp" -#include "expr.hpp" -#include "macro.hpp" -#include "item.hpp" +#include +#include +#include +#include +#include #include "generics.hpp" +#include + namespace AST { class Crate; @@ -551,7 +552,7 @@ private: ::std::vector m_anon_modules; ::std::vector< NamedNS > m_macro_import_res; // Vec of imported macros (not serialised) - ::std::vector< Named > m_macros; + ::std::vector< Named > m_macros; public: char m_index_populated = 0; // 0 = no, 1 = partial, 2 = complete @@ -599,9 +600,7 @@ public: void add_neg_impl(ImplDef impl) { m_neg_impls.emplace_back( ::std::move(impl) ); } - void add_macro(bool is_exported, ::std::string name, MacroRules macro) { - m_macros.push_back( Named( move(name), move(macro), is_exported ) ); - } + void add_macro(bool is_exported, ::std::string name, MacroRulesPtr macro); void add_macro_import(::std::string name, const MacroRules& mr) { m_macro_import_res.push_back( NamedNS( mv$(name), &mr, false ) ); } @@ -641,7 +640,7 @@ public: ::std::vector& macro_invs() { return m_macro_invocations; } - const NamedList& macros() const { return m_macros; } + const NamedList& macros() const { return m_macros; } const ::std::vector > macro_imports_res() const { return m_macro_import_res; } diff --git a/src/ast/crate.cpp b/src/ast/crate.cpp index d40879f3..500598b0 100644 --- a/src/ast/crate.cpp +++ b/src/ast/crate.cpp @@ -325,7 +325,7 @@ const MacroRules* ExternCrate::find_macro_rules(const ::std::string& name) { auto i = m_mr_macros.find(name); if(i != m_mr_macros.end()) - return &i->second; + return &*i->second; return nullptr; } diff --git a/src/ast/crate.hpp b/src/ast/crate.hpp index dbb9ca0d..b88b9307 100644 --- a/src/ast/crate.hpp +++ b/src/ast/crate.hpp @@ -79,7 +79,7 @@ private: class ExternCrate: public Serialisable { - ::std::map< ::std::string, MacroRules > m_mr_macros; + ::std::map< ::std::string, MacroRulesPtr > m_mr_macros; //::MIR::Module m_root_module; @@ -87,6 +87,8 @@ class ExternCrate: public: ExternCrate(); ExternCrate(const char *path); + ExternCrate(const ExternCrate&) = delete; + ExternCrate(ExternCrate&&) = default; const MacroRules* find_macro_rules(const ::std::string& name); -- cgit v1.2.3