only_semantic/
document_symbols.rs1use smol_str::SmolStr;
2use text_size::TextRange;
3
4use crate::SemanticSnapshot;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
14pub enum DocumentSymbolKind {
15 Namespace,
16 Task,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq)]
27pub struct DocumentSymbol {
28 pub name: SmolStr,
29 pub detail: Option<SmolStr>,
30 pub kind: DocumentSymbolKind,
31 pub range: TextRange,
32 pub container_name: Option<SmolStr>,
33}
34
35pub fn document_symbols(snapshot: &SemanticSnapshot) -> Vec<DocumentSymbol> {
43 let namespaces = snapshot
44 .document
45 .namespaces
46 .iter()
47 .map(|namespace| DocumentSymbol {
48 name: namespace.name.clone(),
49 detail: namespace.doc.clone(),
50 kind: DocumentSymbolKind::Namespace,
51 range: namespace.range,
52 container_name: None,
53 });
54
55 let tasks = snapshot.document.tasks.iter().map(|task| DocumentSymbol {
56 name: task.name.clone(),
57 detail: Some(task.signature()),
58 kind: DocumentSymbolKind::Task,
59 range: task.range,
60 container_name: task.namespace.clone(),
61 });
62
63 namespaces.chain(tasks).collect()
64}