diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-22 22:39:26 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-22 22:39:26 +0800 |
commit | 1f9a4180a3b54f85f37919ba4ca709f8e8250bb6 (patch) | |
tree | c00cef798d26bf5f68f1657b01a490533365f015 /src/ast | |
parent | eba9d8f840a5b81f0188d109e63631c9a34c28e9 (diff) | |
download | mrust-1f9a4180a3b54f85f37919ba4ca709f8e8250bb6.tar.gz |
macro_rules - Rework pattern matching to not use try-catch
Diffstat (limited to 'src/ast')
-rw-r--r-- | src/ast/ast.cpp | 3 | ||||
-rw-r--r-- | src/ast/ast.hpp | 21 | ||||
-rw-r--r-- | src/ast/crate.cpp | 2 | ||||
-rw-r--r-- | src/ast/crate.hpp | 4 |
4 files changed, 17 insertions, 13 deletions
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<MacroRulesPtr>( 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 <serialise.hpp>
-#include "pattern.hpp"
-#include "attrs.hpp"
-#include "expr.hpp"
-#include "macro.hpp"
-#include "item.hpp"
+#include <ast/pattern.hpp>
+#include <ast/attrs.hpp>
+#include <ast/expr.hpp>
+#include <ast/item.hpp>
+#include <ast/macro.hpp>
#include "generics.hpp"
+#include <macro_rules/macro_rules_ptr.hpp>
+
namespace AST {
class Crate;
@@ -551,7 +552,7 @@ private: ::std::vector<Module*> m_anon_modules;
::std::vector< NamedNS<const MacroRules*> > m_macro_import_res; // Vec of imported macros (not serialised)
- ::std::vector< Named<MacroRules> > m_macros;
+ ::std::vector< Named<MacroRulesPtr> > 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<MacroRules>( 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<const MacroRules*>( mv$(name), &mr, false ) );
}
@@ -641,7 +640,7 @@ public: ::std::vector<MacroInvocation>& macro_invs() { return m_macro_invocations; }
- const NamedList<MacroRules>& macros() const { return m_macros; }
+ const NamedList<MacroRulesPtr>& macros() const { return m_macros; }
const ::std::vector<NamedNS<const MacroRules*> > 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); |