diff options
Diffstat (limited to 'crates/server/src')
-rw-r--r-- | crates/server/src/conv.rs | 1 | ||||
-rw-r--r-- | crates/server/src/main_loop/handlers.rs | 31 |
2 files changed, 19 insertions, 13 deletions
diff --git a/crates/server/src/conv.rs b/crates/server/src/conv.rs index 3aa255e6a..3ddce5fb3 100644 --- a/crates/server/src/conv.rs +++ b/crates/server/src/conv.rs | |||
@@ -36,6 +36,7 @@ impl Conv for SyntaxKind { | |||
36 | SyntaxKind::TYPE_DEF => SymbolKind::TypeParameter, | 36 | SyntaxKind::TYPE_DEF => SymbolKind::TypeParameter, |
37 | SyntaxKind::STATIC_DEF => SymbolKind::Constant, | 37 | SyntaxKind::STATIC_DEF => SymbolKind::Constant, |
38 | SyntaxKind::CONST_DEF => SymbolKind::Constant, | 38 | SyntaxKind::CONST_DEF => SymbolKind::Constant, |
39 | SyntaxKind::IMPL_ITEM => SymbolKind::Object, | ||
39 | _ => SymbolKind::Variable, | 40 | _ => SymbolKind::Variable, |
40 | } | 41 | } |
41 | } | 42 | } |
diff --git a/crates/server/src/main_loop/handlers.rs b/crates/server/src/main_loop/handlers.rs index bfdfcb51e..8789ef0d2 100644 --- a/crates/server/src/main_loop/handlers.rs +++ b/crates/server/src/main_loop/handlers.rs | |||
@@ -48,29 +48,34 @@ pub fn handle_document_symbol( | |||
48 | let file = world.file_syntax(&path)?; | 48 | let file = world.file_syntax(&path)?; |
49 | let line_index = world.file_line_index(&path)?; | 49 | let line_index = world.file_line_index(&path)?; |
50 | 50 | ||
51 | let mut res: Vec<DocumentSymbol> = Vec::new(); | 51 | let mut parents: Vec<(DocumentSymbol, Option<usize>)> = Vec::new(); |
52 | 52 | ||
53 | for symbol in libeditor::file_symbols(&file) { | 53 | for symbol in libeditor::file_structure(&file) { |
54 | let name = symbol.name.to_string(); | ||
55 | let doc_symbol = DocumentSymbol { | 54 | let doc_symbol = DocumentSymbol { |
56 | name: name.clone(), | 55 | name: symbol.label, |
57 | detail: Some(name), | 56 | detail: Some("".to_string()), |
58 | kind: symbol.kind.conv(), | 57 | kind: symbol.kind.conv(), |
59 | deprecated: None, | 58 | deprecated: None, |
60 | range: symbol.node_range.conv_with(&line_index), | 59 | range: symbol.node_range.conv_with(&line_index), |
61 | selection_range: symbol.name_range.conv_with(&line_index), | 60 | selection_range: symbol.navigation_range.conv_with(&line_index), |
62 | children: None, | 61 | children: None, |
63 | }; | 62 | }; |
64 | if let Some(idx) = symbol.parent { | 63 | parents.push((doc_symbol, symbol.parent)); |
65 | let children = &mut res[idx].children; | 64 | } |
66 | if children.is_none() { | 65 | let mut res = Vec::new(); |
67 | *children = Some(Vec::new()); | 66 | while let Some((node, parent)) = parents.pop() { |
67 | match parent { | ||
68 | None => res.push(node), | ||
69 | Some(i) => { | ||
70 | let children = &mut parents[i].0.children; | ||
71 | if children.is_none() { | ||
72 | *children = Some(Vec::new()); | ||
73 | } | ||
74 | children.as_mut().unwrap().push(node); | ||
68 | } | 75 | } |
69 | children.as_mut().unwrap().push(doc_symbol); | ||
70 | } else { | ||
71 | res.push(doc_symbol); | ||
72 | } | 76 | } |
73 | } | 77 | } |
78 | |||
74 | Ok(Some(req::DocumentSymbolResponse::Nested(res))) | 79 | Ok(Some(req::DocumentSymbolResponse::Nested(res))) |
75 | } | 80 | } |
76 | 81 | ||