@@ -255,55 +255,67 @@ impl Resolver {
255
255
return self . module_scope . resolve_path_in_value_ns ( db, path) ;
256
256
}
257
257
258
- for scope in self . scopes ( ) {
259
- match scope {
260
- Scope :: ExprScope ( _) if n_segments > 1 => continue ,
261
- Scope :: ExprScope ( scope) => {
262
- let entry = scope
263
- . expr_scopes
264
- . entries ( scope. scope_id )
265
- . iter ( )
266
- . find ( |entry| entry. name ( ) == first_name) ;
267
-
268
- if let Some ( e) = entry {
269
- return Some ( ResolveValueResult :: ValueNs ( ValueNs :: LocalBinding ( e. pat ( ) ) ) ) ;
258
+ if n_segments <= 1 {
259
+ for scope in self . scopes ( ) {
260
+ match scope {
261
+ Scope :: ExprScope ( scope) => {
262
+ let entry = scope
263
+ . expr_scopes
264
+ . entries ( scope. scope_id )
265
+ . iter ( )
266
+ . find ( |entry| entry. name ( ) == first_name) ;
267
+
268
+ if let Some ( e) = entry {
269
+ return Some ( ResolveValueResult :: ValueNs ( ValueNs :: LocalBinding (
270
+ e. pat ( ) ,
271
+ ) ) ) ;
272
+ }
270
273
}
271
- }
272
- Scope :: GenericParams { params , def } if n_segments > 1 => {
273
- if let Some ( id ) = params . find_type_by_name ( first_name , * def ) {
274
- let ty = TypeNs :: GenericParam ( id ) ;
275
- return Some ( ResolveValueResult :: Partial ( ty , 1 ) ) ;
274
+ Scope :: GenericParams { params , def } => {
275
+ if let Some ( id ) = params . find_const_by_name ( first_name , * def ) {
276
+ let val = ValueNs :: GenericParam ( id ) ;
277
+ return Some ( ResolveValueResult :: ValueNs ( val ) ) ;
278
+ }
276
279
}
277
- }
278
- Scope :: GenericParams { .. } if n_segments != 1 => continue ,
279
- Scope :: GenericParams { params, def } => {
280
- if let Some ( id) = params. find_const_by_name ( first_name, * def) {
281
- let val = ValueNs :: GenericParam ( id) ;
282
- return Some ( ResolveValueResult :: ValueNs ( val) ) ;
280
+ & Scope :: ImplDefScope ( impl_) => {
281
+ if first_name == & name ! [ Self ] {
282
+ return Some ( ResolveValueResult :: ValueNs ( ValueNs :: ImplSelf ( impl_) ) ) ;
283
+ }
283
284
}
284
- }
285
-
286
- & Scope :: ImplDefScope ( impl_) => {
287
- if first_name == & name ! [ Self ] {
288
- return Some ( if n_segments > 1 {
289
- ResolveValueResult :: Partial ( TypeNs :: SelfType ( impl_) , 1 )
290
- } else {
291
- ResolveValueResult :: ValueNs ( ValueNs :: ImplSelf ( impl_) )
292
- } ) ;
285
+ // bare `Self` doesn't work in the value namespace in a struct/enum definition
286
+ Scope :: AdtScope ( _) => continue ,
287
+ Scope :: BlockScope ( m) => {
288
+ if let Some ( def) = m. resolve_path_in_value_ns ( db, path) {
289
+ return Some ( def) ;
290
+ }
293
291
}
294
292
}
295
- // bare `Self` doesn't work in the value namespace in a struct/enum definition
296
- Scope :: AdtScope ( _) if n_segments == 1 => continue ,
297
- Scope :: AdtScope ( adt) => {
298
- if first_name == & name ! [ Self ] {
299
- let ty = TypeNs :: AdtSelfType ( * adt) ;
300
- return Some ( ResolveValueResult :: Partial ( ty, 1 ) ) ;
293
+ }
294
+ } else {
295
+ for scope in self . scopes ( ) {
296
+ match scope {
297
+ Scope :: ExprScope ( _) => continue ,
298
+ Scope :: GenericParams { params, def } => {
299
+ if let Some ( id) = params. find_type_by_name ( first_name, * def) {
300
+ let ty = TypeNs :: GenericParam ( id) ;
301
+ return Some ( ResolveValueResult :: Partial ( ty, 1 ) ) ;
302
+ }
301
303
}
302
- }
303
-
304
- Scope :: BlockScope ( m) => {
305
- if let Some ( def) = m. resolve_path_in_value_ns ( db, path) {
306
- return Some ( def) ;
304
+ & Scope :: ImplDefScope ( impl_) => {
305
+ if first_name == & name ! [ Self ] {
306
+ return Some ( ResolveValueResult :: Partial ( TypeNs :: SelfType ( impl_) , 1 ) ) ;
307
+ }
308
+ }
309
+ Scope :: AdtScope ( adt) => {
310
+ if first_name == & name ! [ Self ] {
311
+ let ty = TypeNs :: AdtSelfType ( * adt) ;
312
+ return Some ( ResolveValueResult :: Partial ( ty, 1 ) ) ;
313
+ }
314
+ }
315
+ Scope :: BlockScope ( m) => {
316
+ if let Some ( def) = m. resolve_path_in_value_ns ( db, path) {
317
+ return Some ( def) ;
318
+ }
307
319
}
308
320
}
309
321
}
@@ -316,8 +328,8 @@ impl Resolver {
316
328
// If a path of the shape `u16::from_le_bytes` failed to resolve at all, then we fall back
317
329
// to resolving to the primitive type, to allow this to still work in the presence of
318
330
// `use core::u16;`.
319
- if path. kind == PathKind :: Plain && path . segments ( ) . len ( ) > 1 {
320
- if let Some ( builtin) = BuiltinType :: by_name ( & path . segments ( ) [ 0 ] ) {
331
+ if path. kind == PathKind :: Plain && n_segments > 1 {
332
+ if let Some ( builtin) = BuiltinType :: by_name ( first_name ) {
321
333
return Some ( ResolveValueResult :: Partial ( TypeNs :: BuiltinType ( builtin) , 1 ) ) ;
322
334
}
323
335
}
0 commit comments