From: Philip Herron Date: Mon, 17 Oct 2022 16:51:15 +0000 (+0100) Subject: gccrs: Add name resolution for closures X-Git-Tag: upstream/13.1.0~1045 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=977e0e5227d467fcda43edfae72c5251c283d871;p=platform%2Fupstream%2Fgcc.git gccrs: Add name resolution for closures gcc/rust/ChangeLog: * resolve/rust-ast-resolve-expr.cc (ResolveExpr::visit): Visit closure properly when name resolving. (ResolveExpr::resolve_closure_param): Implement closure name resolving. * resolve/rust-ast-resolve-expr.h: Declare visitors for closure types. --- diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.cc b/gcc/rust/resolve/rust-ast-resolve-expr.cc index 40d4af09..8ece5b6 100644 --- a/gcc/rust/resolve/rust-ast-resolve-expr.cc +++ b/gcc/rust/resolve/rust-ast-resolve-expr.cc @@ -565,6 +565,64 @@ ResolveExpr::visit (AST::RangeFromToInclExpr &expr) ResolveExpr::go (expr.get_to_expr ().get (), prefix, canonical_prefix); } +void +ResolveExpr::visit (AST::ClosureExprInner &expr) +{ + NodeId scope_node_id = expr.get_node_id (); + resolver->get_name_scope ().push (scope_node_id); + resolver->get_type_scope ().push (scope_node_id); + resolver->get_label_scope ().push (scope_node_id); + resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); + resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + + for (auto &p : expr.get_params ()) + { + resolve_closure_param (p); + } + + ResolveExpr::go (expr.get_definition_expr ().get (), prefix, + canonical_prefix); + + resolver->get_name_scope ().pop (); + resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); +} + +void +ResolveExpr::visit (AST::ClosureExprInnerTyped &expr) +{ + NodeId scope_node_id = expr.get_node_id (); + resolver->get_name_scope ().push (scope_node_id); + resolver->get_type_scope ().push (scope_node_id); + resolver->get_label_scope ().push (scope_node_id); + resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); + resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); + + for (auto &p : expr.get_params ()) + { + resolve_closure_param (p); + } + + ResolveType::go (expr.get_return_type ().get ()); + ResolveExpr::go (expr.get_definition_block ().get (), prefix, + canonical_prefix); + + resolver->get_name_scope ().pop (); + resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); +} + +void +ResolveExpr::resolve_closure_param (AST::ClosureParam ¶m) +{ + PatternDeclaration::go (param.get_pattern ().get ()); + + if (param.has_type_given ()) + ResolveType::go (param.get_type ().get ()); +} + ResolveExpr::ResolveExpr (const CanonicalPath &prefix, const CanonicalPath &canonical_prefix) : ResolverBase (), prefix (prefix), canonical_prefix (canonical_prefix) diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.h b/gcc/rust/resolve/rust-ast-resolve-expr.h index 60ae172..9e3e775 100644 --- a/gcc/rust/resolve/rust-ast-resolve-expr.h +++ b/gcc/rust/resolve/rust-ast-resolve-expr.h @@ -75,6 +75,11 @@ public: void visit (AST::RangeToExpr &expr) override; void visit (AST::RangeFullExpr &expr) override; void visit (AST::RangeFromToInclExpr &expr) override; + void visit (AST::ClosureExprInner &expr) override; + void visit (AST::ClosureExprInnerTyped &expr) override; + +protected: + void resolve_closure_param (AST::ClosureParam ¶m); private: ResolveExpr (const CanonicalPath &prefix,