aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve/rust-ast-resolve-expr.cc
diff options
context:
space:
mode:
authorPhilip Herron <philip.herron@embecosm.com>2022-10-17 17:51:15 +0100
committerPhilip Herron <philip.herron@embecosm.com>2022-10-19 19:32:47 +0100
commit8c4cf085d9afeada0e6c79c29904ee597c51bd25 (patch)
tree323ff05d3a99d2122705fe174992afc84f3acdb6 /gcc/rust/resolve/rust-ast-resolve-expr.cc
parent8e2d13922fb4af8d00bdabd7af964e4f11b84259 (diff)
downloadgcc-8c4cf085d9afeada0e6c79c29904ee597c51bd25.zip
gcc-8c4cf085d9afeada0e6c79c29904ee597c51bd25.tar.gz
gcc-8c4cf085d9afeada0e6c79c29904ee597c51bd25.tar.bz2
Add name resolution for closures
This is the first pass at name resolution, it simply creates a new rib for the closure. We eventually need more checks here to enforce what things can be included within the closure.
Diffstat (limited to 'gcc/rust/resolve/rust-ast-resolve-expr.cc')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-expr.cc58
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.cc b/gcc/rust/resolve/rust-ast-resolve-expr.cc
index 4cc4e26..60b3eba 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 &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)