aboutsummaryrefslogtreecommitdiff
path: root/gcc/rust/resolve/rust-ast-resolve-expr.h
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2022-02-20 14:03:54 +0000
committerGitHub <noreply@github.com>2022-02-20 14:03:54 +0000
commit4e096b1f14671270fb0c7b449d92b3e558bb769d (patch)
tree78a11bc9609835f9d9cec8cb645df08193eece16 /gcc/rust/resolve/rust-ast-resolve-expr.h
parent31387e76090007b12da82d7ef11b042e88df0ba5 (diff)
parent3dd4ce76a69e786b56a9af8b911590fc6410cc97 (diff)
downloadgcc-4e096b1f14671270fb0c7b449d92b3e558bb769d.zip
gcc-4e096b1f14671270fb0c7b449d92b3e558bb769d.tar.gz
gcc-4e096b1f14671270fb0c7b449d92b3e558bb769d.tar.bz2
Merge #951
951: Add name resolution to slices r=philberty a=philberty This is the first part to support slices where we complete the name resolution of the SliceType with its element as well as the range expressions used in construction. This patch also includes separation of the implementation from the headers to try and incrementally improve build speed. Addresses #849 Co-authored-by: Philip Herron <philip.herron@embecosm.com>
Diffstat (limited to 'gcc/rust/resolve/rust-ast-resolve-expr.h')
-rw-r--r--gcc/rust/resolve/rust-ast-resolve-expr.h394
1 files changed, 44 insertions, 350 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.h b/gcc/rust/resolve/rust-ast-resolve-expr.h
index bb1cbb0..d8bd203 100644
--- a/gcc/rust/resolve/rust-ast-resolve-expr.h
+++ b/gcc/rust/resolve/rust-ast-resolve-expr.h
@@ -21,10 +21,6 @@
#include "rust-ast-resolve-base.h"
#include "rust-ast-full.h"
-#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 {
@@ -64,393 +60,91 @@ class ResolveExpr : public ResolverBase
public:
static void go (AST::Expr *expr, NodeId parent, const CanonicalPath &prefix,
- const CanonicalPath &canonical_prefix)
- {
- ResolveExpr resolver (parent, prefix, canonical_prefix);
- expr->accept_vis (resolver);
- };
+ const CanonicalPath &canonical_prefix);
- void visit (AST::MacroInvocation &expr) override
- {
- AST::ASTFragment &fragment = expr.get_fragment ();
- for (auto &node : fragment.get_nodes ())
- node.accept_vis (*this);
- }
+ void visit (AST::MacroInvocation &expr) override;
- void visit (AST::TupleIndexExpr &expr) override
- {
- resolve_expr (expr.get_tuple_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::TupleIndexExpr &expr) override;
- void visit (AST::TupleExpr &expr) override
- {
- if (expr.is_unit ())
- return;
+ void visit (AST::TupleExpr &expr) override;
- for (auto &elem : expr.get_tuple_elems ())
- resolve_expr (elem.get (), expr.get_node_id ());
- }
+ void visit (AST::PathInExpression &expr) override;
- void visit (AST::PathInExpression &expr) override
- {
- ResolvePath::go (&expr, parent);
- }
+ void visit (AST::QualifiedPathInExpression &expr) override;
- void visit (AST::QualifiedPathInExpression &expr) override
- {
- ResolvePath::go (&expr, parent);
- }
+ void visit (AST::ReturnExpr &expr) override;
- void visit (AST::ReturnExpr &expr) override
- {
- if (expr.has_returned_expr ())
- resolve_expr (expr.get_returned_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::CallExpr &expr) override;
- void visit (AST::CallExpr &expr) override
- {
- resolve_expr (expr.get_function_expr ().get (), expr.get_node_id ());
- auto const &in_params = expr.get_params ();
- for (auto &param : in_params)
- resolve_expr (param.get (), expr.get_node_id ());
- }
+ void visit (AST::MethodCallExpr &expr) override;
- void visit (AST::MethodCallExpr &expr) override
- {
- resolve_expr (expr.get_receiver_expr ().get (), expr.get_node_id ());
+ void visit (AST::AssignmentExpr &expr) override;
- if (expr.get_method_name ().has_generic_args ())
- {
- AST::GenericArgs &args = expr.get_method_name ().get_generic_args ();
- ResolveTypeToCanonicalPath::type_resolve_generic_args (args);
- }
+ void visit (AST::IdentifierExpr &expr) override;
- auto const &in_params = expr.get_params ();
- for (auto &param : in_params)
- resolve_expr (param.get (), expr.get_node_id ());
- }
+ void visit (AST::ArithmeticOrLogicalExpr &expr) override;
- void visit (AST::AssignmentExpr &expr) override
- {
- resolve_expr (expr.get_left_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_right_expr ().get (), expr.get_node_id ());
+ void visit (AST::CompoundAssignmentExpr &expr) override;
- // need to verify the assignee
- VerifyAsignee::go (expr.get_left_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::ComparisonExpr &expr) override;
- void visit (AST::IdentifierExpr &expr) override
- {
- if (resolver->get_name_scope ().lookup (
- CanonicalPath::new_seg (expr.get_node_id (), expr.as_string ()),
- &resolved_node))
- {
- resolver->insert_resolved_name (expr.get_node_id (), resolved_node);
- resolver->insert_new_definition (expr.get_node_id (),
- Definition{expr.get_node_id (),
- parent});
- }
- else if (resolver->get_type_scope ().lookup (
- CanonicalPath::new_seg (expr.get_node_id (), expr.as_string ()),
- &resolved_node))
- {
- resolver->insert_resolved_type (expr.get_node_id (), resolved_node);
- resolver->insert_new_definition (expr.get_node_id (),
- Definition{expr.get_node_id (),
- parent});
- }
- else
- {
- rust_error_at (expr.get_locus (), "failed to find name: %s",
- expr.as_string ().c_str ());
- }
- }
+ void visit (AST::LazyBooleanExpr &expr) override;
- void visit (AST::ArithmeticOrLogicalExpr &expr) override
- {
- resolve_expr (expr.get_left_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_right_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::NegationExpr &expr) override;
- void visit (AST::CompoundAssignmentExpr &expr) override
- {
- resolve_expr (expr.get_left_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_right_expr ().get (), expr.get_node_id ());
+ void visit (AST::TypeCastExpr &expr) override;
- // need to verify the assignee
- VerifyAsignee::go (expr.get_left_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::IfExpr &expr) override;
- void visit (AST::ComparisonExpr &expr) override
- {
- resolve_expr (expr.get_left_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_right_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::IfExprConseqElse &expr) override;
- void visit (AST::LazyBooleanExpr &expr) override
- {
- resolve_expr (expr.get_left_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_right_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::IfExprConseqIf &expr) override;
- void visit (AST::NegationExpr &expr) override
- {
- resolve_expr (expr.get_negated_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::BlockExpr &expr) override;
- void visit (AST::TypeCastExpr &expr) override
- {
- ResolveType::go (expr.get_type_to_cast_to ().get (), expr.get_node_id ());
- resolve_expr (expr.get_casted_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::UnsafeBlockExpr &expr) override;
- void visit (AST::IfExpr &expr) override
- {
- resolve_expr (expr.get_condition_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_if_block ().get (), expr.get_node_id ());
- }
+ void visit (AST::ArrayElemsValues &elems) override;
- void visit (AST::IfExprConseqElse &expr) override
- {
- resolve_expr (expr.get_condition_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_if_block ().get (), expr.get_node_id ());
- resolve_expr (expr.get_else_block ().get (), expr.get_node_id ());
- }
+ void visit (AST::ArrayExpr &expr) override;
- void visit (AST::IfExprConseqIf &expr) override
- {
- resolve_expr (expr.get_condition_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_if_block ().get (), expr.get_node_id ());
- resolve_expr (expr.get_conseq_if_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::ArrayIndexExpr &expr) override;
- void visit (AST::BlockExpr &expr) override;
+ void visit (AST::ArrayElemsCopied &elems) override;
- void visit (AST::UnsafeBlockExpr &expr) override
- {
- expr.get_block_expr ()->accept_vis (*this);
- }
+ // this this an empty struct constructor like 'S {}'
+ void visit (AST::StructExprStruct &struct_expr) override;
- void visit (AST::ArrayElemsValues &elems) override
- {
- for (auto &elem : elems.get_values ())
- resolve_expr (elem.get (), elems.get_node_id ());
- }
+ // this this a struct constructor with fields
+ void visit (AST::StructExprStructFields &struct_expr) override;
- void visit (AST::ArrayExpr &expr) override
- {
- expr.get_array_elems ()->accept_vis (*this);
- }
+ void visit (AST::GroupedExpr &expr) override;
- void visit (AST::ArrayIndexExpr &expr) override
- {
- resolve_expr (expr.get_array_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_index_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::FieldAccessExpr &expr) override;
- void visit (AST::ArrayElemsCopied &elems) override
- {
- resolve_expr (elems.get_num_copies ().get (), elems.get_node_id ());
- resolve_expr (elems.get_elem_to_copy ().get (), elems.get_node_id ());
- }
+ void visit (AST::LoopExpr &expr) override;
- // this this an empty struct constructor like 'S {}'
- void visit (AST::StructExprStruct &struct_expr) override
- {
- resolve_expr (&struct_expr.get_struct_name (), struct_expr.get_node_id ());
- }
+ void visit (AST::BreakExpr &expr) override;
- // this this a struct constructor with fields
- void visit (AST::StructExprStructFields &struct_expr) override
- {
- resolve_expr (&struct_expr.get_struct_name (), struct_expr.get_node_id ());
-
- if (struct_expr.has_struct_base ())
- {
- AST::StructBase &base = struct_expr.get_struct_base ();
- resolve_expr (base.get_base_struct ().get (),
- struct_expr.get_node_id ());
- }
-
- auto const &struct_fields = struct_expr.get_fields ();
- for (auto &struct_field : struct_fields)
- {
- ResolveStructExprField::go (struct_field.get (),
- struct_expr.get_node_id (), prefix,
- canonical_prefix);
- }
- }
+ void visit (AST::WhileLoopExpr &expr) override;
- void visit (AST::GroupedExpr &expr) override
- {
- resolve_expr (expr.get_expr_in_parens ().get (), expr.get_node_id ());
- }
+ void visit (AST::ContinueExpr &expr) override;
- void visit (AST::FieldAccessExpr &expr) override
- {
- resolve_expr (expr.get_receiver_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::BorrowExpr &expr) override;
- void visit (AST::LoopExpr &expr) override
- {
- if (expr.has_loop_label ())
- {
- auto label = expr.get_loop_label ();
- if (label.get_lifetime ().get_lifetime_type ()
- != AST::Lifetime::LifetimeType::NAMED)
- {
- rust_error_at (label.get_locus (),
- "Labels must be a named lifetime value");
- return;
- }
-
- auto label_name = label.get_lifetime ().get_lifetime_name ();
- auto label_lifetime_node_id = label.get_lifetime ().get_node_id ();
- resolver->get_label_scope ().insert (
- CanonicalPath::new_seg (expr.get_node_id (), label_name),
- label_lifetime_node_id, label.get_locus (), false,
- [&] (const CanonicalPath &, NodeId, Location locus) -> void {
- rust_error_at (label.get_locus (),
- "label redefined multiple times");
- rust_error_at (locus, "was defined here");
- });
- resolver->insert_new_definition (label_lifetime_node_id,
- Definition{label_lifetime_node_id,
- label.get_node_id ()});
- }
- resolve_expr (expr.get_loop_block ().get (), expr.get_node_id ());
- }
+ void visit (AST::DereferenceExpr &expr) override;
- void visit (AST::BreakExpr &expr) override
- {
- if (expr.has_label ())
- {
- auto label = expr.get_label ();
- if (label.get_lifetime_type () != AST::Lifetime::LifetimeType::NAMED)
- {
- rust_error_at (label.get_locus (),
- "Labels must be a named lifetime value");
- return;
- }
-
- NodeId resolved_node = UNKNOWN_NODEID;
- if (!resolver->get_label_scope ().lookup (
- CanonicalPath::new_seg (label.get_node_id (),
- label.get_lifetime_name ()),
- &resolved_node))
- {
- rust_error_at (expr.get_label ().get_locus (),
- "failed to resolve label");
- return;
- }
- resolver->insert_resolved_label (label.get_node_id (), resolved_node);
- }
-
- if (expr.has_break_expr ())
- resolve_expr (expr.get_break_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::MatchExpr &expr) override;
- void visit (AST::WhileLoopExpr &expr) override
- {
- if (expr.has_loop_label ())
- {
- auto label = expr.get_loop_label ();
- if (label.get_lifetime ().get_lifetime_type ()
- != AST::Lifetime::LifetimeType::NAMED)
- {
- rust_error_at (label.get_locus (),
- "Labels must be a named lifetime value");
- return;
- }
-
- auto label_name = label.get_lifetime ().get_lifetime_name ();
- auto label_lifetime_node_id = label.get_lifetime ().get_node_id ();
- resolver->get_label_scope ().insert (
- CanonicalPath::new_seg (label.get_node_id (), label_name),
- label_lifetime_node_id, label.get_locus (), false,
- [&] (const CanonicalPath &, NodeId, Location locus) -> void {
- rust_error_at (label.get_locus (),
- "label redefined multiple times");
- rust_error_at (locus, "was defined here");
- });
- resolver->insert_new_definition (label_lifetime_node_id,
- Definition{label_lifetime_node_id,
- label.get_node_id ()});
- }
- resolve_expr (expr.get_predicate_expr ().get (), expr.get_node_id ());
- resolve_expr (expr.get_loop_block ().get (), expr.get_node_id ());
- }
+ void visit (AST::RangeFromToExpr &expr) override;
- void visit (AST::ContinueExpr &expr) override
- {
- if (expr.has_label ())
- {
- auto label = expr.get_label ();
- if (label.get_lifetime_type () != AST::Lifetime::LifetimeType::NAMED)
- {
- rust_error_at (label.get_locus (),
- "Labels must be a named lifetime value");
- return;
- }
-
- NodeId resolved_node = UNKNOWN_NODEID;
- if (!resolver->get_label_scope ().lookup (
- CanonicalPath::new_seg (label.get_node_id (),
- label.get_lifetime_name ()),
- &resolved_node))
- {
- rust_error_at (expr.get_label ().get_locus (),
- "failed to resolve label");
- return;
- }
- resolver->insert_resolved_label (label.get_node_id (), resolved_node);
- }
- }
+ void visit (AST::RangeFromExpr &expr) override;
- void visit (AST::BorrowExpr &expr) override
- {
- resolve_expr (expr.get_borrowed_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::RangeToExpr &expr) override;
- void visit (AST::DereferenceExpr &expr) override
- {
- resolve_expr (expr.get_dereferenced_expr ().get (), expr.get_node_id ());
- }
+ void visit (AST::RangeFullExpr &expr) override;
- void visit (AST::MatchExpr &expr) override
- {
- resolve_expr (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 ())
- resolve_expr (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
- resolve_expr (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 ();
- }
- }
+ void visit (AST::RangeFromToInclExpr &expr) override;
protected:
void resolve_expr (AST::Expr *e, NodeId parent)