aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/ast/extensions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax/src/ast/extensions.rs')
-rw-r--r--crates/ra_syntax/src/ast/extensions.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/crates/ra_syntax/src/ast/extensions.rs b/crates/ra_syntax/src/ast/extensions.rs
index cb0aee422..7dcf084de 100644
--- a/crates/ra_syntax/src/ast/extensions.rs
+++ b/crates/ra_syntax/src/ast/extensions.rs
@@ -1,6 +1,8 @@
1//! Various extension methods to ast Nodes, which are hard to code-generate. 1//! Various extension methods to ast Nodes, which are hard to code-generate.
2//! Extensions for various expressions live in a sibling `expr_extensions` module. 2//! Extensions for various expressions live in a sibling `expr_extensions` module.
3 3
4use itertools::Itertools;
5
4use crate::{ 6use crate::{
5 ast::{self, child_opt, children, AstNode, AttrInput, SyntaxNode}, 7 ast::{self, child_opt, children, AstNode, AttrInput, SyntaxNode},
6 SmolStr, SyntaxElement, 8 SmolStr, SyntaxElement,
@@ -293,6 +295,40 @@ impl ast::BindPat {
293 } 295 }
294} 296}
295 297
298pub struct SlicePatComponents {
299 pub prefix: Vec<ast::Pat>,
300 pub slice: Option<ast::Pat>,
301 pub suffix: Vec<ast::Pat>,
302}
303
304impl ast::SlicePat {
305 pub fn components(&self) -> SlicePatComponents {
306 let mut args = self.args().peekable();
307 let prefix = args
308 .peeking_take_while(|p| match p {
309 ast::Pat::DotDotPat(_) => false,
310 ast::Pat::BindPat(bp) => match bp.pat() {
311 Some(ast::Pat::DotDotPat(_)) => false,
312 _ => true,
313 },
314 ast::Pat::RefPat(rp) => match rp.pat() {
315 Some(ast::Pat::DotDotPat(_)) => false,
316 Some(ast::Pat::BindPat(bp)) => match bp.pat() {
317 Some(ast::Pat::DotDotPat(_)) => false,
318 _ => true,
319 },
320 _ => true,
321 },
322 _ => true,
323 })
324 .collect();
325 let slice = args.next();
326 let suffix = args.collect();
327
328 SlicePatComponents { prefix, slice, suffix }
329 }
330}
331
296impl ast::PointerType { 332impl ast::PointerType {
297 pub fn is_mut(&self) -> bool { 333 pub fn is_mut(&self) -> bool {
298 self.syntax().children_with_tokens().any(|n| n.kind() == T![mut]) 334 self.syntax().children_with_tokens().any(|n| n.kind() == T![mut])