use smol_str::SmolStr;
use text_size::{TextRange, TextSize};
use crate::SemanticSnapshot;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum HoverKind {
Namespace,
Task,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct HoverInfo {
pub kind: HoverKind,
pub name: SmolStr,
pub signature: SmolStr,
pub docs: Option<SmolStr>,
pub range: TextRange,
pub container_name: Option<SmolStr>,
}
pub fn hover_at(snapshot: &SemanticSnapshot, offset: TextSize) -> Option<HoverInfo> {
for namespace in &snapshot.document.namespaces {
if namespace.range.contains(offset) {
return Some(HoverInfo {
kind: HoverKind::Namespace,
name: namespace.name.clone(),
signature: SmolStr::from(format!("[{}]", namespace.name)),
docs: namespace.doc.clone(),
range: namespace.range,
container_name: None,
});
}
}
for task in &snapshot.document.tasks {
if task.range.contains(offset) {
return Some(HoverInfo {
kind: HoverKind::Task,
name: task.name.clone(),
signature: task.signature(),
docs: task.doc.clone(),
range: task.range,
container_name: task.namespace.clone(),
});
}
}
None
}