aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-03-08 11:15:17 +0000
committerGitHub <[email protected]>2021-03-08 11:15:17 +0000
commit6952a3b4460953bfc854be8ade2763dcfe70b650 (patch)
tree2dc0b8cc155318ca1b9f48de350ffc3beb5dd8b5
parent13982e4ee42293862646d022273692d65a362885 (diff)
parent128a6a4ec060a73fbd4e1a8dc470cb629fcdbe45 (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]>
-rw-r--r--crates/hir_def/src/import_map.rs95
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