]>
Commit | Line | Data |
---|---|---|
a945c346 | 1 | // Copyright (C) 2020-2024 Free Software Foundation, Inc. |
7999cf32 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_AST_LOWER_BASE | |
20 | #define RUST_AST_LOWER_BASE | |
21 | ||
22 | #include "rust-system.h" | |
23 | #include "rust-ast-full.h" | |
24 | #include "rust-ast-visitor.h" | |
25 | #include "rust-hir-map.h" | |
26 | #include "rust-hir-full.h" | |
27 | #include "rust-attributes.h" | |
28 | ||
29 | namespace Rust { | |
30 | namespace HIR { | |
31 | ||
8f0b1526 PH |
32 | // proxy class so we can do attribute checking on items and trait items |
33 | class ItemWrapper | |
34 | { | |
35 | public: | |
36 | ItemWrapper (const HIR::Item &item) | |
37 | : mappings (item.get_mappings ()), locus (item.get_locus ()), | |
38 | outer_attrs (item.get_outer_attrs ()) | |
39 | {} | |
40 | ||
41 | ItemWrapper (const HIR::TraitItem &item) | |
42 | : mappings (item.get_mappings ()), locus (item.get_trait_locus ()), | |
43 | outer_attrs (item.get_outer_attrs ()) | |
44 | {} | |
45 | ||
46 | const Analysis::NodeMapping &get_mappings () const { return mappings; } | |
47 | Location get_locus () const { return locus; } | |
48 | const AST::AttrVec &get_outer_attrs () const { return outer_attrs; } | |
49 | ||
50 | private: | |
51 | const Analysis::NodeMapping &mappings; | |
52 | Location locus; | |
53 | const AST::AttrVec &outer_attrs; | |
54 | }; | |
55 | ||
7999cf32 PH |
56 | // base class to allow derivatives to overload as needed |
57 | class ASTLoweringBase : public AST::ASTVisitor | |
58 | { | |
59 | public: | |
60 | virtual ~ASTLoweringBase () {} | |
61 | ||
62 | // visitor impl | |
63 | // rust-ast.h | |
64 | // virtual void visit(AttrInput& attr_input); | |
65 | // virtual void visit(TokenTree& token_tree); | |
66 | // virtual void visit(MacroMatch& macro_match); | |
67 | virtual void visit (AST::Token &tok); | |
68 | virtual void visit (AST::DelimTokenTree &delim_tok_tree); | |
69 | virtual void visit (AST::AttrInputMetaItemContainer &input); | |
70 | // virtual void visit(MetaItem& meta_item); | |
71 | // void vsit(Stmt& stmt); | |
72 | // virtual void visit(Expr& expr); | |
73 | virtual void visit (AST::IdentifierExpr &ident_expr); | |
74 | // virtual void visit(Pattern& pattern); | |
75 | // virtual void visit(Type& type); | |
76 | // virtual void visit(TypeParamBound& type_param_bound); | |
77 | virtual void visit (AST::Lifetime &lifetime); | |
78 | // virtual void visit(GenericParam& generic_param); | |
79 | virtual void visit (AST::LifetimeParam &lifetime_param); | |
80 | virtual void visit (AST::ConstGenericParam &const_param); | |
81 | // virtual void visit(TraitItem& trait_item); | |
82 | // virtual void visit(InherentImplItem& inherent_impl_item); | |
83 | // virtual void visit(TraitImplItem& trait_impl_item); | |
84 | ||
85 | // rust-path.h | |
86 | virtual void visit (AST::PathInExpression &path); | |
87 | virtual void visit (AST::TypePathSegment &segment); | |
88 | virtual void visit (AST::TypePathSegmentGeneric &segment); | |
89 | virtual void visit (AST::TypePathSegmentFunction &segment); | |
90 | virtual void visit (AST::TypePath &path); | |
91 | virtual void visit (AST::QualifiedPathInExpression &path); | |
92 | virtual void visit (AST::QualifiedPathInType &path); | |
93 | ||
94 | // rust-expr.h | |
95 | virtual void visit (AST::LiteralExpr &expr); | |
96 | virtual void visit (AST::AttrInputLiteral &attr_input); | |
97 | virtual void visit (AST::MetaItemLitExpr &meta_item); | |
98 | virtual void visit (AST::MetaItemPathLit &meta_item); | |
99 | virtual void visit (AST::BorrowExpr &expr); | |
100 | virtual void visit (AST::DereferenceExpr &expr); | |
101 | virtual void visit (AST::ErrorPropagationExpr &expr); | |
102 | virtual void visit (AST::NegationExpr &expr); | |
103 | virtual void visit (AST::ArithmeticOrLogicalExpr &expr); | |
104 | virtual void visit (AST::ComparisonExpr &expr); | |
105 | virtual void visit (AST::LazyBooleanExpr &expr); | |
106 | virtual void visit (AST::TypeCastExpr &expr); | |
107 | virtual void visit (AST::AssignmentExpr &expr); | |
108 | virtual void visit (AST::CompoundAssignmentExpr &expr); | |
109 | virtual void visit (AST::GroupedExpr &expr); | |
110 | // virtual void visit(ArrayElems& elems); | |
111 | virtual void visit (AST::ArrayElemsValues &elems); | |
112 | virtual void visit (AST::ArrayElemsCopied &elems); | |
113 | virtual void visit (AST::ArrayExpr &expr); | |
114 | virtual void visit (AST::ArrayIndexExpr &expr); | |
115 | virtual void visit (AST::TupleExpr &expr); | |
116 | virtual void visit (AST::TupleIndexExpr &expr); | |
117 | virtual void visit (AST::StructExprStruct &expr); | |
118 | // virtual void visit(StructExprField& field); | |
119 | virtual void visit (AST::StructExprFieldIdentifier &field); | |
120 | virtual void visit (AST::StructExprFieldIdentifierValue &field); | |
121 | virtual void visit (AST::StructExprFieldIndexValue &field); | |
122 | virtual void visit (AST::StructExprStructFields &expr); | |
123 | virtual void visit (AST::StructExprStructBase &expr); | |
124 | virtual void visit (AST::CallExpr &expr); | |
125 | virtual void visit (AST::MethodCallExpr &expr); | |
126 | virtual void visit (AST::FieldAccessExpr &expr); | |
127 | virtual void visit (AST::ClosureExprInner &expr); | |
128 | virtual void visit (AST::BlockExpr &expr); | |
129 | virtual void visit (AST::ClosureExprInnerTyped &expr); | |
130 | virtual void visit (AST::ContinueExpr &expr); | |
131 | virtual void visit (AST::BreakExpr &expr); | |
132 | virtual void visit (AST::RangeFromToExpr &expr); | |
133 | virtual void visit (AST::RangeFromExpr &expr); | |
134 | virtual void visit (AST::RangeToExpr &expr); | |
135 | virtual void visit (AST::RangeFullExpr &expr); | |
136 | virtual void visit (AST::RangeFromToInclExpr &expr); | |
137 | virtual void visit (AST::RangeToInclExpr &expr); | |
138 | virtual void visit (AST::ReturnExpr &expr); | |
139 | virtual void visit (AST::UnsafeBlockExpr &expr); | |
140 | virtual void visit (AST::LoopExpr &expr); | |
141 | virtual void visit (AST::WhileLoopExpr &expr); | |
142 | virtual void visit (AST::WhileLetLoopExpr &expr); | |
143 | virtual void visit (AST::ForLoopExpr &expr); | |
144 | virtual void visit (AST::IfExpr &expr); | |
145 | virtual void visit (AST::IfExprConseqElse &expr); | |
146 | virtual void visit (AST::IfExprConseqIf &expr); | |
147 | virtual void visit (AST::IfExprConseqIfLet &expr); | |
148 | virtual void visit (AST::IfLetExpr &expr); | |
149 | virtual void visit (AST::IfLetExprConseqElse &expr); | |
150 | virtual void visit (AST::IfLetExprConseqIf &expr); | |
151 | virtual void visit (AST::IfLetExprConseqIfLet &expr); | |
152 | // virtual void visit(MatchCase& match_case); | |
153 | // virtual void visit (AST::MatchCaseBlockExpr &match_case); | |
154 | // virtual void visit (AST::MatchCaseExpr &match_case); | |
155 | virtual void visit (AST::MatchExpr &expr); | |
156 | virtual void visit (AST::AwaitExpr &expr); | |
157 | virtual void visit (AST::AsyncBlockExpr &expr); | |
158 | ||
159 | // rust-item.h | |
160 | virtual void visit (AST::TypeParam ¶m); | |
161 | // virtual void visit(WhereClauseItem& item); | |
162 | virtual void visit (AST::LifetimeWhereClauseItem &item); | |
163 | virtual void visit (AST::TypeBoundWhereClauseItem &item); | |
164 | virtual void visit (AST::Method &method); | |
165 | virtual void visit (AST::Module &module); | |
166 | virtual void visit (AST::ExternCrate &crate); | |
167 | // virtual void visit(UseTree& use_tree); | |
168 | virtual void visit (AST::UseTreeGlob &use_tree); | |
169 | virtual void visit (AST::UseTreeList &use_tree); | |
170 | virtual void visit (AST::UseTreeRebind &use_tree); | |
171 | virtual void visit (AST::UseDeclaration &use_decl); | |
172 | virtual void visit (AST::Function &function); | |
173 | virtual void visit (AST::TypeAlias &type_alias); | |
174 | virtual void visit (AST::StructStruct &struct_item); | |
175 | virtual void visit (AST::TupleStruct &tuple_struct); | |
176 | virtual void visit (AST::EnumItem &item); | |
177 | virtual void visit (AST::EnumItemTuple &item); | |
178 | virtual void visit (AST::EnumItemStruct &item); | |
179 | virtual void visit (AST::EnumItemDiscriminant &item); | |
180 | virtual void visit (AST::Enum &enum_item); | |
181 | virtual void visit (AST::Union &union_item); | |
182 | virtual void visit (AST::ConstantItem &const_item); | |
183 | virtual void visit (AST::StaticItem &static_item); | |
184 | virtual void visit (AST::TraitItemFunc &item); | |
185 | virtual void visit (AST::TraitItemMethod &item); | |
186 | virtual void visit (AST::TraitItemConst &item); | |
187 | virtual void visit (AST::TraitItemType &item); | |
188 | virtual void visit (AST::Trait &trait); | |
189 | virtual void visit (AST::InherentImpl &impl); | |
190 | virtual void visit (AST::TraitImpl &impl); | |
191 | // virtual void visit(ExternalItem& item); | |
192 | virtual void visit (AST::ExternalStaticItem &item); | |
193 | virtual void visit (AST::ExternalFunctionItem &item); | |
194 | virtual void visit (AST::ExternBlock &block); | |
195 | ||
196 | // rust-macro.h | |
197 | virtual void visit (AST::MacroMatchFragment &match); | |
198 | virtual void visit (AST::MacroMatchRepetition &match); | |
199 | virtual void visit (AST::MacroMatcher &matcher); | |
200 | virtual void visit (AST::MacroRulesDefinition &rules_def); | |
201 | virtual void visit (AST::MacroInvocation ¯o_invoc); | |
202 | virtual void visit (AST::MetaItemPath &meta_item); | |
203 | virtual void visit (AST::MetaItemSeq &meta_item); | |
204 | virtual void visit (AST::MetaWord &meta_item); | |
205 | virtual void visit (AST::MetaNameValueStr &meta_item); | |
206 | virtual void visit (AST::MetaListPaths &meta_item); | |
207 | virtual void visit (AST::MetaListNameValueStr &meta_item); | |
208 | ||
209 | // rust-pattern.h | |
210 | virtual void visit (AST::LiteralPattern &pattern); | |
211 | virtual void visit (AST::IdentifierPattern &pattern); | |
212 | virtual void visit (AST::WildcardPattern &pattern); | |
213 | // virtual void visit(RangePatternBound& bound); | |
214 | virtual void visit (AST::RangePatternBoundLiteral &bound); | |
215 | virtual void visit (AST::RangePatternBoundPath &bound); | |
216 | virtual void visit (AST::RangePatternBoundQualPath &bound); | |
217 | virtual void visit (AST::RangePattern &pattern); | |
218 | virtual void visit (AST::ReferencePattern &pattern); | |
219 | // virtual void visit(StructPatternField& field); | |
220 | virtual void visit (AST::StructPatternFieldTuplePat &field); | |
221 | virtual void visit (AST::StructPatternFieldIdentPat &field); | |
222 | virtual void visit (AST::StructPatternFieldIdent &field); | |
223 | virtual void visit (AST::StructPattern &pattern); | |
224 | // virtual void visit(TupleStructItems& tuple_items); | |
225 | virtual void visit (AST::TupleStructItemsNoRange &tuple_items); | |
226 | virtual void visit (AST::TupleStructItemsRange &tuple_items); | |
227 | virtual void visit (AST::TupleStructPattern &pattern); | |
228 | // virtual void visit(TuplePatternItems& tuple_items); | |
229 | virtual void visit (AST::TuplePatternItemsMultiple &tuple_items); | |
230 | virtual void visit (AST::TuplePatternItemsRanged &tuple_items); | |
231 | virtual void visit (AST::TuplePattern &pattern); | |
232 | virtual void visit (AST::GroupedPattern &pattern); | |
233 | virtual void visit (AST::SlicePattern &pattern); | |
8628486f | 234 | virtual void visit (AST::AltPattern &pattern); |
7999cf32 PH |
235 | |
236 | // rust-stmt.h | |
237 | virtual void visit (AST::EmptyStmt &stmt); | |
238 | virtual void visit (AST::LetStmt &stmt); | |
239 | virtual void visit (AST::ExprStmtWithoutBlock &stmt); | |
240 | virtual void visit (AST::ExprStmtWithBlock &stmt); | |
241 | ||
242 | // rust-type.h | |
243 | virtual void visit (AST::TraitBound &bound); | |
244 | virtual void visit (AST::ImplTraitType &type); | |
245 | virtual void visit (AST::TraitObjectType &type); | |
246 | virtual void visit (AST::ParenthesisedType &type); | |
247 | virtual void visit (AST::ImplTraitTypeOneBound &type); | |
248 | virtual void visit (AST::TraitObjectTypeOneBound &type); | |
249 | virtual void visit (AST::TupleType &type); | |
250 | virtual void visit (AST::NeverType &type); | |
251 | virtual void visit (AST::RawPointerType &type); | |
252 | virtual void visit (AST::ReferenceType &type); | |
253 | virtual void visit (AST::ArrayType &type); | |
254 | virtual void visit (AST::SliceType &type); | |
255 | virtual void visit (AST::InferredType &type); | |
256 | virtual void visit (AST::BareFunctionType &type); | |
257 | ||
258 | protected: | |
259 | ASTLoweringBase () | |
260 | : mappings (Analysis::Mappings::get ()), | |
261 | attr_mappings (Analysis::BuiltinAttributeMappings::get ()) | |
262 | {} | |
263 | ||
264 | Analysis::Mappings *mappings; | |
265 | Analysis::BuiltinAttributeMappings *attr_mappings; | |
266 | ||
267 | HIR::Lifetime lower_lifetime (AST::Lifetime &lifetime); | |
268 | ||
269 | HIR::LoopLabel lower_loop_label (AST::LoopLabel &loop_label); | |
270 | ||
271 | std::vector<std::unique_ptr<HIR::GenericParam> > lower_generic_params ( | |
272 | std::vector<std::unique_ptr<AST::GenericParam> > ¶ms); | |
273 | ||
274 | HIR::PathExprSegment lower_path_expr_seg (AST::PathExprSegment &s); | |
275 | ||
276 | HIR::GenericArgs lower_generic_args (AST::GenericArgs &args); | |
277 | ||
278 | HIR::GenericArgsBinding lower_binding (AST::GenericArgsBinding &binding); | |
279 | ||
280 | HIR::SelfParam lower_self (AST::SelfParam &self); | |
281 | ||
282 | HIR::Type *lower_type_no_bounds (AST::TypeNoBounds *type); | |
283 | ||
284 | HIR::TypeParamBound *lower_bound (AST::TypeParamBound *bound); | |
285 | ||
286 | HIR::QualifiedPathType | |
287 | lower_qual_path_type (AST::QualifiedPathType &qual_path_type); | |
288 | ||
289 | HIR::FunctionQualifiers | |
290 | lower_qualifiers (const AST::FunctionQualifiers &qualifiers); | |
291 | ||
8f0b1526 | 292 | void handle_outer_attributes (const ItemWrapper &item); |
7999cf32 | 293 | |
8f0b1526 | 294 | void handle_lang_item_attribute (const ItemWrapper &item, |
7999cf32 PH |
295 | const AST::Attribute &attr); |
296 | ||
8f0b1526 | 297 | void handle_doc_item_attribute (const ItemWrapper &item, |
7999cf32 PH |
298 | const AST::Attribute &attr); |
299 | ||
300 | bool is_known_attribute (const std::string &attribute_path) const; | |
301 | ||
302 | bool | |
303 | attribute_handled_in_another_pass (const std::string &attribute_path) const; | |
304 | ||
305 | std::unique_ptr<TuplePatternItems> | |
306 | lower_tuple_pattern_multiple (AST::TuplePatternItemsMultiple &pattern); | |
307 | ||
308 | std::unique_ptr<TuplePatternItems> | |
309 | lower_tuple_pattern_ranged (AST::TuplePatternItemsRanged &pattern); | |
310 | ||
311 | std::unique_ptr<HIR::RangePatternBound> | |
312 | lower_range_pattern_bound (AST::RangePatternBound *bound); | |
313 | ||
314 | HIR::Literal lower_literal (const AST::Literal &literal); | |
315 | ||
316 | HIR::ExternBlock *lower_extern_block (AST::ExternBlock &extern_block); | |
870dd9d5 PH |
317 | |
318 | HIR::ClosureParam lower_closure_param (AST::ClosureParam ¶m); | |
7999cf32 PH |
319 | }; |
320 | ||
321 | } // namespace HIR | |
322 | } // namespace Rust | |
323 | ||
324 | #endif // RUST_AST_LOWER_BASE |