aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/rust/ast/rust-ast-fragment.cc18
-rw-r--r--gcc/rust/ast/rust-ast-fragment.h10
-rw-r--r--gcc/rust/expand/rust-expand-visitor.cc87
-rw-r--r--gcc/rust/expand/rust-expand-visitor.h12
-rw-r--r--gcc/rust/expand/rust-macro-expand.cc9
-rw-r--r--gcc/rust/expand/rust-macro-expand.h15
6 files changed, 49 insertions, 102 deletions
diff --git a/gcc/rust/ast/rust-ast-fragment.cc b/gcc/rust/ast/rust-ast-fragment.cc
index e5d0cce..22d2e63 100644
--- a/gcc/rust/ast/rust-ast-fragment.cc
+++ b/gcc/rust/ast/rust-ast-fragment.cc
@@ -23,8 +23,7 @@ namespace AST {
Fragment::Fragment (FragmentKind kind, std::vector<SingleASTNode> nodes,
std::vector<std::unique_ptr<AST::Token>> tokens)
- : kind (kind), nodes (std::move (nodes)), tokens (std::move (tokens)),
- overwrite (true)
+ : kind (kind), nodes (std::move (nodes)), tokens (std::move (tokens))
{}
Fragment::Fragment (Fragment const &other) : kind (other.get_kind ())
@@ -47,8 +46,6 @@ Fragment::operator= (Fragment const &other)
for (auto &t : other.tokens)
tokens.emplace_back (t->clone_token ());
- overwrite = other.overwrite;
-
return *this;
}
@@ -59,15 +56,14 @@ Fragment::create_error ()
}
Fragment::Fragment (std::vector<AST::SingleASTNode> nodes,
- std::vector<std::unique_ptr<AST::Token>> tokens,
- bool overwrite)
+ std::vector<std::unique_ptr<AST::Token>> tokens)
: kind (FragmentKind::Complete), nodes (std::move (nodes)),
- tokens (std::move (tokens)), overwrite (overwrite)
+ tokens (std::move (tokens))
{}
Fragment::Fragment (std::vector<AST::SingleASTNode> nodes,
std::unique_ptr<AST::Token> token)
- : kind (FragmentKind::Complete), nodes (std::move (nodes)), overwrite (true)
+ : kind (FragmentKind::Complete), nodes (std::move (nodes))
{
tokens.emplace_back (std::move (token));
}
@@ -103,12 +99,6 @@ Fragment::should_expand () const
}
bool
-Fragment::should_overwrite () const
-{
- return overwrite;
-}
-
-bool
Fragment::is_expression_fragment () const
{
return is_single_fragment_of_kind (SingleASTNode::NodeType::EXPRESSION);
diff --git a/gcc/rust/ast/rust-ast-fragment.h b/gcc/rust/ast/rust-ast-fragment.h
index fe1895f..e74632a 100644
--- a/gcc/rust/ast/rust-ast-fragment.h
+++ b/gcc/rust/ast/rust-ast-fragment.h
@@ -64,8 +64,7 @@ public:
* Create a complete AST fragment
*/
Fragment (std::vector<AST::SingleASTNode> nodes,
- std::vector<std::unique_ptr<AST::Token>> tokens,
- bool overwrite = true);
+ std::vector<std::unique_ptr<AST::Token>> tokens);
/**
* Create a complete AST fragment made of a single token
@@ -79,7 +78,6 @@ public:
bool is_error () const;
bool should_expand () const;
- bool should_overwrite () const;
bool is_expression_fragment () const;
bool is_type_fragment () const;
@@ -112,12 +110,6 @@ private:
std::vector<std::unique_ptr<AST::Token>> tokens;
/**
- * Whether the fragment should overwrite the original content. In most case
- * it should overwrite it, but not with derive procedural macros.
- */
- bool overwrite;
-
- /**
* We need to make a special case for Expression and Type fragments as only
* one Node will be extracted from the `nodes` vector
*/
diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc
index cb6c299..48c438a 100644
--- a/gcc/rust/expand/rust-expand-visitor.cc
+++ b/gcc/rust/expand/rust-expand-visitor.cc
@@ -128,12 +128,35 @@ get_traits_to_derive (std::vector<AST::Attribute> &outer_attrs)
}
static std::unique_ptr<AST::Item>
-derive_item (std::unique_ptr<AST::Item> &item, const AST::Attribute &derive,
- BuiltinMacro to_derive)
+builtin_derive_item (std::unique_ptr<AST::Item> &item,
+ const AST::Attribute &derive, BuiltinMacro to_derive)
{
return AST::DeriveVisitor::derive (*item, derive, to_derive);
}
+static std::vector<std::unique_ptr<AST::Item>>
+derive_item (std::unique_ptr<AST::Item> &item, std::string &to_derive,
+ MacroExpander &expander)
+{
+ std::vector<std::unique_ptr<AST::Item>> result;
+ auto frag = expander.expand_derive_proc_macro (item, to_derive);
+ if (!frag.is_error ())
+ {
+ for (auto &node : frag.get_nodes ())
+ {
+ switch (node.get_kind ())
+ {
+ case AST::SingleASTNode::ITEM:
+ result.push_back (node.take_item ());
+ break;
+ default:
+ gcc_unreachable ();
+ }
+ }
+ }
+ return result;
+}
+
void
ExpandVisitor::expand_inner_items (
std::vector<std::unique_ptr<AST::Item>> &items)
@@ -157,11 +180,17 @@ ExpandVisitor::expand_inner_items (
if (MacroBuiltin::builtins.is_iter_ok (maybe_builtin))
{
auto new_item
- = derive_item (item, attr, maybe_builtin->second);
+ = builtin_derive_item (item, attr, maybe_builtin->second);
// this inserts the derive *before* the item - is it a
// problem?
it = items.insert (it, std::move (new_item));
}
+ else
+ {
+ auto new_items = derive_item (item, name, expander);
+ std::move (new_items.begin (), new_items.end (),
+ std::inserter (items, it));
+ }
}
}
}
@@ -1005,7 +1034,6 @@ ExpandVisitor::visit (AST::TypeAlias &type_alias)
void
ExpandVisitor::visit (AST::StructStruct &struct_item)
{
- visit_attrs_with_derive (struct_item);
visit_outer_attrs (struct_item);
for (auto &generic : struct_item.get_generic_params ())
visit (generic);
@@ -1020,7 +1048,6 @@ void
ExpandVisitor::visit (AST::TupleStruct &tuple_struct)
{
visit_outer_attrs (tuple_struct);
- visit_attrs_with_derive (tuple_struct);
for (auto &generic : tuple_struct.get_generic_params ())
visit (generic);
@@ -1057,7 +1084,6 @@ ExpandVisitor::visit (AST::EnumItemDiscriminant &item)
void
ExpandVisitor::visit (AST::Enum &enum_item)
{
- visit_attrs_with_derive (enum_item);
visit_outer_attrs (enum_item);
for (auto &generic : enum_item.get_generic_params ())
visit (generic);
@@ -1069,7 +1095,6 @@ ExpandVisitor::visit (AST::Enum &enum_item)
void
ExpandVisitor::visit (AST::Union &union_item)
{
- visit_attrs_with_derive (union_item);
visit_outer_attrs (union_item);
for (auto &generic : union_item.get_generic_params ())
visit (generic);
@@ -1619,52 +1644,4 @@ ExpandVisitor::visit_inner_attrs (T &item)
visit_inner_using_attrs (item, item.get_inner_attrs ());
}
-template <typename T>
-void
-ExpandVisitor::expand_derive (T &item, std::unique_ptr<AST::TokenTree> trait)
-{
- auto trait_name = trait->as_string ();
- expander.expand_derive_proc_macro (item, trait_name);
-}
-
-template <typename T>
-void
-ExpandVisitor::expand_derive (T &item, AST::DelimTokenTree &attr)
-{
- // Item is const because even though the tokenstream might be modified, it
- // should appear as the same input for every derive proc macro.
- auto &trees = attr.get_token_trees ();
- if (trees.size () > 2)
- {
- // Skipping begin and end parenthesis
- for (auto it = trees.begin () + 1; it < trees.end () - 1;
- it += 2 /* Increment + skip comma */)
- {
- expand_derive (item, std::move (*it));
- }
- }
-}
-
-template <typename T>
-void
-ExpandVisitor::visit_attrs_with_derive (T &item)
-{
- auto &attrs = item.get_outer_attrs ();
- for (auto it = attrs.begin (); it != attrs.end (); /* erase => No increment*/)
- {
- auto current = *it;
-
- if (!is_builtin (current) && is_derive (current))
- {
- it = attrs.erase (it);
- // Downcasting checked in is_derive
- expand_derive (item, static_cast<AST::DelimTokenTree &> (
- current.get_attr_input ()));
- }
- else // Skip unknwown
- {
- it++;
- }
- }
-}
} // namespace Rust
diff --git a/gcc/rust/expand/rust-expand-visitor.h b/gcc/rust/expand/rust-expand-visitor.h
index 0dd5c9a..d86f0d0 100644
--- a/gcc/rust/expand/rust-expand-visitor.h
+++ b/gcc/rust/expand/rust-expand-visitor.h
@@ -146,10 +146,7 @@ public:
}
else if (proc_macro_fragment.should_expand ())
{
- if (proc_macro_fragment.should_overwrite ())
- it = values.erase (it);
- else
- it++;
+ it = values.erase (it);
for (auto &node : proc_macro_fragment.get_nodes ())
{
auto new_node = extractor (node);
@@ -383,13 +380,6 @@ public:
template <typename T> void visit_inner_attrs (T &item);
- template <typename T>
- void expand_derive (T &item, std::unique_ptr<AST::TokenTree> trait);
-
- template <typename T> void expand_derive (T &item, AST::DelimTokenTree &attr);
-
- template <typename T> void visit_attrs_with_derive (T &item);
-
private:
MacroExpander &expander;
};
diff --git a/gcc/rust/expand/rust-macro-expand.cc b/gcc/rust/expand/rust-macro-expand.cc
index cb9f816..47384df 100644
--- a/gcc/rust/expand/rust-macro-expand.cc
+++ b/gcc/rust/expand/rust-macro-expand.cc
@@ -1096,8 +1096,8 @@ MacroExpander::import_proc_macros (std::string extern_crate)
}
}
-void
-MacroExpander::parse_procmacro_output (ProcMacro::TokenStream ts, bool derive)
+AST::Fragment
+MacroExpander::parse_proc_macro_output (ProcMacro::TokenStream ts)
{
ProcMacroInvocLexer lex (convert (ts));
Parser<ProcMacroInvocLexer> parser (lex);
@@ -1133,10 +1133,9 @@ MacroExpander::parse_procmacro_output (ProcMacro::TokenStream ts, bool derive)
}
if (parser.has_errors ())
- set_expanded_proc_macro_fragment (AST::Fragment::create_error ());
+ return AST::Fragment::create_error ();
else
- set_expanded_proc_macro_fragment (
- {nodes, std::vector<std::unique_ptr<AST::Token>> (), !derive});
+ return {nodes, std::vector<std::unique_ptr<AST::Token>> ()};
}
} // namespace Rust
diff --git a/gcc/rust/expand/rust-macro-expand.h b/gcc/rust/expand/rust-macro-expand.h
index 588b1c8..4274c12 100644
--- a/gcc/rust/expand/rust-macro-expand.h
+++ b/gcc/rust/expand/rust-macro-expand.h
@@ -357,7 +357,7 @@ struct MacroExpander
void import_proc_macros (std::string extern_crate);
template <typename T>
- void expand_derive_proc_macro (T &item, std::string &trait_name)
+ AST::Fragment expand_derive_proc_macro (T &item, std::string &trait_name)
{
ProcMacro::CustomDerive macro;
@@ -387,11 +387,11 @@ struct MacroExpander
auto c = collector.collect_tokens ();
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
- parse_procmacro_output (macro.macro (convert (vec)), true);
+ return parse_proc_macro_output (macro.macro (convert (vec)));
}
template <typename T>
- void expand_bang_proc_macro (T &item, AST::SimplePath &path)
+ AST::Fragment expand_bang_proc_macro (T &item, AST::SimplePath &path)
{
ProcMacro::Bang macro;
@@ -419,7 +419,7 @@ struct MacroExpander
auto c = collector.collect_tokens ();
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
- parse_procmacro_output (macro.macro (convert (vec)), false);
+ return parse_proc_macro_output (macro.macro (convert (vec)));
}
template <typename T>
@@ -453,9 +453,8 @@ struct MacroExpander
std::vector<const_TokenPtr> vec (c.cbegin (), c.cend ());
// FIXME: Handle attributes
- parse_procmacro_output (
- macro.macro (ProcMacro::TokenStream::make_tokenstream (), convert (vec)),
- false);
+ parse_proc_macro_output (
+ macro.macro (ProcMacro::TokenStream::make_tokenstream (), convert (vec)));
}
/**
@@ -473,7 +472,7 @@ struct MacroExpander
AST::MacroInvocation *get_last_invocation () { return last_invoc; }
private:
- void parse_procmacro_output (ProcMacro::TokenStream ts, bool derive);
+ AST::Fragment parse_proc_macro_output (ProcMacro::TokenStream ts);
AST::Crate &crate;
Session &session;