diff options
| author | Kyle Huey <khuey@kylehuey.com> | 2022-03-22 12:00:20 -0700 |
|---|---|---|
| committer | Kyle Huey <khuey@kylehuey.com> | 2022-03-22 12:00:52 -0700 |
| commit | 05839199190819bf835ba20442ecbc7b06471a8f (patch) | |
| tree | 48b0483c9a6861176b7ff8b033f98c29f5441243 | |
| parent | f1dbc2acd455592b1def80a8108fe75d38d2f18b (diff) | |
| download | rust-05839199190819bf835ba20442ecbc7b06471a8f.tar.gz rust-05839199190819bf835ba20442ecbc7b06471a8f.zip | |
LSIF: consolidate references into a single edge where possible.
| -rw-r--r-- | crates/rust-analyzer/src/cli/lsif.rs | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/crates/rust-analyzer/src/cli/lsif.rs b/crates/rust-analyzer/src/cli/lsif.rs index b9bb335b05d..188f9b1380e 100644 --- a/crates/rust-analyzer/src/cli/lsif.rs +++ b/crates/rust-analyzer/src/cli/lsif.rs @@ -212,19 +212,24 @@ impl LsifManager<'_> { in_v: result_id.into(), out_v: result_set_id.into(), })); - for x in token.references { - let vertex = *self.range_map.get(&x.range).unwrap(); + let edges = token.references.iter().fold( + HashMap::<_, Vec<lsp_types::NumberOrString>>::new(), + |mut edges, x| { + let entry = + edges.entry((x.range.file_id, x.is_definition)).or_insert_with(Vec::new); + entry.push((*self.range_map.get(&x.range).unwrap()).into()); + edges + }, + ); + for ((file_id, is_definition), vertices) in edges.into_iter() { self.add_edge(lsif::Edge::Item(lsif::Item { - document: (*self.file_map.get(&x.range.file_id).unwrap()).into(), - property: Some(if x.is_definition { + document: (*self.file_map.get(&file_id).unwrap()).into(), + property: Some(if is_definition { lsif::ItemKind::Definitions } else { lsif::ItemKind::References }), - edge_data: lsif::EdgeDataMultiIn { - in_vs: vec![vertex.into()], - out_v: result_id.into(), - }, + edge_data: lsif::EdgeDataMultiIn { in_vs: vertices, out_v: result_id.into() }, })); } } |
