]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/rust/resolve/rust-early-name-resolver.h
Update copyright years.
[thirdparty/gcc.git] / gcc / rust / resolve / rust-early-name-resolver.h
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_EARLY_NAME_RESOLVER_H
20 #define RUST_EARLY_NAME_RESOLVER_H
21
22 #include "rust-name-resolver.h"
23 #include "rust-system.h"
24 #include "rust-ast.h"
25 #include "rust-ast-visitor.h"
26
27 namespace Rust {
28 namespace Resolver {
29
30 class EarlyNameResolver : public AST::ASTVisitor
31 {
32 public:
33 EarlyNameResolver ();
34
35 void go (AST::Crate &crate);
36
37 private:
38 /**
39 * Execute a lambda within a scope. This is equivalent to calling
40 * `enter_scope` before your code and `exit_scope` after. This ensures
41 * no errors can be committed
42 */
43 void scoped (NodeId scope_id, std::function<void ()> fn)
44 {
45 auto old_scope = current_scope;
46 current_scope = scope_id;
47 resolver.get_macro_scope ().push (scope_id);
48 resolver.push_new_macro_rib (resolver.get_macro_scope ().peek ());
49
50 fn ();
51
52 resolver.get_macro_scope ().pop ();
53 current_scope = old_scope;
54 }
55
56 /**
57 * The "scope" we are currently in.
58 *
59 * This involves lexical scopes:
60 *
61 * ```rust
62 * // current_scope = crate_id;
63 * macro_rules! foo { () => {} )
64 *
65 * {
66 * // current_scope = current_block_id;
67 * macro_rules! foo { () => { something!(); } }
68 * }
69 * // current_scope = crate_id;
70 * ```
71 *
72 * as well as any sort of scope-like structure that might impact import name
73 * resolution or macro name resolution:
74 *
75 * ```rust
76 * macro_rules! foo {
77 * () => { fn empty() {} }
78 * }
79 *
80 *
81 * trait Foo {
82 * fn foo() {
83 * fn inner_foo() {
84 * macro_rules! foo { () => {} )
85 *
86 * foo!();
87 * }
88 *
89 * foo!();
90 * }
91 *
92 * foo!();
93 * }
94 *
95 * foo!();
96 * ```
97 */
98 NodeId current_scope;
99
100 /* The crate's scope */
101 NodeId crate_scope;
102
103 Resolver &resolver;
104 Analysis::Mappings &mappings;
105
106 /**
107 * Early name-resolve generic args, which can be macro invocations
108 */
109 void resolve_generic_args (AST::GenericArgs &generic_args);
110
111 /**
112 * Early name-resolve a qualified path type, which can contain macro
113 * invocations
114 */
115 void resolve_qualified_path_type (AST::QualifiedPathType &path);
116
117 virtual void visit (AST::Token &tok);
118 virtual void visit (AST::DelimTokenTree &delim_tok_tree);
119 virtual void visit (AST::AttrInputMetaItemContainer &input);
120 virtual void visit (AST::IdentifierExpr &ident_expr);
121 virtual void visit (AST::Lifetime &lifetime);
122 virtual void visit (AST::LifetimeParam &lifetime_param);
123 virtual void visit (AST::ConstGenericParam &const_param);
124 virtual void visit (AST::PathInExpression &path);
125 virtual void visit (AST::TypePathSegment &segment);
126 virtual void visit (AST::TypePathSegmentGeneric &segment);
127 virtual void visit (AST::TypePathSegmentFunction &segment);
128 virtual void visit (AST::TypePath &path);
129 virtual void visit (AST::QualifiedPathInExpression &path);
130 virtual void visit (AST::QualifiedPathInType &path);
131 virtual void visit (AST::LiteralExpr &expr);
132 virtual void visit (AST::AttrInputLiteral &attr_input);
133 virtual void visit (AST::MetaItemLitExpr &meta_item);
134 virtual void visit (AST::MetaItemPathLit &meta_item);
135 virtual void visit (AST::BorrowExpr &expr);
136 virtual void visit (AST::DereferenceExpr &expr);
137 virtual void visit (AST::ErrorPropagationExpr &expr);
138 virtual void visit (AST::NegationExpr &expr);
139 virtual void visit (AST::ArithmeticOrLogicalExpr &expr);
140 virtual void visit (AST::ComparisonExpr &expr);
141 virtual void visit (AST::LazyBooleanExpr &expr);
142 virtual void visit (AST::TypeCastExpr &expr);
143 virtual void visit (AST::AssignmentExpr &expr);
144 virtual void visit (AST::CompoundAssignmentExpr &expr);
145 virtual void visit (AST::GroupedExpr &expr);
146 virtual void visit (AST::ArrayElemsValues &elems);
147 virtual void visit (AST::ArrayElemsCopied &elems);
148 virtual void visit (AST::ArrayExpr &expr);
149 virtual void visit (AST::ArrayIndexExpr &expr);
150 virtual void visit (AST::TupleExpr &expr);
151 virtual void visit (AST::TupleIndexExpr &expr);
152 virtual void visit (AST::StructExprStruct &expr);
153 virtual void visit (AST::StructExprFieldIdentifier &field);
154 virtual void visit (AST::StructExprFieldIdentifierValue &field);
155 virtual void visit (AST::StructExprFieldIndexValue &field);
156 virtual void visit (AST::StructExprStructFields &expr);
157 virtual void visit (AST::StructExprStructBase &expr);
158 virtual void visit (AST::CallExpr &expr);
159 virtual void visit (AST::MethodCallExpr &expr);
160 virtual void visit (AST::FieldAccessExpr &expr);
161 virtual void visit (AST::ClosureExprInner &expr);
162 virtual void visit (AST::BlockExpr &expr);
163 virtual void visit (AST::ClosureExprInnerTyped &expr);
164 virtual void visit (AST::ContinueExpr &expr);
165 virtual void visit (AST::BreakExpr &expr);
166 virtual void visit (AST::RangeFromToExpr &expr);
167 virtual void visit (AST::RangeFromExpr &expr);
168 virtual void visit (AST::RangeToExpr &expr);
169 virtual void visit (AST::RangeFullExpr &expr);
170 virtual void visit (AST::RangeFromToInclExpr &expr);
171 virtual void visit (AST::RangeToInclExpr &expr);
172 virtual void visit (AST::ReturnExpr &expr);
173 virtual void visit (AST::UnsafeBlockExpr &expr);
174 virtual void visit (AST::LoopExpr &expr);
175 virtual void visit (AST::WhileLoopExpr &expr);
176 virtual void visit (AST::WhileLetLoopExpr &expr);
177 virtual void visit (AST::ForLoopExpr &expr);
178 virtual void visit (AST::IfExpr &expr);
179 virtual void visit (AST::IfExprConseqElse &expr);
180 virtual void visit (AST::IfExprConseqIf &expr);
181 virtual void visit (AST::IfExprConseqIfLet &expr);
182 virtual void visit (AST::IfLetExpr &expr);
183 virtual void visit (AST::IfLetExprConseqElse &expr);
184 virtual void visit (AST::IfLetExprConseqIf &expr);
185 virtual void visit (AST::IfLetExprConseqIfLet &expr);
186 virtual void visit (AST::MatchExpr &expr);
187 virtual void visit (AST::AwaitExpr &expr);
188 virtual void visit (AST::AsyncBlockExpr &expr);
189 virtual void visit (AST::TypeParam &param);
190 virtual void visit (AST::LifetimeWhereClauseItem &item);
191 virtual void visit (AST::TypeBoundWhereClauseItem &item);
192 virtual void visit (AST::Method &method);
193 virtual void visit (AST::Module &module);
194 virtual void visit (AST::ExternCrate &crate);
195 virtual void visit (AST::UseTreeGlob &use_tree);
196 virtual void visit (AST::UseTreeList &use_tree);
197 virtual void visit (AST::UseTreeRebind &use_tree);
198 virtual void visit (AST::UseDeclaration &use_decl);
199 virtual void visit (AST::Function &function);
200 virtual void visit (AST::TypeAlias &type_alias);
201 virtual void visit (AST::StructStruct &struct_item);
202 virtual void visit (AST::TupleStruct &tuple_struct);
203 virtual void visit (AST::EnumItem &item);
204 virtual void visit (AST::EnumItemTuple &item);
205 virtual void visit (AST::EnumItemStruct &item);
206 virtual void visit (AST::EnumItemDiscriminant &item);
207 virtual void visit (AST::Enum &enum_item);
208 virtual void visit (AST::Union &union_item);
209 virtual void visit (AST::ConstantItem &const_item);
210 virtual void visit (AST::StaticItem &static_item);
211 virtual void visit (AST::TraitItemFunc &item);
212 virtual void visit (AST::TraitItemMethod &item);
213 virtual void visit (AST::TraitItemConst &item);
214 virtual void visit (AST::TraitItemType &item);
215 virtual void visit (AST::Trait &trait);
216 virtual void visit (AST::InherentImpl &impl);
217 virtual void visit (AST::TraitImpl &impl);
218 virtual void visit (AST::ExternalStaticItem &item);
219 virtual void visit (AST::ExternalFunctionItem &item);
220 virtual void visit (AST::ExternBlock &block);
221 virtual void visit (AST::MacroMatchFragment &match);
222 virtual void visit (AST::MacroMatchRepetition &match);
223 virtual void visit (AST::MacroMatcher &matcher);
224 virtual void visit (AST::MacroRulesDefinition &rules_def);
225 virtual void visit (AST::MacroInvocation &macro_invoc);
226 virtual void visit (AST::MetaItemPath &meta_item);
227 virtual void visit (AST::MetaItemSeq &meta_item);
228 virtual void visit (AST::MetaWord &meta_item);
229 virtual void visit (AST::MetaNameValueStr &meta_item);
230 virtual void visit (AST::MetaListPaths &meta_item);
231 virtual void visit (AST::MetaListNameValueStr &meta_item);
232 virtual void visit (AST::LiteralPattern &pattern);
233 virtual void visit (AST::IdentifierPattern &pattern);
234 virtual void visit (AST::WildcardPattern &pattern);
235 virtual void visit (AST::RangePatternBoundLiteral &bound);
236 virtual void visit (AST::RangePatternBoundPath &bound);
237 virtual void visit (AST::RangePatternBoundQualPath &bound);
238 virtual void visit (AST::RangePattern &pattern);
239 virtual void visit (AST::ReferencePattern &pattern);
240 virtual void visit (AST::StructPatternFieldTuplePat &field);
241 virtual void visit (AST::StructPatternFieldIdentPat &field);
242 virtual void visit (AST::StructPatternFieldIdent &field);
243 virtual void visit (AST::StructPattern &pattern);
244 virtual void visit (AST::TupleStructItemsNoRange &tuple_items);
245 virtual void visit (AST::TupleStructItemsRange &tuple_items);
246 virtual void visit (AST::TupleStructPattern &pattern);
247 virtual void visit (AST::TuplePatternItemsMultiple &tuple_items);
248 virtual void visit (AST::TuplePatternItemsRanged &tuple_items);
249 virtual void visit (AST::TuplePattern &pattern);
250 virtual void visit (AST::GroupedPattern &pattern);
251 virtual void visit (AST::SlicePattern &pattern);
252 virtual void visit (AST::AltPattern &pattern);
253 virtual void visit (AST::EmptyStmt &stmt);
254 virtual void visit (AST::LetStmt &stmt);
255 virtual void visit (AST::ExprStmtWithoutBlock &stmt);
256 virtual void visit (AST::ExprStmtWithBlock &stmt);
257 virtual void visit (AST::TraitBound &bound);
258 virtual void visit (AST::ImplTraitType &type);
259 virtual void visit (AST::TraitObjectType &type);
260 virtual void visit (AST::ParenthesisedType &type);
261 virtual void visit (AST::ImplTraitTypeOneBound &type);
262 virtual void visit (AST::TraitObjectTypeOneBound &type);
263 virtual void visit (AST::TupleType &type);
264 virtual void visit (AST::NeverType &type);
265 virtual void visit (AST::RawPointerType &type);
266 virtual void visit (AST::ReferenceType &type);
267 virtual void visit (AST::ArrayType &type);
268 virtual void visit (AST::SliceType &type);
269 virtual void visit (AST::InferredType &type);
270 virtual void visit (AST::BareFunctionType &type);
271 };
272
273 } // namespace Resolver
274 } // namespace Rust
275
276 #endif // RUST_EARLY_NAME_RESOLVER_H