mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-27 10:17:15 +00:00
Missing errors
This commit is contained in:
parent
1b52a6680f
commit
11717ca5d4
2 changed files with 26 additions and 11 deletions
|
|
@ -134,10 +134,12 @@ pub(super) fn let_stmt(p: &mut Parser<'_>, with_semi: Semicolon) {
|
|||
// test_err let_else_right_curly_brace
|
||||
// fn func() { let Some(_) = {Some(1)} else { panic!("h") };}
|
||||
if let Some(expr) = expr_after_eq {
|
||||
if BlockLike::is_blocklike(expr.kind()) {
|
||||
p.error(
|
||||
"right curly brace `}` before `else` in a `let...else` statement not allowed",
|
||||
)
|
||||
if let Some(token) = expr.last_token(p) {
|
||||
if token == T!['}'] {
|
||||
p.error(
|
||||
"right curly brace `}` before `else` in a `let...else` statement not allowed"
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -318,7 +318,8 @@ impl Marker {
|
|||
_ => unreachable!(),
|
||||
}
|
||||
p.push_event(Event::Finish);
|
||||
CompletedMarker::new(self.pos, kind)
|
||||
let end_pos = p.events.len() as u32;
|
||||
CompletedMarker::new(self.pos, end_pos, kind)
|
||||
}
|
||||
|
||||
/// Abandons the syntax tree node. All its children
|
||||
|
|
@ -336,13 +337,14 @@ impl Marker {
|
|||
}
|
||||
|
||||
pub(crate) struct CompletedMarker {
|
||||
pos: u32,
|
||||
start_pos: u32,
|
||||
end_pos: u32,
|
||||
kind: SyntaxKind,
|
||||
}
|
||||
|
||||
impl CompletedMarker {
|
||||
fn new(pos: u32, kind: SyntaxKind) -> Self {
|
||||
CompletedMarker { pos, kind }
|
||||
fn new(start_pos: u32, end_pos: u32, kind: SyntaxKind) -> Self {
|
||||
CompletedMarker { start_pos, end_pos, kind }
|
||||
}
|
||||
|
||||
/// This method allows to create a new node which starts
|
||||
|
|
@ -360,10 +362,10 @@ impl CompletedMarker {
|
|||
/// distance to `NEWSTART` into forward_parent(=2 in this case);
|
||||
pub(crate) fn precede(self, p: &mut Parser<'_>) -> Marker {
|
||||
let new_pos = p.start();
|
||||
let idx = self.pos as usize;
|
||||
let idx = self.start_pos as usize;
|
||||
match &mut p.events[idx] {
|
||||
Event::Start { forward_parent, .. } => {
|
||||
*forward_parent = Some(new_pos.pos - self.pos);
|
||||
*forward_parent = Some(new_pos.pos - self.start_pos);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
|
@ -376,7 +378,7 @@ impl CompletedMarker {
|
|||
let idx = m.pos as usize;
|
||||
match &mut p.events[idx] {
|
||||
Event::Start { forward_parent, .. } => {
|
||||
*forward_parent = Some(self.pos - m.pos);
|
||||
*forward_parent = Some(self.start_pos - m.pos);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
|
|
@ -386,4 +388,15 @@ impl CompletedMarker {
|
|||
pub(crate) fn kind(&self) -> SyntaxKind {
|
||||
self.kind
|
||||
}
|
||||
|
||||
pub(crate) fn last_token(&self, p: &Parser<'_>) -> Option<SyntaxKind> {
|
||||
let end_pos = self.end_pos as usize;
|
||||
if end_pos > p.events.len() {
|
||||
return None;
|
||||
}
|
||||
p.events[..end_pos].iter().rev().find_map(|event| match event {
|
||||
Event::Token { kind, .. } => Some(*kind),
|
||||
_ => None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue