Implement slice pattern AST > HIR lowering
This commit is contained in:
@@ -18,7 +18,8 @@ use crate::{
|
||||
pub use self::{
|
||||
expr_extensions::{ArrayExprKind, BinOp, ElseBranch, LiteralKind, PrefixOp, RangeOp},
|
||||
extensions::{
|
||||
FieldKind, PathSegmentKind, SelfParamKind, StructKind, TypeBoundKind, VisibilityKind,
|
||||
FieldKind, PathSegmentKind, SelfParamKind, SlicePatComponents, StructKind, TypeBoundKind,
|
||||
VisibilityKind,
|
||||
},
|
||||
generated::*,
|
||||
tokens::*,
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -2063,7 +2063,11 @@ impl AstNode for SlicePat {
|
||||
&self.syntax
|
||||
}
|
||||
}
|
||||
impl SlicePat {}
|
||||
impl SlicePat {
|
||||
pub fn args(&self) -> AstChildren<Pat> {
|
||||
AstChildren::new(&self.syntax)
|
||||
}
|
||||
}
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||
pub struct RangePat {
|
||||
pub(crate) syntax: SyntaxNode,
|
||||
|
||||
Reference in New Issue
Block a user