Skip to content

Commit ad8198d

Browse files
committed
Support macro patterns
This requires the #[sep] support, since the MacroCall node can either be a Pat or an Expr.
1 parent 2334992 commit ad8198d

File tree

3 files changed

+21
-6
lines changed

3 files changed

+21
-6
lines changed

crates/ra_hir_def/src/body/lower.rs

+1
Original file line numberDiff line numberDiff line change
@@ -688,6 +688,7 @@ impl ExprCollector<'_> {
688688
ast::Pat::BoxPat(_) => Pat::Missing,
689689
ast::Pat::LiteralPat(_) => Pat::Missing,
690690
ast::Pat::RangePat(_) => Pat::Missing,
691+
ast::Pat::MacroCall(_) => Pat::Missing,
691692
};
692693
let ptr = AstPtr::new(&pat);
693694
self.alloc_pat(pattern, Either::Left(ptr))

crates/ra_syntax/src/ast/generated.rs

+19-6
Original file line numberDiff line numberDiff line change
@@ -14853,6 +14853,7 @@ pub enum Pat {
1485314853
SlicePat(SlicePat),
1485414854
RangePat(RangePat),
1485514855
LiteralPat(LiteralPat),
14856+
MacroCall(MacroCall),
1485614857
}
1485714858
impl From<OrPat> for Pat {
1485814859
fn from(node: OrPat) -> Pat {
@@ -14924,6 +14925,11 @@ impl From<LiteralPat> for Pat {
1492414925
Pat::LiteralPat(node)
1492514926
}
1492614927
}
14928+
impl From<MacroCall> for Pat {
14929+
fn from(node: MacroCall) -> Pat {
14930+
Pat::MacroCall(node)
14931+
}
14932+
}
1492714933
impl std::fmt::Display for Pat {
1492814934
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1492914935
match self {
@@ -14941,15 +14947,16 @@ impl std::fmt::Display for Pat {
1494114947
Pat::SlicePat(it) => std::fmt::Display::fmt(it, f),
1494214948
Pat::RangePat(it) => std::fmt::Display::fmt(it, f),
1494314949
Pat::LiteralPat(it) => std::fmt::Display::fmt(it, f),
14950+
Pat::MacroCall(it) => std::fmt::Display::fmt(it, f),
1494414951
}
1494514952
}
1494614953
}
1494714954
impl AstNode for Pat {
1494814955
fn can_cast(kind: SyntaxKind) -> bool {
1494914956
match kind {
14950-
BIND_PAT | BOX_PAT | DOT_DOT_PAT | LITERAL_PAT | OR_PAT | PAREN_PAT | PATH_PAT
14951-
| PLACEHOLDER_PAT | RANGE_PAT | RECORD_PAT | REF_PAT | SLICE_PAT | TUPLE_PAT
14952-
| TUPLE_STRUCT_PAT => true,
14957+
BIND_PAT | BOX_PAT | DOT_DOT_PAT | LITERAL_PAT | MACRO_CALL | OR_PAT | PAREN_PAT
14958+
| PATH_PAT | PLACEHOLDER_PAT | RANGE_PAT | RECORD_PAT | REF_PAT | SLICE_PAT
14959+
| TUPLE_PAT | TUPLE_STRUCT_PAT => true,
1495314960
_ => false,
1495414961
}
1495514962
}
@@ -14974,6 +14981,7 @@ impl AstNode for Pat {
1497414981
SLICE_PAT => SlicePat::cast_or_return(syntax).map(|x| Pat::SlicePat(x)),
1497514982
RANGE_PAT => RangePat::cast_or_return(syntax).map(|x| Pat::RangePat(x)),
1497614983
LITERAL_PAT => LiteralPat::cast_or_return(syntax).map(|x| Pat::LiteralPat(x)),
14984+
MACRO_CALL => MacroCall::cast_or_return(syntax).map(|x| Pat::MacroCall(x)),
1497714985
_ => Err(syntax),
1497814986
}
1497914987
}
@@ -14993,6 +15001,7 @@ impl AstNode for Pat {
1499315001
Pat::SlicePat(it) => it.syntax(),
1499415002
Pat::RangePat(it) => it.syntax(),
1499515003
Pat::LiteralPat(it) => it.syntax(),
15004+
Pat::MacroCall(it) => it.syntax(),
1499615005
}
1499715006
}
1499815007
fn into_syntax(self) -> SyntaxNode {
@@ -15011,15 +15020,16 @@ impl AstNode for Pat {
1501115020
Pat::SlicePat(it) => it.into_syntax(),
1501215021
Pat::RangePat(it) => it.into_syntax(),
1501315022
Pat::LiteralPat(it) => it.into_syntax(),
15023+
Pat::MacroCall(it) => it.into_syntax(),
1501415024
}
1501515025
}
1501615026
}
1501715027
impl AstElement for Pat {
1501815028
fn can_cast_element(kind: SyntaxKind) -> bool {
1501915029
match kind {
15020-
BIND_PAT | BOX_PAT | DOT_DOT_PAT | LITERAL_PAT | OR_PAT | PAREN_PAT | PATH_PAT
15021-
| PLACEHOLDER_PAT | RANGE_PAT | RECORD_PAT | REF_PAT | SLICE_PAT | TUPLE_PAT
15022-
| TUPLE_STRUCT_PAT => true,
15030+
BIND_PAT | BOX_PAT | DOT_DOT_PAT | LITERAL_PAT | MACRO_CALL | OR_PAT | PAREN_PAT
15031+
| PATH_PAT | PLACEHOLDER_PAT | RANGE_PAT | RECORD_PAT | REF_PAT | SLICE_PAT
15032+
| TUPLE_PAT | TUPLE_STRUCT_PAT => true,
1502315033
_ => false,
1502415034
}
1502515035
}
@@ -15044,6 +15054,7 @@ impl AstElement for Pat {
1504415054
SLICE_PAT => SlicePat::cast_or_return_element(syntax).map(|x| Pat::SlicePat(x)),
1504515055
RANGE_PAT => RangePat::cast_or_return_element(syntax).map(|x| Pat::RangePat(x)),
1504615056
LITERAL_PAT => LiteralPat::cast_or_return_element(syntax).map(|x| Pat::LiteralPat(x)),
15057+
MACRO_CALL => MacroCall::cast_or_return_element(syntax).map(|x| Pat::MacroCall(x)),
1504715058
_ => Err(syntax),
1504815059
}
1504915060
}
@@ -15063,6 +15074,7 @@ impl AstElement for Pat {
1506315074
Pat::SlicePat(it) => it.syntax_element(),
1506415075
Pat::RangePat(it) => it.syntax_element(),
1506515076
Pat::LiteralPat(it) => it.syntax_element(),
15077+
Pat::MacroCall(it) => it.syntax_element(),
1506615078
}
1506715079
}
1506815080
fn into_syntax_element(self) -> SyntaxElement {
@@ -15081,6 +15093,7 @@ impl AstElement for Pat {
1508115093
Pat::SlicePat(it) => it.into_syntax_element(),
1508215094
Pat::RangePat(it) => it.into_syntax_element(),
1508315095
Pat::LiteralPat(it) => it.into_syntax_element(),
15096+
Pat::MacroCall(it) => it.into_syntax_element(),
1508415097
}
1508515098
}
1508615099
}

xtask/src/ast_src.rs

+1
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ pub(crate) const AST_SRC: AstSrc = AstSrc {
748748
SlicePat,
749749
RangePat,
750750
LiteralPat,
751+
MacroCall
751752
}
752753

753754
enum RecordInnerPat {

0 commit comments

Comments
 (0)