Skip to content

Commit 66d97b8

Browse files
giacomocavalierilpil
authored andcommitted
split clause guard parsing function
this mirrors the expression parsing of binary operators and will (hopefully) make it easier to keep track of blocks in the parsed clause guards
1 parent 111cc32 commit 66d97b8

File tree

1 file changed

+55
-53
lines changed

1 file changed

+55
-53
lines changed

compiler-core/src/parse.rs

Lines changed: 55 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,7 +1567,7 @@ where
15671567
}
15681568
alternative_patterns.push(self.parse_patterns(PatternPosition::CaseClause)?);
15691569
}
1570-
let guard = self.parse_case_clause_guard(false)?;
1570+
let guard = self.parse_case_clause_guard()?;
15711571
let (arr_s, arr_e) = self
15721572
.expect_one(&Token::RArrow)
15731573
.map_err(|e| self.add_multi_line_clause_hint(e))?;
@@ -1615,65 +1615,65 @@ where
16151615
// if a
16161616
// if a < b
16171617
// if a < b || b < c
1618-
fn parse_case_clause_guard(
1619-
&mut self,
1620-
nested: bool,
1621-
) -> Result<Option<UntypedClauseGuard>, ParseError> {
1622-
if self.maybe_one(&Token::If).is_some() || nested {
1623-
let mut opstack = vec![];
1624-
let mut estack = vec![];
1625-
let mut last_op_start = 0;
1626-
let mut last_op_end = 0;
1627-
loop {
1628-
match self.parse_case_clause_guard_unit()? {
1629-
Some(unit) => estack.push(unit),
1630-
_ => {
1631-
if estack.is_empty() {
1632-
return Ok(None);
1633-
} else {
1634-
return parse_error(
1635-
ParseErrorType::OpNakedRight,
1636-
SrcSpan {
1637-
start: last_op_start,
1638-
end: last_op_end,
1639-
},
1640-
);
1641-
}
1642-
}
1643-
}
1618+
fn parse_case_clause_guard(&mut self) -> Result<Option<UntypedClauseGuard>, ParseError> {
1619+
if self.maybe_one(&Token::If).is_some() {
1620+
self.parse_clause_guard_inner()
1621+
} else {
1622+
Ok(None)
1623+
}
1624+
}
16441625

1645-
if let Some((op_s, t, op_e)) = self.tok0.take() {
1646-
match t.guard_precedence() {
1647-
Some(p) => {
1648-
// Is Op
1649-
self.advance();
1650-
last_op_start = op_s;
1651-
last_op_end = op_e;
1652-
let _ = handle_op(
1653-
Some(((op_s, t, op_e), p)),
1654-
&mut opstack,
1655-
&mut estack,
1656-
&do_reduce_clause_guard,
1657-
);
1658-
}
1659-
_ => {
1660-
// Is not Op
1661-
self.tok0 = Some((op_s, t, op_e));
1662-
break;
1663-
}
1626+
fn parse_clause_guard_inner(&mut self) -> Result<Option<UntypedClauseGuard>, ParseError> {
1627+
let mut opstack = vec![];
1628+
let mut estack = vec![];
1629+
let mut last_op_start = 0;
1630+
let mut last_op_end = 0;
1631+
loop {
1632+
match self.parse_case_clause_guard_unit()? {
1633+
Some(unit) => estack.push(unit),
1634+
_ => {
1635+
if estack.is_empty() {
1636+
return Ok(None);
1637+
} else {
1638+
return parse_error(
1639+
ParseErrorType::OpNakedRight,
1640+
SrcSpan {
1641+
start: last_op_start,
1642+
end: last_op_end,
1643+
},
1644+
);
16641645
}
16651646
}
16661647
}
16671648

1668-
Ok(handle_op(
1669-
None,
1649+
let Some((op_s, t, op_e)) = self.tok0.take() else {
1650+
break;
1651+
};
1652+
1653+
let Some(precedence) = t.guard_precedence() else {
1654+
// Is not Op
1655+
self.tok0 = Some((op_s, t, op_e));
1656+
break;
1657+
};
1658+
1659+
// Is Op
1660+
self.advance();
1661+
last_op_start = op_s;
1662+
last_op_end = op_e;
1663+
let _ = handle_op(
1664+
Some(((op_s, t, op_e), precedence)),
16701665
&mut opstack,
16711666
&mut estack,
16721667
&do_reduce_clause_guard,
1673-
))
1674-
} else {
1675-
Ok(None)
1668+
);
16761669
}
1670+
1671+
Ok(handle_op(
1672+
None,
1673+
&mut opstack,
1674+
&mut estack,
1675+
&do_reduce_clause_guard,
1676+
))
16771677
}
16781678

16791679
/// Checks if we have an unexpected left parenthesis and returns appropriate
@@ -1808,13 +1808,15 @@ where
18081808
}
18091809
}
18101810
}
1811+
18111812
Some((_, Token::LeftBrace, _)) => {
18121813
// Nested guard expression
18131814
self.advance();
1814-
let guard = self.parse_case_clause_guard(true);
1815+
let guard = self.parse_clause_guard_inner();
18151816
let _ = self.expect_one(&Token::RightBrace)?;
18161817
guard
18171818
}
1819+
18181820
t0 => {
18191821
self.tok0 = t0;
18201822
match self.parse_const_value()? {
@@ -3583,7 +3585,7 @@ where
35833585
// Parse Helpers
35843586
//
35853587

3586-
// Expect a particular token, advances the token stream
3588+
/// Expect a particular token, advances the token stream
35873589
fn expect_one(&mut self, wanted: &Token) -> Result<(u32, u32), ParseError> {
35883590
match self.maybe_one(wanted) {
35893591
Some((start, end)) => Ok((start, end)),

0 commit comments

Comments
 (0)