use kailua_env::Span;
use kailua_syntax::lex::{Tok, NestedToken};
use kailua_types::ty::Slot;
use kailua_check::env::Output;
pub mod completion;
pub mod hover;
pub mod signature;
pub mod definition;
#[derive(Clone, Debug)]
enum PrefixExprSlot {
NotFound,
Found(usize , Slot),
}
fn last_non_comment(tokens: &[NestedToken]) -> Option<(usize, &NestedToken)> {
tokens.iter().enumerate().rev().find(|&(_, tok)| {
match tok.tok.base { Tok::Comment => false, _ => true }
})
}
fn get_prefix_expr_slot(tokens: &[NestedToken], idx: usize,
output: &Output) -> Option<PrefixExprSlot> {
let (end_idx, end) = if let Some((idx, tok)) = last_non_comment(&tokens[..idx]) {
(idx, tok.tok.span.end())
} else {
return None;
};
let spans = output.spanned_slots().adjacencies(Span::from(end));
let spans_before = spans.filter(|slot| slot.span.end() == end);
let closest_slot = spans_before.min_by_key(|slot| slot.span.len());
if let Some(slot) = closest_slot {
Some(PrefixExprSlot::Found(end_idx, slot.base.clone()))
} else {
Some(PrefixExprSlot::NotFound)
}
}