Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_ssr/src/parsing.rs')
| -rw-r--r-- | crates/ide_ssr/src/parsing.rs | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/crates/ide_ssr/src/parsing.rs b/crates/ide_ssr/src/parsing.rs index ae7d5b4bf1..aaaee576b5 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 crate::errors::bail; -use crate::{SsrError, SsrPattern, SsrRule}; use rustc_hash::{FxHashMap, FxHashSet}; use std::{fmt::Display, str::FromStr}; -use syntax::{ast, AstNode, SmolStr, SyntaxKind, SyntaxNode, T}; +use syntax::{SmolStr, SyntaxKind, SyntaxNode, T}; + +use crate::errors::bail; +use crate::{fragments, SsrError, SsrPattern, SsrRule}; #[derive(Debug)] pub(crate) struct ParsedRule { @@ -73,17 +73,16 @@ impl ParsedRule { rules: Vec::new(), }; - let raw_template_stmt = raw_template.map(ast::Stmt::parse); - if let raw_template_expr @ Some(Ok(_)) = raw_template.map(ast::Expr::parse) { - builder.try_add(ast::Expr::parse(&raw_pattern), raw_template_expr); + let raw_template_stmt = raw_template.map(fragments::stmt); + if let raw_template_expr @ Some(Ok(_)) = raw_template.map(fragments::expr) { + builder.try_add(fragments::expr(&raw_pattern), raw_template_expr); } else { - builder.try_add(ast::Expr::parse(&raw_pattern), raw_template_stmt.clone()); + builder.try_add(fragments::expr(&raw_pattern), raw_template_stmt.clone()); } - builder.try_add(ast::Type::parse(&raw_pattern), raw_template.map(ast::Type::parse)); - builder.try_add(ast::Item::parse(&raw_pattern), raw_template.map(ast::Item::parse)); - builder.try_add(ast::Path::parse(&raw_pattern), raw_template.map(ast::Path::parse)); - builder.try_add(ast::Pat::parse(&raw_pattern), raw_template.map(ast::Pat::parse)); - builder.try_add(ast::Stmt::parse(&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() } } @@ -94,20 +93,20 @@ struct RuleBuilder { } impl RuleBuilder { - fn try_add<T: AstNode, T2: AstNode>( + fn try_add( &mut self, - pattern: Result<T, ()>, - template: Option<Result<T2, ()>>, + pattern: Result<SyntaxNode, ()>, + template: Option<Result<SyntaxNode, ()>>, ) { 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()), + pattern, + template: Some(template), }), (Ok(pattern), None) => self.rules.push(ParsedRule { placeholders_by_stand_in: self.placeholders_by_stand_in.clone(), - pattern: pattern.syntax().clone(), + pattern, template: None, }), _ => {} |