Factor out token ranking

This commit is contained in:
Lukas Wirth 2024-10-25 12:02:48 +02:00
parent 52a03ec237
commit ca3699bd50
4 changed files with 37 additions and 36 deletions

View file

@ -293,3 +293,33 @@ impl SnippetCap {
}
}
}
pub struct Ranker<'a> {
pub kind: parser::SyntaxKind,
pub text: &'a str,
pub ident_kind: bool,
}
impl<'a> Ranker<'a> {
pub fn from_token(token: &'a syntax::SyntaxToken) -> Self {
let kind = token.kind();
Ranker { kind, text: token.text(), ident_kind: kind.is_any_identifier() }
}
/// A utility function that ranks a token again a given kind and text, returning a number that
/// represents how close the token is to the given kind and text.
pub fn rank_token(&self, tok: &syntax::SyntaxToken) -> usize {
let tok_kind = tok.kind();
let exact_same_kind = tok_kind == self.kind;
let both_idents = exact_same_kind || (tok_kind.is_any_identifier() && self.ident_kind);
let same_text = tok.text() == self.text;
// anything that mapped into a token tree has likely no semantic information
let no_tt_parent =
tok.parent().map_or(false, |it| it.kind() != parser::SyntaxKind::TOKEN_TREE);
!((both_idents as usize)
| ((exact_same_kind as usize) << 1)
| ((same_text as usize) << 2)
| ((no_tt_parent as usize) << 3))
}
}