1 // Copyright (C) 2020-2024 Free Software Foundation, Inc.
3 // This file is part of GCC.
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
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
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/>.
19 #ifndef RUST_EARLY_NAME_RESOLVER_H
20 #define RUST_EARLY_NAME_RESOLVER_H
22 #include "rust-name-resolver.h"
23 #include "rust-system.h"
25 #include "rust-ast-visitor.h"
30 class EarlyNameResolver
: public AST::ASTVisitor
35 void go (AST::Crate
&crate
);
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
43 void scoped (NodeId scope_id
, std::function
<void ()> fn
)
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 ());
52 resolver
.get_macro_scope ().pop ();
53 current_scope
= old_scope
;
57 * The "scope" we are currently in.
59 * This involves lexical scopes:
62 * // current_scope = crate_id;
63 * macro_rules! foo { () => {} )
66 * // current_scope = current_block_id;
67 * macro_rules! foo { () => { something!(); } }
69 * // current_scope = crate_id;
72 * as well as any sort of scope-like structure that might impact import name
73 * resolution or macro name resolution:
77 * () => { fn empty() {} }
84 * macro_rules! foo { () => {} )
100 /* The crate's scope */
104 Analysis::Mappings
&mappings
;
107 * Early name-resolve generic args, which can be macro invocations
109 void resolve_generic_args (AST::GenericArgs
&generic_args
);
112 * Early name-resolve a qualified path type, which can contain macro
115 void resolve_qualified_path_type (AST::QualifiedPathType
&path
);
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
¶m
);
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
¯o_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
);
273 } // namespace Resolver
276 #endif // RUST_EARLY_NAME_RESOLVER_H