use smol_str::SmolStr;
use text_size::TextRange;
use crate::SemanticSnapshot;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DocumentSymbolKind {
Namespace,
Task,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DocumentSymbol {
pub name: SmolStr,
pub detail: Option<SmolStr>,
pub kind: DocumentSymbolKind,
pub range: TextRange,
pub container_name: Option<SmolStr>,
}
pub fn document_symbols(snapshot: &SemanticSnapshot) -> Vec<DocumentSymbol> {
let namespaces = snapshot
.document
.namespaces
.iter()
.map(|namespace| DocumentSymbol {
name: namespace.name.clone(),
detail: namespace.doc.clone(),
kind: DocumentSymbolKind::Namespace,
range: namespace.range,
container_name: None,
});
let tasks = snapshot.document.tasks.iter().map(|task| DocumentSymbol {
name: task.name.clone(),
detail: Some(task.signature()),
kind: DocumentSymbolKind::Task,
range: task.range,
container_name: task.namespace.clone(),
});
namespaces.chain(tasks).collect()
}