aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax/src/ast
diff options
context:
space:
mode:
authorJonas Platte <[email protected]>2020-02-11 21:33:11 +0000
committerJonas Platte <[email protected]>2020-02-11 21:33:11 +0000
commita3b104aa6df205e74c116d8c9e41900807924e70 (patch)
treeac3cb2695fba41813b70cadee3e624f71dfa2fd3 /crates/ra_syntax/src/ast
parent3e1d97790be166f8735607c552a94a28ab9b09b8 (diff)
Implement slice pattern AST > HIR lowering
Diffstat (limited to 'crates/ra_syntax/src/ast')
-rw-r--r--crates/ra_syntax/src/ast/extensions.rs36
-rw-r--r--crates/ra_syntax/src/ast/generated.rs6
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
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])
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}
2066impl SlicePat {} 2066impl 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)]
2068pub struct RangePat { 2072pub struct RangePat {
2069 pub(crate) syntax: SyntaxNode, 2073 pub(crate) syntax: SyntaxNode,