From b48167dec0c1c05b463991a8db5a8db70a5ae604 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 19 May 2019 22:15:02 +0800 Subject: All - Switch to using interned (de-duplicated) RcString-s instead of std::string for paths/identifiers --- src/expand/proc_macro.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/expand/proc_macro.hpp') diff --git a/src/expand/proc_macro.hpp b/src/expand/proc_macro.hpp index 8c5b71c7..e66bf037 100644 --- a/src/expand/proc_macro.hpp +++ b/src/expand/proc_macro.hpp @@ -8,8 +8,8 @@ #pragma once #include -extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<::std::string>& mac_path, const ::std::string& name, const ::AST::Struct& i); -extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<::std::string>& mac_path, const ::std::string& name, const ::AST::Enum& i); -extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<::std::string>& mac_path, const ::std::string& name, const ::AST::Union& i); -//extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<::std::string>& mac_path, const TokenStream& tt); +extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& name, const ::AST::Struct& i); +extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& name, const ::AST::Enum& i); +extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& name, const ::AST::Union& i); +//extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const TokenStream& tt); -- cgit v1.2.3 From c4dad1cc97643c542b27dbd27f5cfdc62515586f Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 6 Oct 2019 18:03:34 +0800 Subject: Expand - Pass attributes on struct/union/enums to custom derive code --- src/expand/derive.cpp | 11 ++++++----- src/expand/mod.cpp | 2 +- src/expand/proc_macro.cpp | 33 +++++++++++++++++++++++++++------ src/expand/proc_macro.hpp | 6 +++--- 4 files changed, 37 insertions(+), 15 deletions(-) (limited to 'src/expand/proc_macro.hpp') diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index f67a761d..0ccda406 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -2107,7 +2107,7 @@ static const Deriver* find_impl(const RcString& trait_name) } template -static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mod, const AST::Attribute& attr, const AST::Path& path, const T& item) +static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mod, const AST::Attribute& attr, const AST::Path& path, slice attrs, const T& item) { if( !attr.has_sub_items() ) { //ERROR(sp, E0000, "#[derive()] requires a list of known traits to derive"); @@ -2153,7 +2153,8 @@ static void derive_item(const Span& sp, const AST::Crate& crate, AST::Module& mo } else { // proc_macro - Invoke the handler. - auto lex = ProcMacro_Invoke(sp, crate, mac_path.path, path.nodes().back().name().c_str(), item); + DEBUG("proc_macro " << mac_path.path << ", attrs = " << attrs); + auto lex = ProcMacro_Invoke(sp, crate, mac_path.path, attrs, path.nodes().back().name().c_str(), item); if( lex ) { Parse_ModRoot_Items(*lex, mod); @@ -2194,13 +2195,13 @@ public: // Ignore, it's been deleted ), (Union, - derive_item(sp, crate, mod, attr, path, e); + derive_item(sp, crate, mod, attr, path, attrs, e); ), (Enum, - derive_item(sp, crate, mod, attr, path, e); + derive_item(sp, crate, mod, attr, path, attrs, e); ), (Struct, - derive_item(sp, crate, mod, attr, path, e); + derive_item(sp, crate, mod, attr, path, attrs, e); ) ) } diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index f19acda7..53358473 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -104,7 +104,7 @@ void Expand_Attrs(const ::AST::AttributeList& attrs, AttrStage stage, ::AST::Cr Expand_Attrs(attrs, stage, [&](const auto& sp, const auto& d, const auto& a){ if(!item.is_None()) { // TODO: Pass attributes _after_ this attribute - d.handle(sp, a, crate, path, mod, slice(&a, &attrs.m_items.back() - &a), item); + d.handle(sp, a, crate, path, mod, slice(&a, &attrs.m_items.back() - &a + 1), item); } }); } 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& 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 ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& item_name, const ::AST::Struct& i) +::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, slice 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(); // 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 ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& item_name, const ::AST::Enum& i) +::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, slice 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(); // 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 ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& item_name, const ::AST::Union& i) +::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, slice 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(); // 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); diff --git a/src/expand/proc_macro.hpp b/src/expand/proc_macro.hpp index e66bf037..a4a190e8 100644 --- a/src/expand/proc_macro.hpp +++ b/src/expand/proc_macro.hpp @@ -8,8 +8,8 @@ #pragma once #include -extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& name, const ::AST::Struct& i); -extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& name, const ::AST::Enum& i); -extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const ::std::string& name, const ::AST::Union& i); +extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, slice attrs, const ::std::string& name, const ::AST::Struct& i); +extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, slice attrs, const ::std::string& name, const ::AST::Enum& i); +extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, slice attrs, const ::std::string& name, const ::AST::Union& i); //extern ::std::unique_ptr ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector& mac_path, const TokenStream& tt); -- cgit v1.2.3