diff options
author | Josh Mcguigan <[email protected]> | 2021-03-09 05:11:28 +0000 |
---|---|---|
committer | Josh Mcguigan <[email protected]> | 2021-03-10 14:02:15 +0000 |
commit | 09307be75b452bd7a10b3855b5d43083cca140a1 (patch) | |
tree | 5c1e05f3b1afa70492d37384fd94b989d49d80c5 /crates/ide_ssr/src | |
parent | a9b1e5cde1cc6e470be60cf2c230b99a62c2d2c3 (diff) |
add apply ssr assist
Diffstat (limited to 'crates/ide_ssr/src')
-rw-r--r-- | crates/ide_ssr/src/from_comment.rs | 32 | ||||
-rw-r--r-- | crates/ide_ssr/src/lib.rs | 2 |
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 | |||
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. | ||
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 | } | ||
diff --git a/crates/ide_ssr/src/lib.rs b/crates/ide_ssr/src/lib.rs index a97fc8bca..e72c611a3 100644 --- a/crates/ide_ssr/src/lib.rs +++ b/crates/ide_ssr/src/lib.rs | |||
@@ -58,6 +58,7 @@ | |||
58 | // | VS Code | **Rust Analyzer: Structural Search Replace** | 58 | // | VS Code | **Rust Analyzer: Structural Search Replace** |
59 | // |=== | 59 | // |=== |
60 | 60 | ||
61 | mod from_comment; | ||
61 | mod matching; | 62 | mod matching; |
62 | mod nester; | 63 | mod nester; |
63 | mod parsing; | 64 | mod parsing; |
@@ -71,6 +72,7 @@ mod tests; | |||
71 | 72 | ||
72 | use crate::errors::bail; | 73 | use crate::errors::bail; |
73 | pub use crate::errors::SsrError; | 74 | pub use crate::errors::SsrError; |
75 | pub use crate::from_comment::ssr_from_comment; | ||
74 | pub use crate::matching::Match; | 76 | pub use crate::matching::Match; |
75 | use crate::matching::MatchFailureReason; | 77 | use crate::matching::MatchFailureReason; |
76 | use hir::Semantics; | 78 | use hir::Semantics; |