From 05839199190819bf835ba20442ecbc7b06471a8f Mon Sep 17 00:00:00 2001 From: Kyle Huey Date: Tue, 22 Mar 2022 12:00:20 -0700 Subject: [PATCH] LSIF: consolidate references into a single edge where possible. --- crates/rust-analyzer/src/cli/lsif.rs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/crates/rust-analyzer/src/cli/lsif.rs b/crates/rust-analyzer/src/cli/lsif.rs index b9bb335b05db..188f9b1380e1 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>::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() }, })); } }