Skip to content

Commit dacbc6a

Browse files
committed
move the rest of ssr parsing to fragments
1 parent 7e9c74d commit dacbc6a

File tree

2 files changed

+24
-30
lines changed

2 files changed

+24
-30
lines changed

crates/ide_ssr/src/fragments.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,20 @@ pub(crate) fn item(s: &str) -> Result<SyntaxNode, ()> {
3636
Ok(node.syntax().clone_subtree())
3737
}
3838

39+
pub(crate) fn pat(s: &str) -> Result<SyntaxNode, ()> {
40+
let template = "const _: () = {let {} = ();};";
41+
let input = template.replace("{}", s);
42+
let parse = syntax::SourceFile::parse(&input);
43+
if !parse.errors().is_empty() {
44+
return Err(());
45+
}
46+
let node = parse.tree().syntax().descendants().find_map(ast::Pat::cast).ok_or(())?;
47+
if node.to_string() != s {
48+
return Err(());
49+
}
50+
Ok(node.syntax().clone_subtree())
51+
}
52+
3953
pub(crate) fn expr(s: &str) -> Result<SyntaxNode, ()> {
4054
let template = "const _: () = {};";
4155
let input = template.replace("{}", s);

crates/ide_ssr/src/parsing.rs

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
//! placeholders, which start with `$`. For replacement templates, this is the final form. For
55
//! search patterns, we go further and parse the pattern as each kind of thing that we can match.
66
//! e.g. expressions, type references etc.
7+
use rustc_hash::{FxHashMap, FxHashSet};
8+
use std::{fmt::Display, str::FromStr};
9+
use syntax::{SmolStr, SyntaxKind, SyntaxNode, T};
710

811
use crate::errors::bail;
912
use crate::{fragments, SsrError, SsrPattern, SsrRule};
10-
use rustc_hash::{FxHashMap, FxHashSet};
11-
use std::{fmt::Display, str::FromStr};
12-
use syntax::{ast, AstNode, SmolStr, SyntaxKind, SyntaxNode, T};
1313

1414
#[derive(Debug)]
1515
pub(crate) struct ParsedRule {
@@ -75,14 +75,14 @@ impl ParsedRule {
7575

7676
let raw_template_stmt = raw_template.map(fragments::stmt);
7777
if let raw_template_expr @ Some(Ok(_)) = raw_template.map(fragments::expr) {
78-
builder.try_add2(fragments::expr(&raw_pattern), raw_template_expr);
78+
builder.try_add(fragments::expr(&raw_pattern), raw_template_expr);
7979
} else {
80-
builder.try_add2(fragments::expr(&raw_pattern), raw_template_stmt.clone());
80+
builder.try_add(fragments::expr(&raw_pattern), raw_template_stmt.clone());
8181
}
82-
builder.try_add2(fragments::ty(&raw_pattern), raw_template.map(fragments::ty));
83-
builder.try_add2(fragments::item(&raw_pattern), raw_template.map(fragments::item));
84-
builder.try_add(ast::Pat::parse(&raw_pattern), raw_template.map(ast::Pat::parse));
85-
builder.try_add2(fragments::stmt(&raw_pattern), raw_template_stmt);
82+
builder.try_add(fragments::ty(&raw_pattern), raw_template.map(fragments::ty));
83+
builder.try_add(fragments::item(&raw_pattern), raw_template.map(fragments::item));
84+
builder.try_add(fragments::pat(&raw_pattern), raw_template.map(fragments::pat));
85+
builder.try_add(fragments::stmt(&raw_pattern), raw_template_stmt);
8686
builder.build()
8787
}
8888
}
@@ -93,27 +93,7 @@ struct RuleBuilder {
9393
}
9494

9595
impl RuleBuilder {
96-
fn try_add<T: AstNode, T2: AstNode>(
97-
&mut self,
98-
pattern: Result<T, ()>,
99-
template: Option<Result<T2, ()>>,
100-
) {
101-
match (pattern, template) {
102-
(Ok(pattern), Some(Ok(template))) => self.rules.push(ParsedRule {
103-
placeholders_by_stand_in: self.placeholders_by_stand_in.clone(),
104-
pattern: pattern.syntax().clone(),
105-
template: Some(template.syntax().clone()),
106-
}),
107-
(Ok(pattern), None) => self.rules.push(ParsedRule {
108-
placeholders_by_stand_in: self.placeholders_by_stand_in.clone(),
109-
pattern: pattern.syntax().clone(),
110-
template: None,
111-
}),
112-
_ => {}
113-
}
114-
}
115-
116-
fn try_add2(
96+
fn try_add(
11797
&mut self,
11898
pattern: Result<SyntaxNode, ()>,
11999
template: Option<Result<SyntaxNode, ()>>,

0 commit comments

Comments
 (0)