Implement slice pattern AST > HIR lowering

This commit is contained in:
Jonas Platte 2020-02-11 22:33:11 +01:00
parent 3e1d97790b
commit a3b104aa6d
No known key found for this signature in database
GPG key ID: 7D261D771D915378
8 changed files with 64 additions and 13 deletions

View file

@ -1,6 +1,8 @@
//! Various extension methods to ast Nodes, which are hard to code-generate.
//! Extensions for various expressions live in a sibling `expr_extensions` module.
use itertools::Itertools;
use crate::{
ast::{self, child_opt, children, AstNode, AttrInput, SyntaxNode},
SmolStr, SyntaxElement,
@ -293,6 +295,40 @@ impl ast::BindPat {
}
}
pub struct SlicePatComponents {
pub prefix: Vec<ast::Pat>,
pub slice: Option<ast::Pat>,
pub suffix: Vec<ast::Pat>,
}
impl ast::SlicePat {
pub fn components(&self) -> SlicePatComponents {
let mut args = self.args().peekable();
let prefix = args
.peeking_take_while(|p| match p {
ast::Pat::DotDotPat(_) => false,
ast::Pat::BindPat(bp) => match bp.pat() {
Some(ast::Pat::DotDotPat(_)) => false,
_ => true,
},
ast::Pat::RefPat(rp) => match rp.pat() {
Some(ast::Pat::DotDotPat(_)) => false,
Some(ast::Pat::BindPat(bp)) => match bp.pat() {
Some(ast::Pat::DotDotPat(_)) => false,
_ => true,
},
_ => true,
},
_ => true,
})
.collect();
let slice = args.next();
let suffix = args.collect();
SlicePatComponents { prefix, slice, suffix }
}
}
impl ast::PointerType {
pub fn is_mut(&self) -> bool {
self.syntax().children_with_tokens().any(|n| n.kind() == T![mut])