From b970d675f5072e638ea4c2166e82ca5a580f6c50 Mon Sep 17 00:00:00 2001 From: Yusuke Tanaka Date: Sat, 8 Aug 2020 19:18:56 +0900 Subject: Reverse document symbols for each scope (#5655) --- crates/rust-analyzer/src/handlers.rs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'crates') diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 067259e24..9944757ad 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -273,19 +273,24 @@ pub(crate) fn handle_document_symbol( parents.push((doc_symbol, symbol.parent)); } let mut document_symbols = Vec::new(); + // Constructs `document_symbols` from `parents`, in order from the end. while let Some((node, parent)) = parents.pop() { match parent { None => document_symbols.push(node), Some(i) => { - let children = &mut parents[i].0.children; - if children.is_none() { - *children = Some(Vec::new()); - } - children.as_mut().unwrap().push(node); + parents[i].0.children.get_or_insert_with(Vec::new).push(node); } } } + fn reverse(symbols: &mut Vec) { + for sym in symbols.iter_mut() { + sym.children.as_mut().map(|c| reverse(c)); + } + symbols.reverse(); + } + reverse(&mut document_symbols); + let res = if snap.config.client_caps.hierarchical_symbols { document_symbols.into() } else { -- cgit v1.2.3