diff options
author | Jonas Platte <[email protected]> | 2020-02-11 21:33:11 +0000 |
---|---|---|
committer | Jonas Platte <[email protected]> | 2020-02-11 21:33:11 +0000 |
commit | a3b104aa6df205e74c116d8c9e41900807924e70 (patch) | |
tree | ac3cb2695fba41813b70cadee3e624f71dfa2fd3 /crates/ra_syntax/src/ast | |
parent | 3e1d97790be166f8735607c552a94a28ab9b09b8 (diff) |
Implement slice pattern AST > HIR lowering
Diffstat (limited to 'crates/ra_syntax/src/ast')
-rw-r--r-- | crates/ra_syntax/src/ast/extensions.rs | 36 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 6 |
2 files changed, 41 insertions, 1 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 | ||
4 | use itertools::Itertools; | ||
5 | |||
4 | use crate::{ | 6 | use 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 | ||
298 | pub struct SlicePatComponents { | ||
299 | pub prefix: Vec<ast::Pat>, | ||
300 | pub slice: Option<ast::Pat>, | ||
301 | pub suffix: Vec<ast::Pat>, | ||
302 | } | ||
303 | |||
304 | impl 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 | |||
296 | impl ast::PointerType { | 332 | impl 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]) |
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 33d5578e7..8a3669bd1 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -2063,7 +2063,11 @@ impl AstNode for SlicePat { | |||
2063 | &self.syntax | 2063 | &self.syntax |
2064 | } | 2064 | } |
2065 | } | 2065 | } |
2066 | impl SlicePat {} | 2066 | impl SlicePat { |
2067 | pub fn args(&self) -> AstChildren<Pat> { | ||
2068 | AstChildren::new(&self.syntax) | ||
2069 | } | ||
2070 | } | ||
2067 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 2071 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
2068 | pub struct RangePat { | 2072 | pub struct RangePat { |
2069 | pub(crate) syntax: SyntaxNode, | 2073 | pub(crate) syntax: SyntaxNode, |