diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-10-06 18:03:34 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-10-06 18:03:34 +0800 |
commit | c4dad1cc97643c542b27dbd27f5cfdc62515586f (patch) | |
tree | 2ac6b0fa0e5283fdec0ffd950c90c51035692d97 /src/expand/proc_macro.cpp | |
parent | 16bd8829c108000e0d52d76329b88ab9e6a34e12 (diff) | |
download | mrust-c4dad1cc97643c542b27dbd27f5cfdc62515586f.tar.gz |
Expand - Pass attributes on struct/union/enums to custom derive code
Diffstat (limited to 'src/expand/proc_macro.cpp')
-rw-r--r-- | src/expand/proc_macro.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/expand/proc_macro.cpp b/src/expand/proc_macro.cpp index 8ed0da59..3b23184e 100644 --- a/src/expand/proc_macro.cpp +++ b/src/expand/proc_macro.cpp @@ -611,12 +611,27 @@ namespace { TODO(sp, "ExprNode_UniOp"); } + void visit_top_attrs(slice<const ::AST::Attribute>& attrs) + { + for(const auto& a : attrs) + { + if( m_pmi.attr_is_used(a.name()) ) + { + DEBUG("Send " << a); + m_pmi.send_symbol("#"); + m_pmi.send_symbol("["); + this->visit_meta_item(a); + m_pmi.send_symbol("]"); + } + } + } void visit_attrs(const ::AST::AttributeList& attrs) { for(const auto& a : attrs.m_items) { if( m_pmi.attr_is_used(a.name()) ) { + DEBUG("Send " << a); m_pmi.send_symbol("#"); m_pmi.send_symbol("["); this->visit_meta_item(a); @@ -750,7 +765,7 @@ namespace { } }; } -::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const ::std::string& item_name, const ::AST::Struct& i) +::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, slice<const AST::Attribute> attrs, const ::std::string& item_name, const ::AST::Struct& i) { // 1. Create ProcMacroInv instance auto pmi = ProcMacro_Invoke_int(sp, crate, mac_path); @@ -758,31 +773,37 @@ namespace { return ::std::unique_ptr<TokenStream>(); // 2. Feed item as a token stream. // TODO: Get attributes from the caller, filter based on the macro's options then pass to the child. - Visitor(sp, pmi).visit_struct(item_name, false, i); + Visitor v(sp, pmi); + v.visit_top_attrs(attrs); + v.visit_struct(item_name, false, i); pmi.send_done(); // 3. Return boxed invocation instance return box$(pmi); } -::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const ::std::string& item_name, const ::AST::Enum& i) +::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, slice<const AST::Attribute> attrs, const ::std::string& item_name, const ::AST::Enum& i) { // 1. Create ProcMacroInv instance auto pmi = ProcMacro_Invoke_int(sp, crate, mac_path); if( !pmi.check_good() ) return ::std::unique_ptr<TokenStream>(); // 2. Feed item as a token stream. - Visitor(sp, pmi).visit_enum(item_name, false, i); + Visitor v(sp, pmi); + v.visit_top_attrs(attrs); + v.visit_enum(item_name, false, i); pmi.send_done(); // 3. Return boxed invocation instance return box$(pmi); } -::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const ::std::string& item_name, const ::AST::Union& i) +::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, slice<const AST::Attribute> attrs, const ::std::string& item_name, const ::AST::Union& i) { // 1. Create ProcMacroInv instance auto pmi = ProcMacro_Invoke_int(sp, crate, mac_path); if( !pmi.check_good() ) return ::std::unique_ptr<TokenStream>(); // 2. Feed item as a token stream. - Visitor(sp, pmi).visit_union(item_name, false, i); + Visitor v(sp, pmi); + v.visit_top_attrs(attrs); + v.visit_union(item_name, false, i); pmi.send_done(); // 3. Return boxed invocation instance return box$(pmi); |