]>
Commit | Line | Data |
---|---|---|
a945c346 | 1 | // Copyright (C) 2020-2024 Free Software Foundation, Inc. |
019b2f15 PH |
2 | |
3 | // This file is part of GCC. | |
4 | ||
5 | // GCC is free software; you can redistribute it and/or modify it under | |
6 | // the terms of the GNU General Public License as published by the Free | |
7 | // Software Foundation; either version 3, or (at your option) any later | |
8 | // version. | |
9 | ||
10 | // GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
11 | // WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 | // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
13 | // for more details. | |
14 | ||
15 | // You should have received a copy of the GNU General Public License | |
16 | // along with GCC; see the file COPYING3. If not see | |
17 | // <http://www.gnu.org/licenses/>. | |
18 | ||
19 | #ifndef RUST_COMPILE_VAR_DECL | |
20 | #define RUST_COMPILE_VAR_DECL | |
21 | ||
22 | #include "rust-compile-base.h" | |
23 | #include "rust-hir-visitor.h" | |
24 | ||
25 | namespace Rust { | |
26 | namespace Compile { | |
27 | ||
28 | class CompileVarDecl : public HIRCompileBase, public HIR::HIRPatternVisitor | |
29 | { | |
30 | using HIR::HIRPatternVisitor::visit; | |
31 | ||
32 | public: | |
b4fc851e PH |
33 | static std::vector<Bvariable *> compile (tree fndecl, tree translated_type, |
34 | HIR::Pattern *pattern, Context *ctx) | |
019b2f15 | 35 | { |
b4fc851e | 36 | CompileVarDecl compiler (ctx, fndecl, translated_type); |
019b2f15 | 37 | pattern->accept_vis (compiler); |
b4fc851e | 38 | return compiler.vars; |
019b2f15 PH |
39 | } |
40 | ||
41 | void visit (HIR::IdentifierPattern &pattern) override | |
42 | { | |
43 | if (!pattern.is_mut ()) | |
f14cbab8 | 44 | translated_type = Backend::immutable_type (translated_type); |
019b2f15 | 45 | |
b4fc851e PH |
46 | tree bind_tree = ctx->peek_enclosing_scope (); |
47 | std::string identifier = pattern.get_identifier ().as_string (); | |
48 | tree decl | |
49 | = build_decl (pattern.get_locus (), VAR_DECL, | |
50 | Backend::get_identifier_node (identifier), translated_type); | |
51 | DECL_CONTEXT (decl) = fndecl; | |
52 | ||
53 | gcc_assert (TREE_CODE (bind_tree) == BIND_EXPR); | |
54 | tree block_tree = BIND_EXPR_BLOCK (bind_tree); | |
55 | gcc_assert (TREE_CODE (block_tree) == BLOCK); | |
56 | DECL_CHAIN (decl) = BLOCK_VARS (block_tree); | |
57 | BLOCK_VARS (block_tree) = decl; | |
58 | BIND_EXPR_VARS (bind_tree) = BLOCK_VARS (block_tree); | |
59 | ||
60 | rust_preserve_from_gc (decl); | |
61 | Bvariable *var = new Bvariable (decl); | |
019b2f15 | 62 | |
a45f9303 | 63 | HirId stmt_id = pattern.get_mappings ().get_hirid (); |
881ed7fb OA |
64 | ctx->insert_var_decl (stmt_id, var); |
65 | ||
b4fc851e PH |
66 | vars.push_back (var); |
67 | } | |
68 | ||
69 | void visit (HIR::TuplePattern &pattern) override | |
70 | { | |
71 | switch (pattern.get_items ()->get_item_type ()) | |
72 | { | |
73 | case HIR::TuplePatternItems::ItemType::MULTIPLE: { | |
74 | rust_assert (TREE_CODE (translated_type) == RECORD_TYPE); | |
75 | auto &items = static_cast<HIR::TuplePatternItemsMultiple &> ( | |
76 | *pattern.get_items ()); | |
77 | ||
78 | size_t offs = 0; | |
79 | for (auto &sub : items.get_patterns ()) | |
80 | { | |
81 | tree sub_ty = error_mark_node; | |
82 | tree field = TYPE_FIELDS (translated_type); | |
83 | for (size_t i = 0; i < offs; i++) | |
84 | { | |
85 | field = DECL_CHAIN (field); | |
86 | gcc_assert (field != NULL_TREE); | |
87 | } | |
88 | sub_ty = TREE_TYPE (field); | |
89 | CompileVarDecl::compile (fndecl, sub_ty, sub.get (), ctx); | |
90 | offs++; | |
91 | } | |
92 | } | |
93 | break; | |
94 | ||
95 | default: | |
96 | break; | |
97 | } | |
019b2f15 PH |
98 | } |
99 | ||
019b2f15 | 100 | // Empty visit for unused Pattern HIR nodes. |
e1af4688 | 101 | void visit (HIR::AltPattern &) override {} |
019b2f15 PH |
102 | void visit (HIR::LiteralPattern &) override {} |
103 | void visit (HIR::PathInExpression &) override {} | |
104 | void visit (HIR::QualifiedPathInExpression &) override {} | |
105 | void visit (HIR::RangePattern &) override {} | |
106 | void visit (HIR::ReferencePattern &) override {} | |
107 | void visit (HIR::SlicePattern &) override {} | |
108 | void visit (HIR::StructPattern &) override {} | |
019b2f15 | 109 | void visit (HIR::TupleStructPattern &) override {} |
e81f5be6 | 110 | void visit (HIR::WildcardPattern &) override {} |
019b2f15 PH |
111 | |
112 | private: | |
b4fc851e PH |
113 | CompileVarDecl (Context *ctx, tree fndecl, tree translated_type) |
114 | : HIRCompileBase (ctx), fndecl (fndecl), translated_type (translated_type) | |
019b2f15 PH |
115 | {} |
116 | ||
117 | tree fndecl; | |
118 | tree translated_type; | |
119 | ||
b4fc851e | 120 | std::vector<Bvariable *> vars; |
019b2f15 PH |
121 | }; |
122 | ||
123 | } // namespace Compile | |
124 | } // namespace Rust | |
125 | ||
126 | #endif // RUST_COMPILE_VAR_DECL |