use kailua_env::{Pos, Source};
use kailua_diag::{Localize, Localized};
use kailua_types::ty::{TypeContext, Display};
use kailua_check::env::Output;
use diags;
use protocol::*;
pub fn help<F>(output: &Output, pos: Pos, source: &Source, mut localize: F) -> Option<Hover>
where F: for<'a> FnMut(&'a Localize) -> Localized<'a, Localize>
{
let spans = output.spanned_slots().contains(pos);
let closest_slot = spans.min_by_key(|slot| slot.span.len());
if let Some(slot) = closest_slot {
const TYPE_PREFIX: &'static str =
"\u{200c}\u{200d}\u{200d}\u{200c}\u{2060}\u{200c}\u{200b}\u{200d}\
\u{200c}\u{200c}\u{200d}\u{200b}\u{2060}\u{200d}\u{2060}\u{2060}";
let range = diags::translate_span(slot.span, source).map(|(_, range)| range);
let types = output.types() as &TypeContext;
Some(Hover {
contents: vec![
MarkedString {
language: format!("lua"),
value: format!("{}{:0.1}", TYPE_PREFIX, localize(&slot.display(types))),
}
],
range: range,
})
} else {
None
}
}