@@ -388,7 +388,7 @@ pub fn search_dependencies<'a>(
388
388
db : & ' a dyn DefDatabase ,
389
389
krate : CrateId ,
390
390
query : Query ,
391
- ) -> Vec < ItemInNs > {
391
+ ) -> FxHashSet < ItemInNs > {
392
392
let _p = profile:: span ( "search_dependencies" ) . detail ( || format ! ( "{:?}" , query) ) ;
393
393
394
394
let graph = db. crate_graph ( ) ;
@@ -403,41 +403,42 @@ pub fn search_dependencies<'a>(
403
403
}
404
404
405
405
let mut stream = op. union ( ) ;
406
- let mut res = Vec :: new ( ) ;
406
+
407
+ let mut all_indexed_values = FxHashSet :: default ( ) ;
407
408
while let Some ( ( _, indexed_values) ) = stream. next ( ) {
408
- for indexed_value in indexed_values {
409
- let import_map = & import_maps[ indexed_value. index ] ;
410
- let importables = & import_map. importables [ indexed_value. value as usize ..] ;
409
+ all_indexed_values. extend ( indexed_values. iter ( ) . copied ( ) ) ;
410
+ }
411
411
412
- let common_importable_data = & import_map . map [ & importables [ 0 ] ] ;
413
- if !query . import_matches ( common_importable_data , true ) {
414
- continue ;
415
- }
412
+ let mut res = FxHashSet :: default ( ) ;
413
+ for indexed_value in all_indexed_values {
414
+ let import_map = & import_maps [ indexed_value . index ] ;
415
+ let importables = & import_map . importables [ indexed_value . value as usize .. ] ;
416
416
417
- // Path shared by the importable items in this group.
418
- let common_importables_path_fst = fst_path ( & common_importable_data. path ) ;
419
- // Add the items from this `ModPath` group. Those are all subsequent items in
420
- // `importables` whose paths match `path`.
421
- let iter = importables
422
- . iter ( )
423
- . copied ( )
424
- . take_while ( |item| {
425
- common_importables_path_fst == fst_path ( & import_map. map [ item] . path )
426
- } )
427
- . filter ( |& item| match item_import_kind ( item) {
428
- Some ( import_kind) => !query. exclude_import_kinds . contains ( & import_kind) ,
429
- None => true ,
430
- } )
431
- . filter ( |item| {
432
- !query. case_sensitive // we've already checked the common importables path case-insensitively
417
+ let common_importable_data = & import_map. map [ & importables[ 0 ] ] ;
418
+ if !query. import_matches ( common_importable_data, true ) {
419
+ continue ;
420
+ }
421
+
422
+ // Path shared by the importable items in this group.
423
+ let common_importables_path_fst = fst_path ( & common_importable_data. path ) ;
424
+ // Add the items from this `ModPath` group. Those are all subsequent items in
425
+ // `importables` whose paths match `path`.
426
+ let iter = importables
427
+ . iter ( )
428
+ . copied ( )
429
+ . take_while ( |item| common_importables_path_fst == fst_path ( & import_map. map [ item] . path ) )
430
+ . filter ( |& item| match item_import_kind ( item) {
431
+ Some ( import_kind) => !query. exclude_import_kinds . contains ( & import_kind) ,
432
+ None => true ,
433
+ } )
434
+ . filter ( |item| {
435
+ !query. case_sensitive // we've already checked the common importables path case-insensitively
433
436
|| query. import_matches ( & import_map. map [ item] , false )
434
- } ) ;
435
- res. extend ( iter) ;
437
+ } ) ;
438
+ res. extend ( iter) ;
436
439
437
- if res. len ( ) >= query. limit {
438
- res. truncate ( query. limit ) ;
439
- return res;
440
- }
440
+ if res. len ( ) >= query. limit {
441
+ return res;
441
442
}
442
443
}
443
444
@@ -821,10 +822,10 @@ mod tests {
821
822
Query :: new ( "fmt" . to_string ( ) ) . search_mode ( SearchMode :: Fuzzy ) ,
822
823
expect ! [ [ r#"
823
824
dep::fmt (t)
825
+ dep::fmt::Display::format_method (a)
824
826
dep::fmt::Display (t)
825
827
dep::fmt::Display::FMT_CONST (a)
826
828
dep::fmt::Display::format_function (a)
827
- dep::fmt::Display::format_method (a)
828
829
"# ] ] ,
829
830
) ;
830
831
}
@@ -850,9 +851,9 @@ mod tests {
850
851
"main" ,
851
852
Query :: new ( "fmt" . to_string ( ) ) . search_mode ( SearchMode :: Fuzzy ) . assoc_items_only ( ) ,
852
853
expect ! [ [ r#"
854
+ dep::fmt::Display::format_method (a)
853
855
dep::fmt::Display::FMT_CONST (a)
854
856
dep::fmt::Display::format_function (a)
855
- dep::fmt::Display::format_method (a)
856
857
"# ] ] ,
857
858
) ;
858
859
@@ -911,12 +912,12 @@ mod tests {
911
912
Query :: new ( "fmt" . to_string ( ) ) . search_mode ( SearchMode :: Fuzzy ) ,
912
913
expect ! [ [ r#"
913
914
dep::fmt (t)
914
- dep::Fmt (t )
915
+ dep::format (f )
915
916
dep::Fmt (v)
916
- dep::Fmt (m)
917
917
dep::fmt::Display (t)
918
+ dep::Fmt (t)
918
919
dep::fmt::Display::fmt (a)
919
- dep::format (f )
920
+ dep::Fmt (m )
920
921
"# ] ] ,
921
922
) ;
922
923
@@ -926,10 +927,10 @@ mod tests {
926
927
Query :: new ( "fmt" . to_string ( ) ) . search_mode ( SearchMode :: Equals ) ,
927
928
expect ! [ [ r#"
928
929
dep::fmt (t)
929
- dep::Fmt (t)
930
930
dep::Fmt (v)
931
- dep::Fmt (m )
931
+ dep::Fmt (t )
932
932
dep::fmt::Display::fmt (a)
933
+ dep::Fmt (m)
933
934
"# ] ] ,
934
935
) ;
935
936
@@ -939,11 +940,11 @@ mod tests {
939
940
Query :: new ( "fmt" . to_string ( ) ) . search_mode ( SearchMode :: Contains ) ,
940
941
expect ! [ [ r#"
941
942
dep::fmt (t)
942
- dep::Fmt (t)
943
943
dep::Fmt (v)
944
- dep::Fmt (m)
945
944
dep::fmt::Display (t)
945
+ dep::Fmt (t)
946
946
dep::fmt::Display::fmt (a)
947
+ dep::Fmt (m)
947
948
"# ] ] ,
948
949
) ;
949
950
}
@@ -980,11 +981,11 @@ mod tests {
980
981
Query :: new ( "fmt" . to_string ( ) ) ,
981
982
expect ! [ [ r#"
982
983
dep::fmt (t)
983
- dep::Fmt (t)
984
984
dep::Fmt (v)
985
- dep::Fmt (m)
986
985
dep::fmt::Display (t)
986
+ dep::Fmt (t)
987
987
dep::fmt::Display::fmt (a)
988
+ dep::Fmt (m)
988
989
"# ] ] ,
989
990
) ;
990
991
@@ -994,10 +995,10 @@ mod tests {
994
995
Query :: new ( "fmt" . to_string ( ) ) . name_only ( ) ,
995
996
expect ! [ [ r#"
996
997
dep::fmt (t)
997
- dep::Fmt (t)
998
998
dep::Fmt (v)
999
- dep::Fmt (m )
999
+ dep::Fmt (t )
1000
1000
dep::fmt::Display::fmt (a)
1001
+ dep::Fmt (m)
1001
1002
"# ] ] ,
1002
1003
) ;
1003
1004
}
@@ -1018,9 +1019,9 @@ mod tests {
1018
1019
Query :: new ( "FMT" . to_string ( ) ) ,
1019
1020
expect ! [ [ r#"
1020
1021
dep::fmt (t)
1022
+ dep::FMT (v)
1021
1023
dep::fmt (v)
1022
1024
dep::FMT (t)
1023
- dep::FMT (v)
1024
1025
"# ] ] ,
1025
1026
) ;
1026
1027
@@ -1060,6 +1061,8 @@ mod tests {
1060
1061
expect ! [ [ r#"
1061
1062
dep::fmt (t)
1062
1063
dep::Fmt (t)
1064
+ dep::Fmt (m)
1065
+ dep::Fmt (v)
1063
1066
"# ] ] ,
1064
1067
) ;
1065
1068
}
@@ -1080,9 +1083,9 @@ mod tests {
1080
1083
Query :: new ( "FMT" . to_string ( ) ) ,
1081
1084
expect ! [ [ r#"
1082
1085
dep::fmt (t)
1086
+ dep::FMT (v)
1083
1087
dep::fmt (v)
1084
1088
dep::FMT (t)
1085
- dep::FMT (v)
1086
1089
"# ] ] ,
1087
1090
) ;
1088
1091
0 commit comments