Line data Source code
1 : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
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_HIR_FUNCTION_COLLECTOR_H
20 : #define RUST_HIR_FUNCTION_COLLECTOR_H
21 :
22 : #include "rust-hir-expr.h"
23 : #include "rust-hir-item.h"
24 : #include "rust-hir-visitor.h"
25 : #include "rust-hir.h"
26 : #include "rust-system.h"
27 :
28 : namespace Rust {
29 :
30 : // Collects all HIR items eligible for borrow checking.
31 11 : class FunctionCollector : public HIR::HIRFullVisitor
32 : {
33 : std::vector<HIR::Function *> functions;
34 : std::vector<HIR::ClosureExpr *> closures;
35 :
36 : public:
37 11 : void go (HIR::Crate &crate) { visit_all (crate.get_items ()); }
38 :
39 : WARN_UNUSED_RESULT const std::vector<HIR::Function *> &get_functions () const
40 : {
41 : return functions;
42 : }
43 :
44 : WARN_UNUSED_RESULT const std::vector<HIR::ClosureExpr *> &
45 : get_closures () const
46 : {
47 : return closures;
48 : }
49 :
50 : protected:
51 11 : template <typename T> void visit_all (std::vector<std::unique_ptr<T>> &items)
52 : {
53 53 : for (std::unique_ptr<T> &item : items)
54 42 : item->accept_vis (*this);
55 11 : }
56 :
57 36 : void visit (HIR::Function &function) override
58 : {
59 36 : functions.push_back (&function);
60 36 : function.get_definition ().accept_vis (*this);
61 36 : }
62 :
63 0 : void visit (HIR::ClosureExpr &closure) override
64 : {
65 0 : closures.push_back (&closure);
66 0 : closure.get_expr ().accept_vis (*this);
67 0 : }
68 :
69 : // TODO: recurse for nested closures and functions.
70 : public:
71 0 : void visit (HIR::Lifetime &lifetime) override {}
72 0 : void visit (HIR::LifetimeParam &lifetime_param) override {}
73 0 : void visit (HIR::PathInExpression &path) override {}
74 0 : void visit (HIR::TypePathSegment &segment) override {}
75 0 : void visit (HIR::TypePathSegmentGeneric &segment) override {}
76 0 : void visit (HIR::TypePathSegmentFunction &segment) override {}
77 0 : void visit (HIR::TypePath &path) override {}
78 0 : void visit (HIR::QualifiedPathInExpression &path) override {}
79 0 : void visit (HIR::QualifiedPathInType &path) override {}
80 0 : void visit (HIR::LiteralExpr &expr) override {}
81 0 : void visit (HIR::BorrowExpr &expr) override {}
82 0 : void visit (HIR::DereferenceExpr &expr) override {}
83 0 : void visit (HIR::ErrorPropagationExpr &expr) override {}
84 0 : void visit (HIR::NegationExpr &expr) override {}
85 0 : void visit (HIR::ArithmeticOrLogicalExpr &expr) override {}
86 0 : void visit (HIR::ComparisonExpr &expr) override {}
87 0 : void visit (HIR::LazyBooleanExpr &expr) override {}
88 0 : void visit (HIR::TypeCastExpr &expr) override {}
89 0 : void visit (HIR::AssignmentExpr &expr) override {}
90 0 : void visit (HIR::CompoundAssignmentExpr &expr) override {}
91 0 : void visit (HIR::GroupedExpr &expr) override {}
92 0 : void visit (HIR::ArrayElemsValues &elems) override {}
93 0 : void visit (HIR::ArrayElemsCopied &elems) override {}
94 0 : void visit (HIR::ArrayExpr &expr) override {}
95 0 : void visit (HIR::ArrayIndexExpr &expr) override {}
96 0 : void visit (HIR::TupleExpr &expr) override {}
97 0 : void visit (HIR::TupleIndexExpr &expr) override {}
98 0 : void visit (HIR::StructExprStruct &expr) override {}
99 0 : void visit (HIR::StructExprFieldIdentifier &field) override {}
100 0 : void visit (HIR::StructExprFieldIdentifierValue &field) override {}
101 0 : void visit (HIR::StructExprFieldIndexValue &field) override {}
102 0 : void visit (HIR::StructExprStructFields &expr) override {}
103 0 : void visit (HIR::StructExprStructBase &expr) override {}
104 0 : void visit (HIR::CallExpr &expr) override {}
105 0 : void visit (HIR::MethodCallExpr &expr) override {}
106 0 : void visit (HIR::FieldAccessExpr &expr) override {}
107 36 : void visit (HIR::BlockExpr &expr) override {}
108 0 : void visit (HIR::AnonConst &expr) override {}
109 0 : void visit (HIR::ConstBlock &expr) override {}
110 0 : void visit (HIR::ContinueExpr &expr) override {}
111 0 : void visit (HIR::BreakExpr &expr) override {}
112 0 : void visit (HIR::RangeFromToExpr &expr) override {}
113 0 : void visit (HIR::RangeFromExpr &expr) override {}
114 0 : void visit (HIR::RangeToExpr &expr) override {}
115 0 : void visit (HIR::RangeFullExpr &expr) override {}
116 0 : void visit (HIR::RangeFromToInclExpr &expr) override {}
117 0 : void visit (HIR::RangeToInclExpr &expr) override {}
118 0 : void visit (HIR::ReturnExpr &expr) override {}
119 0 : void visit (HIR::UnsafeBlockExpr &expr) override {}
120 0 : void visit (HIR::LoopExpr &expr) override {}
121 0 : void visit (HIR::WhileLoopExpr &expr) override {}
122 0 : void visit (HIR::WhileLetLoopExpr &expr) override {}
123 0 : void visit (HIR::IfExpr &expr) override {}
124 0 : void visit (HIR::IfExprConseqElse &expr) override {}
125 0 : void visit (HIR::MatchExpr &expr) override {}
126 0 : void visit (HIR::AwaitExpr &expr) override {}
127 0 : void visit (HIR::AsyncBlockExpr &expr) override {}
128 0 : void visit (HIR::InlineAsm &expr) override {}
129 0 : void visit (HIR::LlvmInlineAsm &expr) override {}
130 0 : void visit (HIR::OffsetOf &expr) override {}
131 0 : void visit (HIR::TypeParam ¶m) override {}
132 0 : void visit (HIR::ConstGenericParam ¶m) override {}
133 0 : void visit (HIR::LifetimeWhereClauseItem &item) override {}
134 0 : void visit (HIR::TypeBoundWhereClauseItem &item) override {}
135 0 : void visit (HIR::Module &module) override {}
136 0 : void visit (HIR::ExternCrate &crate) override {}
137 0 : void visit (HIR::UseTreeGlob &use_tree) override {}
138 0 : void visit (HIR::UseTreeList &use_tree) override {}
139 0 : void visit (HIR::UseTreeRebind &use_tree) override {}
140 0 : void visit (HIR::UseDeclaration &use_decl) override {}
141 0 : void visit (HIR::TypeAlias &type_alias) override {}
142 2 : void visit (HIR::StructStruct &struct_item) override {}
143 0 : void visit (HIR::TupleStruct &tuple_struct) override {}
144 0 : void visit (HIR::EnumItem &item) override {}
145 0 : void visit (HIR::EnumItemTuple &item) override {}
146 0 : void visit (HIR::EnumItemStruct &item) override {}
147 0 : void visit (HIR::EnumItemDiscriminant &item) override {}
148 0 : void visit (HIR::Enum &enum_item) override {}
149 0 : void visit (HIR::Union &union_item) override {}
150 0 : void visit (HIR::ConstantItem &const_item) override {}
151 0 : void visit (HIR::StaticItem &static_item) override {}
152 0 : void visit (HIR::TraitItemFunc &item) override {}
153 0 : void visit (HIR::TraitItemConst &item) override {}
154 0 : void visit (HIR::TraitItemType &item) override {}
155 2 : void visit (HIR::Trait &trait) override {}
156 2 : void visit (HIR::ImplBlock &impl) override {}
157 0 : void visit (HIR::ExternalStaticItem &item) override {}
158 0 : void visit (HIR::ExternalFunctionItem &item) override {}
159 0 : void visit (HIR::ExternalTypeItem &item) override {}
160 0 : void visit (HIR::ExternBlock &block) override {}
161 0 : void visit (HIR::LiteralPattern &pattern) override {}
162 0 : void visit (HIR::IdentifierPattern &pattern) override {}
163 0 : void visit (HIR::WildcardPattern &pattern) override {}
164 0 : void visit (HIR::RangePatternBoundLiteral &bound) override {}
165 0 : void visit (HIR::RangePatternBoundPath &bound) override {}
166 0 : void visit (HIR::RangePatternBoundQualPath &bound) override {}
167 0 : void visit (HIR::RangePattern &pattern) override {}
168 0 : void visit (HIR::ReferencePattern &pattern) override {}
169 0 : void visit (HIR::StructPatternFieldTuplePat &field) override {}
170 0 : void visit (HIR::StructPatternFieldIdentPat &field) override {}
171 0 : void visit (HIR::StructPatternFieldIdent &field) override {}
172 0 : void visit (HIR::StructPattern &pattern) override {}
173 0 : void visit (HIR::TupleStructItemsNoRest &tuple_items) override {}
174 0 : void visit (HIR::TupleStructItemsHasRest &tuple_items) override {}
175 0 : void visit (HIR::TupleStructPattern &pattern) override {}
176 0 : void visit (HIR::TuplePatternItemsNoRest &tuple_items) override {}
177 0 : void visit (HIR::TuplePatternItemsHasRest &tuple_items) override {}
178 0 : void visit (HIR::TuplePattern &pattern) override {}
179 0 : void visit (HIR::SlicePatternItemsNoRest &tuple_items) override {}
180 0 : void visit (HIR::SlicePatternItemsHasRest &tuple_items) override {}
181 0 : void visit (HIR::SlicePattern &pattern) override {}
182 0 : void visit (HIR::AltPattern &pattern) override {}
183 0 : void visit (HIR::EmptyStmt &stmt) override {}
184 0 : void visit (HIR::LetStmt &stmt) override {}
185 0 : void visit (HIR::ExprStmt &stmt) override {}
186 0 : void visit (HIR::TraitBound &bound) override {}
187 0 : void visit (HIR::ImplTraitType &type) override {}
188 0 : void visit (HIR::TraitObjectType &type) override {}
189 0 : void visit (HIR::ParenthesisedType &type) override {}
190 0 : void visit (HIR::TupleType &type) override {}
191 0 : void visit (HIR::NeverType &type) override {}
192 0 : void visit (HIR::RawPointerType &type) override {}
193 0 : void visit (HIR::ReferenceType &type) override {}
194 0 : void visit (HIR::ArrayType &type) override {}
195 0 : void visit (HIR::SliceType &type) override {}
196 0 : void visit (HIR::InferredType &type) override {}
197 0 : void visit (HIR::BareFunctionType &type) override {}
198 : };
199 :
200 : } // namespace Rust
201 :
202 : #endif // RUST_HIR_FUNCTION_COLLECTOR_H
|