Add EvalAltResult::clear_position().

This commit is contained in:
Stephen Chung 2021-01-08 14:29:57 +08:00
parent ec18bd26a2
commit b96c832141
4 changed files with 13 additions and 9 deletions

View File

@ -16,6 +16,7 @@ Enhancements
* Source information is provided when there is an error within a call to a function defined in another module.
* Source information is provided to the `NativeCallContext` for native Rust functions.
* `EvalAltResult::clear_position` to clear the position information of an error - useful when only the message is needed and the position doesn't need to be printed out.
Version 0.19.9

View File

@ -11,9 +11,10 @@ use std::{
};
/// Pretty-print error.
fn print_error(input: &str, err: EvalAltResult) {
fn print_error(input: &str, mut err: EvalAltResult) {
let lines: Vec<_> = input.trim().split('\n').collect();
let pos = err.position();
err.clear_position();
let line_no = if lines.len() > 1 {
if pos.is_none() {
@ -26,8 +27,6 @@ fn print_error(input: &str, err: EvalAltResult) {
};
// Print error position
let pos_text = format!(" ({})", pos);
if pos.is_none() {
// No position
println!("{}", err);
@ -40,7 +39,7 @@ fn print_error(input: &str, err: EvalAltResult) {
"{0:>1$} {2}",
"^",
line_no.len() + pos.position().unwrap(),
err.to_string().replace(&pos_text, "")
err
);
}
}

View File

@ -5,19 +5,17 @@ use rhai::OptimizationLevel;
use std::{env, fs::File, io::Read, process::exit};
fn eprint_error(input: &str, err: EvalAltResult) {
fn eprint_line(lines: &[&str], pos: Position, err: &str) {
fn eprint_error(input: &str, mut err: EvalAltResult) {
fn eprint_line(lines: &[&str], pos: Position, err_msg: &str) {
let line = pos.line().unwrap();
let line_no = format!("{}: ", line);
let pos_text = format!(" ({})", pos);
eprintln!("{}{}", line_no, lines[line - 1]);
eprintln!(
"{:>1$} {2}",
"^",
line_no.len() + pos.position().unwrap(),
err.replace(&pos_text, "")
err_msg
);
eprintln!("");
}
@ -26,6 +24,7 @@ fn eprint_error(input: &str, err: EvalAltResult) {
// Print error
let pos = err.position();
err.clear_position();
if pos.is_none() {
// No position

View File

@ -366,6 +366,11 @@ impl EvalAltResult {
| Self::Return(_, pos) => *pos,
}
}
/// Clear the [position][Position] information of this error.
pub fn clear_position(&mut self) -> &mut Self {
self.set_position(Position::NONE);
self
}
/// Override the [position][Position] of this error.
pub fn set_position(&mut self, new_position: Position) {
match self {