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