Skip to content

Commit 337f2c9

Browse files
committed
Missing errors
1 parent 65a97e6 commit 337f2c9

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

src/tools/rust-analyzer/crates/parser/src/grammar/expressions.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,10 +134,12 @@ pub(super) fn let_stmt(p: &mut Parser<'_>, with_semi: Semicolon) {
134134
// test_err let_else_right_curly_brace
135135
// fn func() { let Some(_) = {Some(1)} else { panic!("h") };}
136136
if let Some(expr) = expr_after_eq {
137-
if BlockLike::is_blocklike(expr.kind()) {
138-
p.error(
139-
"right curly brace `}` before `else` in a `let...else` statement not allowed",
140-
)
137+
if let Some(token) = expr.last_token(p) {
138+
if token == T!['}'] {
139+
p.error(
140+
"right curly brace `}` before `else` in a `let...else` statement not allowed"
141+
)
142+
}
141143
}
142144
}
143145

src/tools/rust-analyzer/crates/parser/src/parser.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,8 @@ impl Marker {
318318
_ => unreachable!(),
319319
}
320320
p.push_event(Event::Finish);
321-
CompletedMarker::new(self.pos, kind)
321+
let end_pos = p.events.len() as u32;
322+
CompletedMarker::new(self.pos, end_pos, kind)
322323
}
323324

324325
/// Abandons the syntax tree node. All its children
@@ -336,13 +337,14 @@ impl Marker {
336337
}
337338

338339
pub(crate) struct CompletedMarker {
339-
pos: u32,
340+
start_pos: u32,
341+
end_pos: u32,
340342
kind: SyntaxKind,
341343
}
342344

343345
impl CompletedMarker {
344-
fn new(pos: u32, kind: SyntaxKind) -> Self {
345-
CompletedMarker { pos, kind }
346+
fn new(start_pos: u32, end_pos: u32, kind: SyntaxKind) -> Self {
347+
CompletedMarker { start_pos, end_pos, kind }
346348
}
347349

348350
/// This method allows to create a new node which starts
@@ -360,10 +362,10 @@ impl CompletedMarker {
360362
/// distance to `NEWSTART` into forward_parent(=2 in this case);
361363
pub(crate) fn precede(self, p: &mut Parser<'_>) -> Marker {
362364
let new_pos = p.start();
363-
let idx = self.pos as usize;
365+
let idx = self.start_pos as usize;
364366
match &mut p.events[idx] {
365367
Event::Start { forward_parent, .. } => {
366-
*forward_parent = Some(new_pos.pos - self.pos);
368+
*forward_parent = Some(new_pos.pos - self.start_pos);
367369
}
368370
_ => unreachable!(),
369371
}
@@ -376,7 +378,7 @@ impl CompletedMarker {
376378
let idx = m.pos as usize;
377379
match &mut p.events[idx] {
378380
Event::Start { forward_parent, .. } => {
379-
*forward_parent = Some(self.pos - m.pos);
381+
*forward_parent = Some(self.start_pos - m.pos);
380382
}
381383
_ => unreachable!(),
382384
}
@@ -386,4 +388,15 @@ impl CompletedMarker {
386388
pub(crate) fn kind(&self) -> SyntaxKind {
387389
self.kind
388390
}
391+
392+
pub(crate) fn last_token(&self, p: &Parser<'_>) -> Option<SyntaxKind> {
393+
let end_pos = self.end_pos as usize;
394+
if end_pos > p.events.len() {
395+
return None;
396+
}
397+
p.events[..end_pos].iter().rev().find_map(|event| match event {
398+
Event::Token { kind, .. } => Some(*kind),
399+
_ => None,
400+
})
401+
}
389402
}

0 commit comments

Comments
 (0)