diff options
author | Philip Herron <philip.herron@embecosm.com> | 2021-12-14 23:30:25 +0000 |
---|---|---|
committer | Philip Herron <philip.herron@embecosm.com> | 2021-12-16 10:25:01 +0000 |
commit | 4dba290c35d2d5023173c6a2d75741b1a4d549ab (patch) | |
tree | b28ac925df0e28c95cd5a6ad84173935783f346d /gcc/rust/resolve/rust-ast-resolve-expr.h | |
parent | 3629645386ad503606f29f95c2e16d0600df6e20 (diff) | |
download | gcc-4dba290c35d2d5023173c6a2d75741b1a4d549ab.zip gcc-4dba290c35d2d5023173c6a2d75741b1a4d549ab.tar.gz gcc-4dba290c35d2d5023173c6a2d75741b1a4d549ab.tar.bz2 |
Add initial name-resolution for match-expr
Diffstat (limited to 'gcc/rust/resolve/rust-ast-resolve-expr.h')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-expr.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.h b/gcc/rust/resolve/rust-ast-resolve-expr.h index 05d116f..5f496a6 100644 --- a/gcc/rust/resolve/rust-ast-resolve-expr.h +++ b/gcc/rust/resolve/rust-ast-resolve-expr.h @@ -24,6 +24,7 @@ #include "rust-ast-resolve-struct-expr-field.h" #include "rust-ast-verify-assignee.h" #include "rust-ast-resolve-type.h" +#include "rust-ast-resolve-pattern.h" namespace Rust { namespace Resolver { @@ -409,6 +410,41 @@ public: ResolveExpr::go (expr.get_dereferenced_expr ().get (), expr.get_node_id ()); } + void visit (AST::MatchExpr &expr) override + { + ResolveExpr::go (expr.get_scrutinee_expr ().get (), expr.get_node_id ()); + for (auto &match_case : expr.get_match_cases ()) + { + // each arm is in its own scope + NodeId scope_node_id = match_case.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 ()); + + // resolve + AST::MatchArm &arm = match_case.get_arm (); + if (arm.has_match_arm_guard ()) + ResolveExpr::go (arm.get_guard_expr ().get (), expr.get_node_id ()); + + // insert any possible new patterns + for (auto &pattern : arm.get_patterns ()) + { + PatternDeclaration::go (pattern.get (), expr.get_node_id ()); + } + + // resolve the body + ResolveExpr::go (match_case.get_expr ().get (), expr.get_node_id ()); + + // done + resolver->get_name_scope ().pop (); + resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); + } + } + private: ResolveExpr (NodeId parent) : ResolverBase (parent) {} }; |