Skip to content

Commit 8ab604c

Browse files
committed
Improve position of syntax error of trailing token
1 parent 0283f1a commit 8ab604c

File tree

7 files changed

+96
-41
lines changed

7 files changed

+96
-41
lines changed

vhdl_lang/src/data/source.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ impl Range {
244244
pub struct SrcPos {
245245
/// The referenced source file.
246246
pub source: Source,
247-
range: Range,
247+
pub range: Range,
248248
}
249249

250250
impl Ord for SrcPos {

vhdl_lang/src/syntax/concurrent_statement.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,11 +265,10 @@ fn parse_assignment_known_target(
265265

266266
fn parse_assignment_or_procedure_call(
267267
stream: &mut TokenStream,
268-
token: &Token,
269268
target: WithPos<Target>,
270269
) -> ParseResult<ConcurrentStatement> {
271270
match_token_kind!(
272-
token,
271+
stream.expect()?,
273272
LTE => {
274273
parse_assignment_known_target(stream, target)
275274
},
@@ -613,8 +612,7 @@ pub fn parse_concurrent_statement(
613612
ConcurrentStatement::Instance(parse_instantiation_statement(stream, unit)?)
614613
}
615614
_ => {
616-
stream.move_after(&token);
617-
parse_assignment_or_procedure_call(stream, &token, name.map_into(Target::Name))?
615+
parse_assignment_or_procedure_call(stream, name.map_into(Target::Name))?
618616
}
619617
}
620618
},
@@ -625,8 +623,7 @@ pub fn parse_concurrent_statement(
625623
},
626624
LeftPar => {
627625
let target = parse_aggregate_leftpar_known(stream)?.map_into(Target::Aggregate);
628-
let token = stream.expect()?;
629-
parse_assignment_or_procedure_call(stream, &token, target)?
626+
parse_assignment_or_procedure_call(stream, target)?
630627
}
631628
)
632629
};
@@ -670,15 +667,16 @@ pub fn parse_labeled_concurrent_statement_initial_token(
670667
) -> ParseResult<LabeledConcurrentStatement> {
671668
if token.kind == Identifier {
672669
let name = parse_name_initial_token(stream, token)?;
673-
let token = stream.expect()?;
670+
let token = stream.peek_expect()?;
674671
if token.kind == Colon {
675672
let label = Some(WithDecl::new(to_simple_name(name)?));
673+
stream.move_after(&token);
676674
let token = stream.expect()?;
677675
let statement = parse_concurrent_statement(stream, token, diagnostics)?;
678676
Ok(LabeledConcurrentStatement { label, statement })
679677
} else {
680678
let target = name.map_into(Target::Name);
681-
let statement = parse_assignment_or_procedure_call(stream, &token, target)?;
679+
let statement = parse_assignment_or_procedure_call(stream, target)?;
682680
Ok(LabeledConcurrentStatement {
683681
label: None,
684682
statement,

vhdl_lang/src/syntax/expression.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,14 @@ pub fn parse_aggregate_initial_choices(
156156
result.push(ElementAssociation::Positional(choice.clone()));
157157
return Ok(WithPos::from(result, token))
158158
} else {
159-
return Err(Diagnostic::error(&token, "Expected => after others"));
159+
return Err(Diagnostic::error(&token.pos_before(), "Expected => after others"));
160160
}
161161
},
162162
Comma => {
163163
if let [Choice::Expression(ref choice)] = *choices.as_slice() {
164164
result.push(ElementAssociation::Positional(choice.clone()));
165165
} else {
166-
return Err(Diagnostic::error(&token, "Expected => after others"));
166+
return Err(Diagnostic::error(&token.pos_before(), "Expected => after others"));
167167
}
168168
choices = parse_choices(stream)?;
169169
},
@@ -443,7 +443,10 @@ fn parse_primary_initial_token(
443443
pos,
444444
})
445445
} else {
446-
Err(Diagnostic::error(&token, "Expected {expression}"))
446+
Err(Diagnostic::error(
447+
&token.pos_before(),
448+
"Expected {expression}",
449+
))
447450
}
448451
}
449452
}

vhdl_lang/src/syntax/interface_declaration.rs

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -245,16 +245,17 @@ fn parse_interface_declaration(
245245
/// Expect ; for all but the last item
246246
fn parse_semicolon_separator(stream: &mut TokenStream) -> ParseResult<()> {
247247
let token = stream.peek_expect()?;
248-
try_token_kind!(token,
249-
SemiColon => {
250-
stream.move_after(&token);
251-
if stream.peek_expect()?.kind == RightPar {
252-
return Err(Diagnostic::error(&token,
253-
format!("Last interface element may not end with {}",
254-
kinds_str(&[SemiColon]))));
255-
}
256-
},
257-
RightPar => {}
248+
try_token_kind!(
249+
token,
250+
SemiColon => {
251+
stream.move_after(&token);
252+
if stream.peek_expect()?.kind == RightPar {
253+
return Err(Diagnostic::error(&token.pos_before(),
254+
format!("Last interface element may not end with {}",
255+
kinds_str(&[SemiColon]))));
256+
}
257+
},
258+
RightPar => {}
258259
);
259260
Ok(())
260261
}

vhdl_lang/src/syntax/subprogram.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use super::declarative_part::parse_declarative_part;
99
use super::interface_declaration::parse_parameter_interface_list;
1010
use super::names::parse_type_mark;
1111
use super::sequential_statement::parse_labeled_sequential_statements;
12-
use super::tokens::{kinds_error, Kind::*, TokenStream};
12+
use super::tokens::{Kind::*, TokenStream};
1313
use crate::ast::*;
1414
use crate::data::*;
1515

@@ -54,7 +54,7 @@ pub fn parse_signature(stream: &mut TokenStream) -> ParseResult<WithPos<Signatur
5454
}
5555
_ => {
5656
stream.move_after(&token);
57-
return Err(kinds_error(token.pos, &[Identifier]))
57+
return Err(token.kinds_error_before(&[Identifier]))
5858
}
5959
};
6060
}

vhdl_lang/src/syntax/subtype_indication.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ fn parse_composite_constraint(stream: &mut TokenStream) -> ParseResult<WithPos<S
7373
RightPar | Comma => {}
7474
_ => {
7575
initial = Err(token
76-
.kinds_error(&[RightPar, Comma])
76+
.kinds_error_before(&[RightPar, Comma])
7777
.when("parsing index constraint"));
7878
}
7979
}

0 commit comments

Comments
 (0)