Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/lib.rs')
-rw-r--r--crates/ide-db/src/lib.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/crates/ide-db/src/lib.rs b/crates/ide-db/src/lib.rs
index aed093f0eb..b764f852f0 100644
--- a/crates/ide-db/src/lib.rs
+++ b/crates/ide-db/src/lib.rs
@@ -293,3 +293,35 @@ impl SnippetCap {
}
}
}
+
+pub struct Ranker<'a> {
+ pub kind: parser::SyntaxKind,
+ pub text: &'a str,
+ pub ident_kind: bool,
+}
+
+impl<'a> Ranker<'a> {
+ pub const MAX_RANK: usize = 0b1110;
+
+ 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)
+ }
+}