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:
Philip Herron 2022-10-17 17:51:15 +01:00 committed by Arthur Cohen
parent 9e19f329e5
commit 977e0e5227
2 changed files with 63 additions and 0 deletions

View file

@ -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 &param)
{
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)

View file

@ -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 &param);
private:
ResolveExpr (const CanonicalPath &prefix,