use ls_types::*;
use crate::state::DocumentState;
pub fn inlay_hints(state: &DocumentState, range: Range) -> Vec<InlayHint> {
let mut hints = Vec::new();
for rule in &state.info.rules {
let rule_range = state.line_index.span_to_range(rule.name_span.0, rule.name_span.1);
if rule_range.start.line < range.start.line || rule_range.start.line > range.end.line {
continue;
}
if let Some(first_label) = state.info.first_set_labels.get(&rule.name) {
let nullable = state.info.nullable_rules.contains(&rule.name);
let ref_count = rule.references.len();
if !nullable {
if ref_count == 0 {
continue; }
let first_count = first_label.matches('\'').count() / 2;
if first_count <= 1 && ref_count == 1 {
continue; }
}
let label = if nullable {
format!(" {} (nullable)", first_label)
} else {
format!(" {}", first_label)
};
hints.push(InlayHint {
position: Position::new(rule_range.start.line, rule_range.end.character),
label: InlayHintLabel::String(label),
kind: Some(InlayHintKind::TYPE),
text_edits: None,
tooltip: Some(InlayHintTooltip::String(format!(
"Characters that can begin a parse of `{}`",
rule.name
))),
padding_left: Some(true),
padding_right: None,
data: None,
});
}
}
hints
}