Skip to content

Commit 2cbfcf4

Browse files
committed
add ssr fragment for statements
1 parent df2a996 commit 2cbfcf4

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

crates/ide_ssr/src/fragments.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub(crate) fn ty(s: &str) -> Result<SyntaxNode, ()> {
1919
if node.to_string() != s {
2020
return Err(());
2121
}
22-
Ok(node.syntax().clone())
22+
Ok(node.syntax().clone_subtree())
2323
}
2424

2525
pub(crate) fn item(s: &str) -> Result<SyntaxNode, ()> {
@@ -33,7 +33,7 @@ pub(crate) fn item(s: &str) -> Result<SyntaxNode, ()> {
3333
if node.to_string() != s {
3434
return Err(());
3535
}
36-
Ok(node.syntax().clone())
36+
Ok(node.syntax().clone_subtree())
3737
}
3838

3939
pub(crate) fn expr(s: &str) -> Result<SyntaxNode, ()> {
@@ -47,5 +47,24 @@ pub(crate) fn expr(s: &str) -> Result<SyntaxNode, ()> {
4747
if node.to_string() != s {
4848
return Err(());
4949
}
50-
Ok(node.syntax().clone())
50+
Ok(node.syntax().clone_subtree())
51+
}
52+
53+
pub(crate) fn stmt(s: &str) -> Result<SyntaxNode, ()> {
54+
let template = "const _: () = { {}; };";
55+
let input = template.replace("{}", s);
56+
let parse = syntax::SourceFile::parse(&input);
57+
if !parse.errors().is_empty() {
58+
return Err(());
59+
}
60+
let mut node =
61+
parse.tree().syntax().descendants().skip(2).find_map(ast::Stmt::cast).ok_or(())?;
62+
if !s.ends_with(';') && node.to_string().ends_with(';') {
63+
node = node.clone_for_update();
64+
node.syntax().last_token().map(|it| it.detach());
65+
}
66+
if node.to_string() != s {
67+
return Err(());
68+
}
69+
Ok(node.syntax().clone_subtree())
5170
}

crates/ide_ssr/src/parsing.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,17 +73,17 @@ impl ParsedRule {
7373
rules: Vec::new(),
7474
};
7575

76-
let raw_template_stmt = raw_template.map(ast::Stmt::parse);
76+
let raw_template_stmt = raw_template.map(fragments::stmt);
7777
if let raw_template_expr @ Some(Ok(_)) = raw_template.map(fragments::expr) {
7878
builder.try_add2(fragments::expr(&raw_pattern), raw_template_expr);
7979
} else {
80-
builder.try_add(ast::Expr::parse(&raw_pattern), raw_template_stmt.clone());
80+
builder.try_add2(fragments::expr(&raw_pattern), raw_template_stmt.clone());
8181
}
8282
builder.try_add2(fragments::ty(&raw_pattern), raw_template.map(fragments::ty));
8383
builder.try_add2(fragments::item(&raw_pattern), raw_template.map(fragments::item));
8484
builder.try_add(ast::Path::parse(&raw_pattern), raw_template.map(ast::Path::parse));
8585
builder.try_add(ast::Pat::parse(&raw_pattern), raw_template.map(ast::Pat::parse));
86-
builder.try_add(ast::Stmt::parse(&raw_pattern), raw_template_stmt);
86+
builder.try_add2(fragments::stmt(&raw_pattern), raw_template_stmt);
8787
builder.build()
8888
}
8989
}

0 commit comments

Comments
 (0)