Add BoxPat variant

This commit is contained in:
Dylan MacKenzie 2019-08-23 13:04:58 -07:00
parent fdece911fe
commit e6f3790106
3 changed files with 41 additions and 2 deletions

View file

@ -149,6 +149,7 @@ pub enum SyntaxKind {
IMPL_TRAIT_TYPE, IMPL_TRAIT_TYPE,
DYN_TRAIT_TYPE, DYN_TRAIT_TYPE,
REF_PAT, REF_PAT,
BOX_PAT,
BIND_PAT, BIND_PAT,
PLACEHOLDER_PAT, PLACEHOLDER_PAT,
PATH_PAT, PATH_PAT,

View file

@ -307,6 +307,33 @@ impl BlockExpr {
} }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct BoxPat {
pub(crate) syntax: SyntaxNode,
}
impl AstNode for BoxPat {
fn can_cast(kind: SyntaxKind) -> bool {
match kind {
BOX_PAT => true,
_ => false,
}
}
fn cast(syntax: SyntaxNode) -> Option<Self> {
if Self::can_cast(syntax.kind()) {
Some(Self { syntax })
} else {
None
}
}
fn syntax(&self) -> &SyntaxNode {
&self.syntax
}
}
impl BoxPat {
pub fn pat(&self) -> Option<Pat> {
AstChildren::new(&self.syntax).next()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct BreakExpr { pub struct BreakExpr {
pub(crate) syntax: SyntaxNode, pub(crate) syntax: SyntaxNode,
} }
@ -2063,6 +2090,7 @@ impl ParenType {
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Pat { pub enum Pat {
RefPat(RefPat), RefPat(RefPat),
BoxPat(BoxPat),
BindPat(BindPat), BindPat(BindPat),
PlaceholderPat(PlaceholderPat), PlaceholderPat(PlaceholderPat),
PathPat(PathPat), PathPat(PathPat),
@ -2078,6 +2106,11 @@ impl From<RefPat> for Pat {
Pat::RefPat(node) Pat::RefPat(node)
} }
} }
impl From<BoxPat> for Pat {
fn from(node: BoxPat) -> Pat {
Pat::BoxPat(node)
}
}
impl From<BindPat> for Pat { impl From<BindPat> for Pat {
fn from(node: BindPat) -> Pat { fn from(node: BindPat) -> Pat {
Pat::BindPat(node) Pat::BindPat(node)
@ -2126,14 +2159,15 @@ impl From<LiteralPat> for Pat {
impl AstNode for Pat { impl AstNode for Pat {
fn can_cast(kind: SyntaxKind) -> bool { fn can_cast(kind: SyntaxKind) -> bool {
match kind { match kind {
REF_PAT | BIND_PAT | PLACEHOLDER_PAT | PATH_PAT | RECORD_PAT | TUPLE_STRUCT_PAT REF_PAT | BOX_PAT | BIND_PAT | PLACEHOLDER_PAT | PATH_PAT | RECORD_PAT
| TUPLE_PAT | SLICE_PAT | RANGE_PAT | LITERAL_PAT => true, | TUPLE_STRUCT_PAT | TUPLE_PAT | SLICE_PAT | RANGE_PAT | LITERAL_PAT => true,
_ => false, _ => false,
} }
} }
fn cast(syntax: SyntaxNode) -> Option<Self> { fn cast(syntax: SyntaxNode) -> Option<Self> {
let res = match syntax.kind() { let res = match syntax.kind() {
REF_PAT => Pat::RefPat(RefPat { syntax }), REF_PAT => Pat::RefPat(RefPat { syntax }),
BOX_PAT => Pat::BoxPat(BoxPat { syntax }),
BIND_PAT => Pat::BindPat(BindPat { syntax }), BIND_PAT => Pat::BindPat(BindPat { syntax }),
PLACEHOLDER_PAT => Pat::PlaceholderPat(PlaceholderPat { syntax }), PLACEHOLDER_PAT => Pat::PlaceholderPat(PlaceholderPat { syntax }),
PATH_PAT => Pat::PathPat(PathPat { syntax }), PATH_PAT => Pat::PathPat(PathPat { syntax }),
@ -2150,6 +2184,7 @@ impl AstNode for Pat {
fn syntax(&self) -> &SyntaxNode { fn syntax(&self) -> &SyntaxNode {
match self { match self {
Pat::RefPat(it) => &it.syntax, Pat::RefPat(it) => &it.syntax,
Pat::BoxPat(it) => &it.syntax,
Pat::BindPat(it) => &it.syntax, Pat::BindPat(it) => &it.syntax,
Pat::PlaceholderPat(it) => &it.syntax, Pat::PlaceholderPat(it) => &it.syntax,
Pat::PathPat(it) => &it.syntax, Pat::PathPat(it) => &it.syntax,

View file

@ -158,6 +158,7 @@ Grammar(
"DYN_TRAIT_TYPE", "DYN_TRAIT_TYPE",
"REF_PAT", "REF_PAT",
"BOX_PAT",
"BIND_PAT", "BIND_PAT",
"PLACEHOLDER_PAT", "PLACEHOLDER_PAT",
"PATH_PAT", "PATH_PAT",
@ -523,6 +524,7 @@ Grammar(
), ),
"RefPat": ( options: [ "Pat" ]), "RefPat": ( options: [ "Pat" ]),
"BoxPat": ( options: [ "Pat" ]),
"BindPat": ( "BindPat": (
options: [ "Pat" ], options: [ "Pat" ],
traits: ["NameOwner"] traits: ["NameOwner"]
@ -552,6 +554,7 @@ Grammar(
"Pat": ( "Pat": (
enum: [ enum: [
"RefPat", "RefPat",
"BoxPat",
"BindPat", "BindPat",
"PlaceholderPat", "PlaceholderPat",
"PathPat", "PathPat",