@@ -17,7 +17,7 @@ use crate::{
17
17
nameres:: DefMap ,
18
18
path:: { ModPath , PathKind } ,
19
19
visibility:: { Visibility , VisibilityExplicitness } ,
20
- ModuleDefId , ModuleId ,
20
+ ImportPathConfig , ModuleDefId , ModuleId ,
21
21
} ;
22
22
23
23
/// Find a path that can be used to refer to a certain item. This can depend on
@@ -28,21 +28,10 @@ pub fn find_path(
28
28
from : ModuleId ,
29
29
prefix_kind : PrefixKind ,
30
30
ignore_local_imports : bool ,
31
- prefer_no_std : bool ,
32
- prefer_prelude : bool ,
31
+ cfg : ImportPathConfig ,
33
32
) -> Option < ModPath > {
34
33
let _p = tracing:: span!( tracing:: Level :: INFO , "find_path" ) . entered ( ) ;
35
- find_path_inner (
36
- FindPathCtx {
37
- db,
38
- prefix : prefix_kind,
39
- prefer_no_std,
40
- prefer_prelude,
41
- ignore_local_imports,
42
- } ,
43
- item,
44
- from,
45
- )
34
+ find_path_inner ( FindPathCtx { db, prefix : prefix_kind, cfg, ignore_local_imports } , item, from)
46
35
}
47
36
48
37
#[ derive( Copy , Clone , Debug ) ]
@@ -88,8 +77,7 @@ impl PrefixKind {
88
77
struct FindPathCtx < ' db > {
89
78
db : & ' db dyn DefDatabase ,
90
79
prefix : PrefixKind ,
91
- prefer_no_std : bool ,
92
- prefer_prelude : bool ,
80
+ cfg : ImportPathConfig ,
93
81
ignore_local_imports : bool ,
94
82
}
95
83
@@ -107,7 +95,11 @@ fn find_path_inner(ctx: FindPathCtx<'_>, item: ItemInNs, from: ModuleId) -> Opti
107
95
let mut visited_modules = FxHashSet :: default ( ) ;
108
96
return find_path_for_module (
109
97
FindPathCtx {
110
- prefer_no_std : ctx. prefer_no_std || ctx. db . crate_supports_no_std ( crate_root. krate ) ,
98
+ cfg : ImportPathConfig {
99
+ prefer_no_std : ctx. cfg . prefer_no_std
100
+ || ctx. db . crate_supports_no_std ( crate_root. krate ) ,
101
+ ..ctx. cfg
102
+ } ,
111
103
..ctx
112
104
} ,
113
105
& def_map,
@@ -160,7 +152,11 @@ fn find_path_inner(ctx: FindPathCtx<'_>, item: ItemInNs, from: ModuleId) -> Opti
160
152
161
153
calculate_best_path (
162
154
FindPathCtx {
163
- prefer_no_std : ctx. prefer_no_std || ctx. db . crate_supports_no_std ( crate_root. krate ) ,
155
+ cfg : ImportPathConfig {
156
+ prefer_no_std : ctx. cfg . prefer_no_std
157
+ || ctx. db . crate_supports_no_std ( crate_root. krate ) ,
158
+ ..ctx. cfg
159
+ } ,
164
160
..ctx
165
161
} ,
166
162
& def_map,
@@ -381,9 +377,7 @@ fn calculate_best_path(
381
377
path. 0 . push_segment ( name) ;
382
378
383
379
let new_path = match best_path. take ( ) {
384
- Some ( best_path) => {
385
- select_best_path ( best_path, path, ctx. prefer_no_std , ctx. prefer_prelude )
386
- }
380
+ Some ( best_path) => select_best_path ( best_path, path, ctx. cfg ) ,
387
381
None => path,
388
382
} ;
389
383
best_path_len = new_path. 0 . len ( ) ;
@@ -425,12 +419,7 @@ fn calculate_best_path(
425
419
) ;
426
420
427
421
let new_path_with_stab = match best_path. take ( ) {
428
- Some ( best_path) => select_best_path (
429
- best_path,
430
- path_with_stab,
431
- ctx. prefer_no_std ,
432
- ctx. prefer_prelude ,
433
- ) ,
422
+ Some ( best_path) => select_best_path ( best_path, path_with_stab, ctx. cfg ) ,
434
423
None => path_with_stab,
435
424
} ;
436
425
update_best_path ( & mut best_path, new_path_with_stab) ;
@@ -446,8 +435,7 @@ fn calculate_best_path(
446
435
fn select_best_path (
447
436
old_path @ ( _, old_stability) : ( ModPath , Stability ) ,
448
437
new_path @ ( _, new_stability) : ( ModPath , Stability ) ,
449
- prefer_no_std : bool ,
450
- prefer_prelude : bool ,
438
+ cfg : ImportPathConfig ,
451
439
) -> ( ModPath , Stability ) {
452
440
match ( old_stability, new_stability) {
453
441
( Stable , Unstable ) => return old_path,
@@ -461,7 +449,7 @@ fn select_best_path(
461
449
let ( old_path, _) = & old;
462
450
let new_has_prelude = new_path. segments ( ) . iter ( ) . any ( |seg| seg == & known:: prelude) ;
463
451
let old_has_prelude = old_path. segments ( ) . iter ( ) . any ( |seg| seg == & known:: prelude) ;
464
- match ( new_has_prelude, old_has_prelude, prefer_prelude) {
452
+ match ( new_has_prelude, old_has_prelude, cfg . prefer_prelude ) {
465
453
( true , false , true ) | ( false , true , false ) => new,
466
454
( true , false , false ) | ( false , true , true ) => old,
467
455
// no prelude difference in the paths, so pick the shorter one
@@ -482,7 +470,7 @@ fn select_best_path(
482
470
483
471
match ( old_path. 0 . segments ( ) . first ( ) , new_path. 0 . segments ( ) . first ( ) ) {
484
472
( Some ( old) , Some ( new) ) if STD_CRATES . contains ( old) && STD_CRATES . contains ( new) => {
485
- let rank = match prefer_no_std {
473
+ let rank = match cfg . prefer_no_std {
486
474
false => |name : & Name | match name {
487
475
name if name == & known:: core => 0 ,
488
476
name if name == & known:: alloc => 1 ,
@@ -647,10 +635,9 @@ mod tests {
647
635
{
648
636
let found_path = find_path_inner (
649
637
FindPathCtx {
650
- prefer_no_std : false ,
651
638
db : & db,
652
639
prefix,
653
- prefer_prelude,
640
+ cfg : ImportPathConfig { prefer_no_std : false , prefer_prelude } ,
654
641
ignore_local_imports,
655
642
} ,
656
643
resolved,
0 commit comments