diff options
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-stmt.h | 66 |
1 files changed, 64 insertions, 2 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h index 7ff80e4..3fd1cfa 100644 --- a/gcc/rust/resolve/rust-ast-resolve-stmt.h +++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h @@ -39,8 +39,6 @@ public: stmt->accept_vis (resolver); }; - ~ResolveStmt () {} - void visit (AST::ExprStmtWithBlock &stmt) override { ResolveExpr::go (stmt.get_expr ().get (), stmt.get_node_id ()); @@ -67,6 +65,70 @@ public: ResolveType::go (stmt.get_type ().get (), stmt.get_node_id ()); } + void visit (AST::TupleStruct &struct_decl) override + { + auto path = CanonicalPath (struct_decl.get_identifier ()); + resolver->get_type_scope ().insert ( + path, struct_decl.get_node_id (), struct_decl.get_locus (), false, + [&] (const CanonicalPath &, NodeId, Location locus) -> void { + RichLocation r (struct_decl.get_locus ()); + r.add_range (locus); + rust_error_at (r, "redefined multiple times"); + }); + + NodeId scope_node_id = struct_decl.get_node_id (); + resolver->get_type_scope ().push (scope_node_id); + + if (struct_decl.has_generics ()) + { + for (auto &generic : struct_decl.get_generic_params ()) + { + ResolveGenericParam::go (generic.get (), + struct_decl.get_node_id ()); + } + } + + struct_decl.iterate ([&] (AST::TupleField &field) mutable -> bool { + ResolveType::go (field.get_field_type ().get (), + struct_decl.get_node_id ()); + return true; + }); + + resolver->get_type_scope ().pop (); + } + + void visit (AST::StructStruct &struct_decl) override + { + auto path = CanonicalPath (struct_decl.get_identifier ()); + resolver->get_type_scope ().insert ( + path, struct_decl.get_node_id (), struct_decl.get_locus (), false, + [&] (const CanonicalPath &, NodeId, Location locus) -> void { + RichLocation r (struct_decl.get_locus ()); + r.add_range (locus); + rust_error_at (r, "redefined multiple times"); + }); + + NodeId scope_node_id = struct_decl.get_node_id (); + resolver->get_type_scope ().push (scope_node_id); + + if (struct_decl.has_generics ()) + { + for (auto &generic : struct_decl.get_generic_params ()) + { + ResolveGenericParam::go (generic.get (), + struct_decl.get_node_id ()); + } + } + + struct_decl.iterate ([&] (AST::StructField &field) mutable -> bool { + ResolveType::go (field.get_field_type ().get (), + struct_decl.get_node_id ()); + return true; + }); + + resolver->get_type_scope ().pop (); + } + private: ResolveStmt (NodeId parent) : ResolverBase (parent) {} }; |