diff options
author | Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com> | 2023-03-30 16:35:53 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-16 18:28:44 +0100 |
commit | 0c985f7d309d321482833d409df8864820c778eb (patch) | |
tree | 3865c4038a8f3547c53f6372f0b7db2d9b8d30bb | |
parent | 36b22e639078d8ca5db5ee0d3002a174a048e813 (diff) | |
download | gcc-0c985f7d309d321482833d409df8864820c778eb.zip gcc-0c985f7d309d321482833d409df8864820c778eb.tar.gz gcc-0c985f7d309d321482833d409df8864820c778eb.tar.bz2 |
gccrs: expand: Add inner attribute expansion stubs
Add function stubs for inner attribute proc macros expansion.
gcc/rust/ChangeLog:
* expand/rust-expand-visitor.cc (ExpandVisitor::visit): Add call
to inner attribute stub.
(ExpandVisitor::expand_inner_attribute): Expand one single
attribute.
(ExpandVisitor::visit_inner_using_attrs): Expand a given item
using a vector of attributes.
(ExpandVisitor::visit_inner_attrs): Visit inner attributes of a
given item.
* expand/rust-expand-visitor.h: Add function prototypes.
Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
-rw-r--r-- | gcc/rust/expand/rust-expand-visitor.cc | 41 | ||||
-rw-r--r-- | gcc/rust/expand/rust-expand-visitor.h | 8 |
2 files changed, 47 insertions, 2 deletions
diff --git a/gcc/rust/expand/rust-expand-visitor.cc b/gcc/rust/expand/rust-expand-visitor.cc index 9661948..b2d1cf3 100644 --- a/gcc/rust/expand/rust-expand-visitor.cc +++ b/gcc/rust/expand/rust-expand-visitor.cc @@ -762,8 +762,11 @@ void ExpandVisitor::visit (AST::Module &module) { if (module.get_kind () == AST::Module::ModuleKind::LOADED) - for (auto &item : module.get_items ()) - visit (item); + { + visit_inner_attrs (module); + for (auto &item : module.get_items ()) + visit (item); + } } void @@ -789,6 +792,8 @@ ExpandVisitor::visit (AST::UseDeclaration &use_decl) void ExpandVisitor::visit (AST::Function &function) { + visit_inner_using_attrs (function, + function.get_definition ()->get_inner_attrs ()); for (auto ¶m : function.get_generic_params ()) visit (param); @@ -954,6 +959,7 @@ ExpandVisitor::visit (AST::Trait &trait) void ExpandVisitor::visit (AST::InherentImpl &impl) { + visit_inner_attrs (impl); // just expand sub-stuff - can't actually strip generic params themselves for (auto &generic : impl.get_generic_params ()) visit (generic); @@ -978,6 +984,7 @@ ExpandVisitor::visit (AST::InherentImpl &impl) void ExpandVisitor::visit (AST::TraitImpl &impl) { + visit_inner_attrs (impl); // just expand sub-stuff - can't actually strip generic params themselves for (auto ¶m : impl.get_generic_params ()) visit (param); @@ -1035,6 +1042,7 @@ ExpandVisitor::visit (AST::ExternalFunctionItem &item) void ExpandVisitor::visit (AST::ExternBlock &block) { + visit_inner_attrs (block); std::function<std::unique_ptr<AST::ExternalItem> (AST::SingleASTNode)> extractor = [] (AST::SingleASTNode node) { return node.take_external_item (); }; @@ -1343,6 +1351,35 @@ ExpandVisitor::visit (AST::BareFunctionType &type) template <typename T> void +ExpandVisitor::expand_inner_attribute (T &item, AST::SimplePath &path) +{ + // TODO: Warn about instability ? + // FIXME: Implement expansion for that particular path +} + +template <typename T> +void +ExpandVisitor::visit_inner_using_attrs (T &item, + std::vector<AST::Attribute> &attrs) +{ + for (auto it = attrs.begin (); it != attrs.end (); /* erase => No increment*/) + { + auto current = *it; + + it = attrs.erase (it); + expand_inner_attribute (item, current.get_path ()); + } +} + +template <typename T> +void +ExpandVisitor::visit_inner_attrs (T &item) +{ + visit_inner_using_attrs (item, item.get_inner_attrs ()); +} + +template <typename T> +void ExpandVisitor::expand_derive (const T &item, std::unique_ptr<AST::TokenTree> &trait) { diff --git a/gcc/rust/expand/rust-expand-visitor.h b/gcc/rust/expand/rust-expand-visitor.h index 613251d..66dc187 100644 --- a/gcc/rust/expand/rust-expand-visitor.h +++ b/gcc/rust/expand/rust-expand-visitor.h @@ -313,6 +313,14 @@ public: void visit (AST::InferredType &) override; void visit (AST::BareFunctionType &type) override; + template <typename T> + void expand_inner_attribute (T &item, AST::SimplePath &Path); + + template <typename T> + void visit_inner_using_attrs (T &item, std::vector<AST::Attribute> &attrs); + + template <typename T> void visit_inner_attrs (T &item); + bool is_derive (AST::Attribute &attr); template <typename T> |