about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAleksey Kladov <aleksey.kladov@gmail.com>2021-12-27 21:33:24 +0300
committerAleksey Kladov <aleksey.kladov@gmail.com>2021-12-28 17:00:55 +0300
commitdacbc6a69a5bd2ea7b4f5680d58659ec8ab4369b (patch)
treeec055dbef3db1fedc67abc8b431a6c447791a924
parent7e9c74d20bb8b33889179315f82160285469c5f6 (diff)
downloadrust-dacbc6a69a5bd2ea7b4f5680d58659ec8ab4369b.tar.gz
rust-dacbc6a69a5bd2ea7b4f5680d58659ec8ab4369b.zip
move the rest of ssr parsing to fragments
-rw-r--r--crates/ide_ssr/src/fragments.rs14
-rw-r--r--crates/ide_ssr/src/parsing.rs40
2 files changed, 24 insertions, 30 deletions
diff --git a/crates/ide_ssr/src/fragments.rs b/crates/ide_ssr/src/fragments.rs
index 4c768a970b1..dab214b4074 100644
--- a/crates/ide_ssr/src/fragments.rs
+++ b/crates/ide_ssr/src/fragments.rs
@@ -36,6 +36,20 @@ pub(crate) fn item(s: &str) -> Result<SyntaxNode, ()> {
     Ok(node.syntax().clone_subtree())
 }
 
+pub(crate) fn pat(s: &str) -> Result<SyntaxNode, ()> {
+    let template = "const _: () = {let {} = ();};";
+    let input = template.replace("{}", s);
+    let parse = syntax::SourceFile::parse(&input);
+    if !parse.errors().is_empty() {
+        return Err(());
+    }
+    let node = parse.tree().syntax().descendants().find_map(ast::Pat::cast).ok_or(())?;
+    if node.to_string() != s {
+        return Err(());
+    }
+    Ok(node.syntax().clone_subtree())
+}
+
 pub(crate) fn expr(s: &str) -> Result<SyntaxNode, ()> {
     let template = "const _: () = {};";
     let input = template.replace("{}", s);
diff --git a/crates/ide_ssr/src/parsing.rs b/crates/ide_ssr/src/parsing.rs
index d70823403e6..aaaee576b52 100644
--- a/crates/ide_ssr/src/parsing.rs
+++ b/crates/ide_ssr/src/parsing.rs
@@ -4,12 +4,12 @@
 //! placeholders, which start with `$`. For replacement templates, this is the final form. For
 //! search patterns, we go further and parse the pattern as each kind of thing that we can match.
 //! e.g. expressions, type references etc.
+use rustc_hash::{FxHashMap, FxHashSet};
+use std::{fmt::Display, str::FromStr};
+use syntax::{SmolStr, SyntaxKind, SyntaxNode, T};
 
 use crate::errors::bail;
 use crate::{fragments, SsrError, SsrPattern, SsrRule};
-use rustc_hash::{FxHashMap, FxHashSet};
-use std::{fmt::Display, str::FromStr};
-use syntax::{ast, AstNode, SmolStr, SyntaxKind, SyntaxNode, T};
 
 #[derive(Debug)]
 pub(crate) struct ParsedRule {
@@ -75,14 +75,14 @@ impl ParsedRule {
 
         let raw_template_stmt = raw_template.map(fragments::stmt);
         if let raw_template_expr @ Some(Ok(_)) = raw_template.map(fragments::expr) {
-            builder.try_add2(fragments::expr(&raw_pattern), raw_template_expr);
+            builder.try_add(fragments::expr(&raw_pattern), raw_template_expr);
         } else {
-            builder.try_add2(fragments::expr(&raw_pattern), raw_template_stmt.clone());
+            builder.try_add(fragments::expr(&raw_pattern), raw_template_stmt.clone());
         }
-        builder.try_add2(fragments::ty(&raw_pattern), raw_template.map(fragments::ty));
-        builder.try_add2(fragments::item(&raw_pattern), raw_template.map(fragments::item));
-        builder.try_add(ast::Pat::parse(&raw_pattern), raw_template.map(ast::Pat::parse));
-        builder.try_add2(fragments::stmt(&raw_pattern), raw_template_stmt);
+        builder.try_add(fragments::ty(&raw_pattern), raw_template.map(fragments::ty));
+        builder.try_add(fragments::item(&raw_pattern), raw_template.map(fragments::item));
+        builder.try_add(fragments::pat(&raw_pattern), raw_template.map(fragments::pat));
+        builder.try_add(fragments::stmt(&raw_pattern), raw_template_stmt);
         builder.build()
     }
 }
@@ -93,27 +93,7 @@ struct RuleBuilder {
 }
 
 impl RuleBuilder {
-    fn try_add<T: AstNode, T2: AstNode>(
-        &mut self,
-        pattern: Result<T, ()>,
-        template: Option<Result<T2, ()>>,
-    ) {
-        match (pattern, template) {
-            (Ok(pattern), Some(Ok(template))) => self.rules.push(ParsedRule {
-                placeholders_by_stand_in: self.placeholders_by_stand_in.clone(),
-                pattern: pattern.syntax().clone(),
-                template: Some(template.syntax().clone()),
-            }),
-            (Ok(pattern), None) => self.rules.push(ParsedRule {
-                placeholders_by_stand_in: self.placeholders_by_stand_in.clone(),
-                pattern: pattern.syntax().clone(),
-                template: None,
-            }),
-            _ => {}
-        }
-    }
-
-    fn try_add2(
+    fn try_add(
         &mut self,
         pattern: Result<SyntaxNode, ()>,
         template: Option<Result<SyntaxNode, ()>>,