diff options
Diffstat (limited to 'src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs')
-rw-r--r-- | src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs b/src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs new file mode 100644 index 000000000..5b6e01625 --- /dev/null +++ b/src/tools/rust-analyzer/crates/ide-ssr/src/from_comment.rs @@ -0,0 +1,35 @@ +//! This module allows building an SSR MatchFinder by parsing the SSR rule +//! from a comment. + +use ide_db::{ + base_db::{FilePosition, FileRange, SourceDatabase}, + RootDatabase, +}; +use syntax::{ + ast::{self, AstNode, AstToken}, + TextRange, +}; + +use crate::MatchFinder; + +/// Attempts to build an SSR MatchFinder from a comment at the given file +/// range. If successful, returns the MatchFinder and a TextRange covering +/// comment. +pub fn ssr_from_comment( + db: &RootDatabase, + frange: FileRange, +) -> Option<(MatchFinder<'_>, TextRange)> { + let comment = { + let file = db.parse(frange.file_id); + file.tree().syntax().token_at_offset(frange.range.start()).find_map(ast::Comment::cast) + }?; + let comment_text_without_prefix = comment.text().strip_prefix(comment.prefix()).unwrap(); + let ssr_rule = comment_text_without_prefix.parse().ok()?; + + let lookup_context = FilePosition { file_id: frange.file_id, offset: frange.range.start() }; + + let mut match_finder = MatchFinder::in_context(db, lookup_context, vec![]).ok()?; + match_finder.add_rule(ssr_rule).ok()?; + + Some((match_finder, comment.syntax().text_range())) +} |