mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 05:45:12 +00:00
Factor out token ranking
This commit is contained in:
parent
52a03ec237
commit
ca3699bd50
4 changed files with 37 additions and 36 deletions
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue