@@ -299,45 +299,53 @@ impl SourceAnalyzer {
299
299
let parent = || parent. clone ( ) ;
300
300
301
301
let mut prefer_value_ns = false ;
302
- if let Some ( path_expr) = parent ( ) . and_then ( ast:: PathExpr :: cast) {
303
- let expr_id = self . expr_id ( db, & path_expr. into ( ) ) ?;
304
- let infer = self . infer . as_ref ( ) ?;
305
- if let Some ( assoc) = infer. assoc_resolutions_for_expr ( expr_id) {
306
- return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
307
- }
308
- if let Some ( VariantId :: EnumVariantId ( variant) ) =
309
- infer. variant_resolution_for_expr ( expr_id)
310
- {
311
- return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
312
- }
313
- prefer_value_ns = true ;
314
- } else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
315
- let pat_id = self . pat_id ( & path_pat. into ( ) ) ?;
316
- if let Some ( assoc) = self . infer . as_ref ( ) ?. assoc_resolutions_for_pat ( pat_id) {
317
- return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
318
- }
319
- if let Some ( VariantId :: EnumVariantId ( variant) ) =
320
- self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id)
321
- {
322
- return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
323
- }
324
- } else if let Some ( rec_lit) = parent ( ) . and_then ( ast:: RecordExpr :: cast) {
325
- let expr_id = self . expr_id ( db, & rec_lit. into ( ) ) ?;
326
- if let Some ( VariantId :: EnumVariantId ( variant) ) =
327
- self . infer . as_ref ( ) ?. variant_resolution_for_expr ( expr_id)
328
- {
329
- return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
330
- }
331
- }
332
-
333
- let record_pat = parent ( ) . and_then ( ast:: RecordPat :: cast) . map ( ast:: Pat :: from) ;
334
- let tuple_struct_pat = || parent ( ) . and_then ( ast:: TupleStructPat :: cast) . map ( ast:: Pat :: from) ;
335
- if let Some ( pat) = record_pat. or_else ( tuple_struct_pat) {
336
- let pat_id = self . pat_id ( & pat) ?;
337
- let variant_res_for_pat = self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id) ;
338
- if let Some ( VariantId :: EnumVariantId ( variant) ) = variant_res_for_pat {
339
- return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
302
+ let resolved = ( || {
303
+ if let Some ( path_expr) = parent ( ) . and_then ( ast:: PathExpr :: cast) {
304
+ let expr_id = self . expr_id ( db, & path_expr. into ( ) ) ?;
305
+ let infer = self . infer . as_ref ( ) ?;
306
+ if let Some ( assoc) = infer. assoc_resolutions_for_expr ( expr_id) {
307
+ return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
308
+ }
309
+ if let Some ( VariantId :: EnumVariantId ( variant) ) =
310
+ infer. variant_resolution_for_expr ( expr_id)
311
+ {
312
+ return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
313
+ }
314
+ prefer_value_ns = true ;
315
+ } else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
316
+ let pat_id = self . pat_id ( & path_pat. into ( ) ) ?;
317
+ if let Some ( assoc) = self . infer . as_ref ( ) ?. assoc_resolutions_for_pat ( pat_id) {
318
+ return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
319
+ }
320
+ if let Some ( VariantId :: EnumVariantId ( variant) ) =
321
+ self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id)
322
+ {
323
+ return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
324
+ }
325
+ } else if let Some ( rec_lit) = parent ( ) . and_then ( ast:: RecordExpr :: cast) {
326
+ let expr_id = self . expr_id ( db, & rec_lit. into ( ) ) ?;
327
+ if let Some ( VariantId :: EnumVariantId ( variant) ) =
328
+ self . infer . as_ref ( ) ?. variant_resolution_for_expr ( expr_id)
329
+ {
330
+ return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
331
+ }
332
+ } else {
333
+ let record_pat = parent ( ) . and_then ( ast:: RecordPat :: cast) . map ( ast:: Pat :: from) ;
334
+ let tuple_struct_pat =
335
+ || parent ( ) . and_then ( ast:: TupleStructPat :: cast) . map ( ast:: Pat :: from) ;
336
+ if let Some ( pat) = record_pat. or_else ( tuple_struct_pat) {
337
+ let pat_id = self . pat_id ( & pat) ?;
338
+ let variant_res_for_pat =
339
+ self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id) ;
340
+ if let Some ( VariantId :: EnumVariantId ( variant) ) = variant_res_for_pat {
341
+ return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
342
+ }
343
+ }
340
344
}
345
+ None
346
+ } ) ( ) ;
347
+ if let resolved @ Some ( _) = resolved {
348
+ return resolved;
341
349
}
342
350
343
351
// This must be a normal source file rather than macro file.
0 commit comments