Fix parse positions.
This commit is contained in:
parent
e4cca7620f
commit
d92613eaf6
@ -16,7 +16,7 @@ use crate::stdlib::{
|
|||||||
char,
|
char,
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
format,
|
format,
|
||||||
iter::{empty, Peekable},
|
iter::empty,
|
||||||
mem,
|
mem,
|
||||||
num::NonZeroUsize,
|
num::NonZeroUsize,
|
||||||
ops::{Add, Deref, DerefMut},
|
ops::{Add, Deref, DerefMut},
|
||||||
@ -751,15 +751,13 @@ fn parse_paren_expr(
|
|||||||
// ( xxx )
|
// ( xxx )
|
||||||
(Token::RightParen, _) => Ok(expr),
|
(Token::RightParen, _) => Ok(expr),
|
||||||
// ( <error>
|
// ( <error>
|
||||||
(Token::LexError(err), pos) => {
|
(Token::LexError(err), pos) => return Err(PERR::BadInput(err.to_string()).into_err(pos)),
|
||||||
return Err(PERR::BadInput(err.to_string()).into_err(settings.pos))
|
|
||||||
}
|
|
||||||
// ( xxx ???
|
// ( xxx ???
|
||||||
(_, pos) => Err(PERR::MissingToken(
|
(_, pos) => Err(PERR::MissingToken(
|
||||||
Token::RightParen.into(),
|
Token::RightParen.into(),
|
||||||
"for a matching ( in this expression".into(),
|
"for a matching ( in this expression".into(),
|
||||||
)
|
)
|
||||||
.into_err(settings.pos)),
|
.into_err(pos)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -769,10 +767,9 @@ fn parse_call_expr(
|
|||||||
state: &mut ParseState,
|
state: &mut ParseState,
|
||||||
id: String,
|
id: String,
|
||||||
mut modules: Option<Box<ModuleRef>>,
|
mut modules: Option<Box<ModuleRef>>,
|
||||||
mut settings: ParseSettings,
|
settings: ParseSettings,
|
||||||
) -> Result<Expr, ParseError> {
|
) -> Result<Expr, ParseError> {
|
||||||
let (token, token_pos) = input.peek().unwrap();
|
let (token, _) = input.peek().unwrap();
|
||||||
settings.pos = *token_pos;
|
|
||||||
settings.ensure_level_within_max_limit(state.max_expr_depth)?;
|
settings.ensure_level_within_max_limit(state.max_expr_depth)?;
|
||||||
|
|
||||||
let mut args = StaticVec::new();
|
let mut args = StaticVec::new();
|
||||||
@ -888,7 +885,7 @@ fn parse_index_chain(
|
|||||||
input: &mut TokenStream,
|
input: &mut TokenStream,
|
||||||
state: &mut ParseState,
|
state: &mut ParseState,
|
||||||
lhs: Expr,
|
lhs: Expr,
|
||||||
settings: ParseSettings,
|
mut settings: ParseSettings,
|
||||||
) -> Result<Expr, ParseError> {
|
) -> Result<Expr, ParseError> {
|
||||||
settings.ensure_level_within_max_limit(state.max_expr_depth)?;
|
settings.ensure_level_within_max_limit(state.max_expr_depth)?;
|
||||||
|
|
||||||
@ -1031,11 +1028,12 @@ fn parse_index_chain(
|
|||||||
match input.peek().unwrap() {
|
match input.peek().unwrap() {
|
||||||
// If another indexing level, right-bind it
|
// If another indexing level, right-bind it
|
||||||
(Token::LeftBracket, _) => {
|
(Token::LeftBracket, _) => {
|
||||||
let idx_pos = eat_token(input, Token::LeftBracket);
|
let prev_pos = settings.pos;
|
||||||
|
settings.pos = eat_token(input, Token::LeftBracket);
|
||||||
// Recursively parse the indexing chain, right-binding each
|
// Recursively parse the indexing chain, right-binding each
|
||||||
let idx_expr = parse_index_chain(input, state, idx_expr, settings.level_up())?;
|
let idx_expr = parse_index_chain(input, state, idx_expr, settings.level_up())?;
|
||||||
// Indexing binds to right
|
// Indexing binds to right
|
||||||
Ok(Expr::Index(Box::new((lhs, idx_expr, settings.pos))))
|
Ok(Expr::Index(Box::new((lhs, idx_expr, prev_pos))))
|
||||||
}
|
}
|
||||||
// Otherwise terminate the indexing chain
|
// Otherwise terminate the indexing chain
|
||||||
_ => {
|
_ => {
|
||||||
@ -1257,11 +1255,13 @@ fn parse_primary(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (token, token_pos) = input.next().unwrap();
|
let (token, token_pos) = input.next().unwrap();
|
||||||
|
settings.pos = token_pos;
|
||||||
|
|
||||||
root_expr = match (root_expr, token) {
|
root_expr = match (root_expr, token) {
|
||||||
// Function call
|
// Function call
|
||||||
(Expr::Variable(x), Token::LeftParen) => {
|
(Expr::Variable(x), Token::LeftParen) => {
|
||||||
let ((name, pos), modules, _, _) = *x;
|
let ((name, pos), modules, _, _) = *x;
|
||||||
|
settings.pos = pos;
|
||||||
parse_call_expr(input, state, name, modules, settings.level_up())?
|
parse_call_expr(input, state, name, modules, settings.level_up())?
|
||||||
}
|
}
|
||||||
(Expr::Property(_), _) => unreachable!(),
|
(Expr::Property(_), _) => unreachable!(),
|
||||||
@ -1269,6 +1269,7 @@ fn parse_primary(
|
|||||||
(Expr::Variable(x), Token::DoubleColon) => match input.next().unwrap() {
|
(Expr::Variable(x), Token::DoubleColon) => match input.next().unwrap() {
|
||||||
(Token::Identifier(id2), pos2) => {
|
(Token::Identifier(id2), pos2) => {
|
||||||
let ((name, pos), mut modules, _, index) = *x;
|
let ((name, pos), mut modules, _, index) = *x;
|
||||||
|
|
||||||
if let Some(ref mut modules) = modules {
|
if let Some(ref mut modules) = modules {
|
||||||
modules.push((name, pos));
|
modules.push((name, pos));
|
||||||
} else {
|
} else {
|
||||||
@ -1284,7 +1285,6 @@ fn parse_primary(
|
|||||||
// Indexing
|
// Indexing
|
||||||
#[cfg(not(feature = "no_index"))]
|
#[cfg(not(feature = "no_index"))]
|
||||||
(expr, Token::LeftBracket) => {
|
(expr, Token::LeftBracket) => {
|
||||||
settings.pos = token_pos;
|
|
||||||
parse_index_chain(input, state, expr, settings.level_up())?
|
parse_index_chain(input, state, expr, settings.level_up())?
|
||||||
}
|
}
|
||||||
// Unknown postfix operator
|
// Unknown postfix operator
|
||||||
|
Loading…
x
Reference in New Issue
Block a user