summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/expand/derive.cpp11
-rw-r--r--src/expand/mod.cpp2
-rw-r--r--src/expand/proc_macro.cpp33
-rw-r--r--src/expand/proc_macro.hpp6
4 files changed, 37 insertions, 15 deletions
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<typename T>
-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<const AST::Attribute> 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<const AST::Attribute>(&a, &attrs.m_items.back() - &a), item);
+ d.handle(sp, a, crate, path, mod, slice<const AST::Attribute>(&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<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);
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 <parse/tokenstream.hpp>
-extern ::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const ::std::string& name, const ::AST::Struct& i);
-extern ::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const ::std::string& name, const ::AST::Enum& i);
-extern ::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const ::std::string& name, const ::AST::Union& i);
+extern ::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& name, const ::AST::Struct& i);
+extern ::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& name, const ::AST::Enum& i);
+extern ::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& name, const ::AST::Union& i);
//extern ::std::unique_ptr<TokenStream> ProcMacro_Invoke(const Span& sp, const ::AST::Crate& crate, const ::std::vector<RcString>& mac_path, const TokenStream& tt);