1 //! This module allows building an SSR MatchFinder by parsing the SSR rule
2 //! from a comment.
3 
4 use ide_db::{
5     base_db::{FilePosition, FileRange, SourceDatabase},
6     RootDatabase,
7 };
8 use syntax::{
9     ast::{self, AstNode, AstToken},
10     TextRange,
11 };
12 
13 use crate::MatchFinder;
14 
15 /// Attempts to build an SSR MatchFinder from a comment at the given file
16 /// range. If successful, returns the MatchFinder and a TextRange covering
17 /// comment.
ssr_from_comment(db: &RootDatabase, frange: FileRange) -> Option<(MatchFinder, TextRange)>18 pub fn ssr_from_comment(db: &RootDatabase, frange: FileRange) -> Option<(MatchFinder, TextRange)> {
19     let comment = {
20         let file = db.parse(frange.file_id);
21         file.tree().syntax().token_at_offset(frange.range.start()).find_map(ast::Comment::cast)
22     }?;
23     let comment_text_without_prefix = comment.text().strip_prefix(comment.prefix()).unwrap();
24     let ssr_rule = comment_text_without_prefix.parse().ok()?;
25 
26     let lookup_context = FilePosition { file_id: frange.file_id, offset: frange.range.start() };
27 
28     let mut match_finder = MatchFinder::in_context(db, lookup_context, vec![]);
29     match_finder.add_rule(ssr_rule).ok()?;
30 
31     Some((match_finder, comment.syntax().text_range()))
32 }
33