aboutsummaryrefslogtreecommitdiff
path: root/crates/ide_ssr
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide_ssr')
-rw-r--r--crates/ide_ssr/src/from_comment.rs32
-rw-r--r--crates/ide_ssr/src/lib.rs2
2 files changed, 34 insertions, 0 deletions
diff --git a/crates/ide_ssr/src/from_comment.rs b/crates/ide_ssr/src/from_comment.rs
new file mode 100644
index 000000000..f1b312284
--- /dev/null
+++ b/crates/ide_ssr/src/from_comment.rs
@@ -0,0 +1,32 @@
1//! This module allows building an SSR MatchFinder by parsing the SSR rule
2//! from a comment.
3
4use ide_db::{
5 base_db::{FilePosition, FileRange, SourceDatabase},
6 RootDatabase,
7};
8use syntax::{
9 ast::{self, AstNode, AstToken},
10 TextRange,
11};
12
13use 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.
18pub 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}
diff --git a/crates/ide_ssr/src/lib.rs b/crates/ide_ssr/src/lib.rs
index b894d326e..00585f448 100644
--- a/crates/ide_ssr/src/lib.rs
+++ b/crates/ide_ssr/src/lib.rs
@@ -67,6 +67,7 @@
67// // foo($a, $b) ==>> ($a).foo($b) 67// // foo($a, $b) ==>> ($a).foo($b)
68// ``` 68// ```
69 69
70mod from_comment;
70mod matching; 71mod matching;
71mod nester; 72mod nester;
72mod parsing; 73mod parsing;
@@ -80,6 +81,7 @@ mod tests;
80 81
81use crate::errors::bail; 82use crate::errors::bail;
82pub use crate::errors::SsrError; 83pub use crate::errors::SsrError;
84pub use crate::from_comment::ssr_from_comment;
83pub use crate::matching::Match; 85pub use crate::matching::Match;
84use crate::matching::MatchFailureReason; 86use crate::matching::MatchFailureReason;
85use hir::Semantics; 87use hir::Semantics;