diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-03-08 11:15:17 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-03-08 11:15:17 +0000 |
commit | 6952a3b4460953bfc854be8ade2763dcfe70b650 (patch) | |
tree | 2dc0b8cc155318ca1b9f48de350ffc3beb5dd8b5 /crates | |
parent | 13982e4ee42293862646d022273692d65a362885 (diff) | |
parent | 128a6a4ec060a73fbd4e1a8dc470cb629fcdbe45 (diff) |
Merge #7912
7912: Dedupe import map results r=matklad a=SomeoneToIgnore
While debugging https://github.com/rust-analyzer/rust-analyzer/issues/7902, I've found that there are some duplicates are produced during the external dependencies lookup.
I've spotted at least some of the `indexed_value.value` duplicated when typed `Arc` and requested the completions for that, so I've also deduped the `IndexedValue`'s to avoid unnecessary computations.
This helps to show `Arc` in the completion suggestions in a zero dependency project and in `hir` module, but we loose it again in the `ide` module.
Co-authored-by: Kirill Bulatov <[email protected]>
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir_def/src/import_map.rs | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/crates/hir_def/src/import_map.rs b/crates/hir_def/src/import_map.rs index 0a3dc7956..e1c28bc83 100644 --- a/crates/hir_def/src/import_map.rs +++ b/crates/hir_def/src/import_map.rs | |||
@@ -388,7 +388,7 @@ pub fn search_dependencies<'a>( | |||
388 | db: &'a dyn DefDatabase, | 388 | db: &'a dyn DefDatabase, |
389 | krate: CrateId, | 389 | krate: CrateId, |
390 | query: Query, | 390 | query: Query, |
391 | ) -> Vec<ItemInNs> { | 391 | ) -> FxHashSet<ItemInNs> { |
392 | let _p = profile::span("search_dependencies").detail(|| format!("{:?}", query)); | 392 | let _p = profile::span("search_dependencies").detail(|| format!("{:?}", query)); |
393 | 393 | ||
394 | let graph = db.crate_graph(); | 394 | let graph = db.crate_graph(); |
@@ -403,41 +403,42 @@ pub fn search_dependencies<'a>( | |||
403 | } | 403 | } |
404 | 404 | ||
405 | let mut stream = op.union(); | 405 | let mut stream = op.union(); |
406 | let mut res = Vec::new(); | 406 | |
407 | let mut all_indexed_values = FxHashSet::default(); | ||
407 | while let Some((_, indexed_values)) = stream.next() { | 408 | while let Some((_, indexed_values)) = stream.next() { |
408 | for indexed_value in indexed_values { | 409 | all_indexed_values.extend(indexed_values.iter().copied()); |
409 | let import_map = &import_maps[indexed_value.index]; | 410 | } |
410 | let importables = &import_map.importables[indexed_value.value as usize..]; | ||
411 | 411 | ||
412 | let common_importable_data = &import_map.map[&importables[0]]; | 412 | let mut res = FxHashSet::default(); |
413 | if !query.import_matches(common_importable_data, true) { | 413 | for indexed_value in all_indexed_values { |
414 | continue; | 414 | let import_map = &import_maps[indexed_value.index]; |
415 | } | 415 | let importables = &import_map.importables[indexed_value.value as usize..]; |
416 | 416 | ||
417 | // Path shared by the importable items in this group. | 417 | let common_importable_data = &import_map.map[&importables[0]]; |
418 | let common_importables_path_fst = fst_path(&common_importable_data.path); | 418 | if !query.import_matches(common_importable_data, true) { |
419 | // Add the items from this `ModPath` group. Those are all subsequent items in | 419 | continue; |
420 | // `importables` whose paths match `path`. | 420 | } |
421 | let iter = importables | 421 | |
422 | .iter() | 422 | // Path shared by the importable items in this group. |
423 | .copied() | 423 | let common_importables_path_fst = fst_path(&common_importable_data.path); |
424 | .take_while(|item| { | 424 | // Add the items from this `ModPath` group. Those are all subsequent items in |
425 | common_importables_path_fst == fst_path(&import_map.map[item].path) | 425 | // `importables` whose paths match `path`. |
426 | }) | 426 | let iter = importables |
427 | .filter(|&item| match item_import_kind(item) { | 427 | .iter() |
428 | Some(import_kind) => !query.exclude_import_kinds.contains(&import_kind), | 428 | .copied() |
429 | None => true, | 429 | .take_while(|item| common_importables_path_fst == fst_path(&import_map.map[item].path)) |
430 | }) | 430 | .filter(|&item| match item_import_kind(item) { |
431 | .filter(|item| { | 431 | Some(import_kind) => !query.exclude_import_kinds.contains(&import_kind), |
432 | !query.case_sensitive // we've already checked the common importables path case-insensitively | 432 | None => true, |
433 | }) | ||
434 | .filter(|item| { | ||
435 | !query.case_sensitive // we've already checked the common importables path case-insensitively | ||
433 | || query.import_matches(&import_map.map[item], false) | 436 | || query.import_matches(&import_map.map[item], false) |
434 | }); | 437 | }); |
435 | res.extend(iter); | 438 | res.extend(iter); |
436 | 439 | ||
437 | if res.len() >= query.limit { | 440 | if res.len() >= query.limit { |
438 | res.truncate(query.limit); | 441 | return res; |
439 | return res; | ||
440 | } | ||
441 | } | 442 | } |
442 | } | 443 | } |
443 | 444 | ||
@@ -821,10 +822,10 @@ mod tests { | |||
821 | Query::new("fmt".to_string()).search_mode(SearchMode::Fuzzy), | 822 | Query::new("fmt".to_string()).search_mode(SearchMode::Fuzzy), |
822 | expect![[r#" | 823 | expect![[r#" |
823 | dep::fmt (t) | 824 | dep::fmt (t) |
825 | dep::fmt::Display::format_method (a) | ||
824 | dep::fmt::Display (t) | 826 | dep::fmt::Display (t) |
825 | dep::fmt::Display::FMT_CONST (a) | 827 | dep::fmt::Display::FMT_CONST (a) |
826 | dep::fmt::Display::format_function (a) | 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 | "main", | 851 | "main", |
851 | Query::new("fmt".to_string()).search_mode(SearchMode::Fuzzy).assoc_items_only(), | 852 | Query::new("fmt".to_string()).search_mode(SearchMode::Fuzzy).assoc_items_only(), |
852 | expect![[r#" | 853 | expect![[r#" |
854 | dep::fmt::Display::format_method (a) | ||
853 | dep::fmt::Display::FMT_CONST (a) | 855 | dep::fmt::Display::FMT_CONST (a) |
854 | dep::fmt::Display::format_function (a) | 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 | Query::new("fmt".to_string()).search_mode(SearchMode::Fuzzy), | 912 | Query::new("fmt".to_string()).search_mode(SearchMode::Fuzzy), |
912 | expect![[r#" | 913 | expect![[r#" |
913 | dep::fmt (t) | 914 | dep::fmt (t) |
914 | dep::Fmt (t) | 915 | dep::format (f) |
915 | dep::Fmt (v) | 916 | dep::Fmt (v) |
916 | dep::Fmt (m) | ||
917 | dep::fmt::Display (t) | 917 | dep::fmt::Display (t) |
918 | dep::Fmt (t) | ||
918 | dep::fmt::Display::fmt (a) | 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 | Query::new("fmt".to_string()).search_mode(SearchMode::Equals), | 927 | Query::new("fmt".to_string()).search_mode(SearchMode::Equals), |
927 | expect![[r#" | 928 | expect![[r#" |
928 | dep::fmt (t) | 929 | dep::fmt (t) |
929 | dep::Fmt (t) | ||
930 | dep::Fmt (v) | 930 | dep::Fmt (v) |
931 | dep::Fmt (m) | 931 | dep::Fmt (t) |
932 | dep::fmt::Display::fmt (a) | 932 | dep::fmt::Display::fmt (a) |
933 | dep::Fmt (m) | ||
933 | "#]], | 934 | "#]], |
934 | ); | 935 | ); |
935 | 936 | ||
@@ -939,11 +940,11 @@ mod tests { | |||
939 | Query::new("fmt".to_string()).search_mode(SearchMode::Contains), | 940 | Query::new("fmt".to_string()).search_mode(SearchMode::Contains), |
940 | expect![[r#" | 941 | expect![[r#" |
941 | dep::fmt (t) | 942 | dep::fmt (t) |
942 | dep::Fmt (t) | ||
943 | dep::Fmt (v) | 943 | dep::Fmt (v) |
944 | dep::Fmt (m) | ||
945 | dep::fmt::Display (t) | 944 | dep::fmt::Display (t) |
945 | dep::Fmt (t) | ||
946 | dep::fmt::Display::fmt (a) | 946 | dep::fmt::Display::fmt (a) |
947 | dep::Fmt (m) | ||
947 | "#]], | 948 | "#]], |
948 | ); | 949 | ); |
949 | } | 950 | } |
@@ -980,11 +981,11 @@ mod tests { | |||
980 | Query::new("fmt".to_string()), | 981 | Query::new("fmt".to_string()), |
981 | expect![[r#" | 982 | expect![[r#" |
982 | dep::fmt (t) | 983 | dep::fmt (t) |
983 | dep::Fmt (t) | ||
984 | dep::Fmt (v) | 984 | dep::Fmt (v) |
985 | dep::Fmt (m) | ||
986 | dep::fmt::Display (t) | 985 | dep::fmt::Display (t) |
986 | dep::Fmt (t) | ||
987 | dep::fmt::Display::fmt (a) | 987 | dep::fmt::Display::fmt (a) |
988 | dep::Fmt (m) | ||
988 | "#]], | 989 | "#]], |
989 | ); | 990 | ); |
990 | 991 | ||
@@ -994,10 +995,10 @@ mod tests { | |||
994 | Query::new("fmt".to_string()).name_only(), | 995 | Query::new("fmt".to_string()).name_only(), |
995 | expect![[r#" | 996 | expect![[r#" |
996 | dep::fmt (t) | 997 | dep::fmt (t) |
997 | dep::Fmt (t) | ||
998 | dep::Fmt (v) | 998 | dep::Fmt (v) |
999 | dep::Fmt (m) | 999 | dep::Fmt (t) |
1000 | dep::fmt::Display::fmt (a) | 1000 | dep::fmt::Display::fmt (a) |
1001 | dep::Fmt (m) | ||
1001 | "#]], | 1002 | "#]], |
1002 | ); | 1003 | ); |
1003 | } | 1004 | } |
@@ -1018,9 +1019,9 @@ mod tests { | |||
1018 | Query::new("FMT".to_string()), | 1019 | Query::new("FMT".to_string()), |
1019 | expect![[r#" | 1020 | expect![[r#" |
1020 | dep::fmt (t) | 1021 | dep::fmt (t) |
1022 | dep::FMT (v) | ||
1021 | dep::fmt (v) | 1023 | dep::fmt (v) |
1022 | dep::FMT (t) | 1024 | dep::FMT (t) |
1023 | dep::FMT (v) | ||
1024 | "#]], | 1025 | "#]], |
1025 | ); | 1026 | ); |
1026 | 1027 | ||
@@ -1060,6 +1061,8 @@ mod tests { | |||
1060 | expect![[r#" | 1061 | expect![[r#" |
1061 | dep::fmt (t) | 1062 | dep::fmt (t) |
1062 | dep::Fmt (t) | 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 | Query::new("FMT".to_string()), | 1083 | Query::new("FMT".to_string()), |
1081 | expect![[r#" | 1084 | expect![[r#" |
1082 | dep::fmt (t) | 1085 | dep::fmt (t) |
1086 | dep::FMT (v) | ||
1083 | dep::fmt (v) | 1087 | dep::fmt (v) |
1084 | dep::FMT (t) | 1088 | dep::FMT (t) |
1085 | dep::FMT (v) | ||
1086 | "#]], | 1089 | "#]], |
1087 | ); | 1090 | ); |
1088 | 1091 | ||