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.
This commit is contained in:
parent
9e19f329e5
commit
977e0e5227
2 changed files with 63 additions and 0 deletions
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue