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 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. * 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 Version 0.19.9

View File

@ -11,9 +11,10 @@ use std::{
}; };
/// Pretty-print error. /// 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 lines: Vec<_> = input.trim().split('\n').collect();
let pos = err.position(); let pos = err.position();
err.clear_position();
let line_no = if lines.len() > 1 { let line_no = if lines.len() > 1 {
if pos.is_none() { if pos.is_none() {
@ -26,8 +27,6 @@ fn print_error(input: &str, err: EvalAltResult) {
}; };
// Print error position // Print error position
let pos_text = format!(" ({})", pos);
if pos.is_none() { if pos.is_none() {
// No position // No position
println!("{}", err); println!("{}", err);
@ -40,7 +39,7 @@ fn print_error(input: &str, err: EvalAltResult) {
"{0:>1$} {2}", "{0:>1$} {2}",
"^", "^",
line_no.len() + pos.position().unwrap(), 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}; use std::{env, fs::File, io::Read, process::exit};
fn eprint_error(input: &str, err: EvalAltResult) { fn eprint_error(input: &str, mut err: EvalAltResult) {
fn eprint_line(lines: &[&str], pos: Position, err: &str) { fn eprint_line(lines: &[&str], pos: Position, err_msg: &str) {
let line = pos.line().unwrap(); let line = pos.line().unwrap();
let line_no = format!("{}: ", line); let line_no = format!("{}: ", line);
let pos_text = format!(" ({})", pos);
eprintln!("{}{}", line_no, lines[line - 1]); eprintln!("{}{}", line_no, lines[line - 1]);
eprintln!( eprintln!(
"{:>1$} {2}", "{:>1$} {2}",
"^", "^",
line_no.len() + pos.position().unwrap(), line_no.len() + pos.position().unwrap(),
err.replace(&pos_text, "") err_msg
); );
eprintln!(""); eprintln!("");
} }
@ -26,6 +24,7 @@ fn eprint_error(input: &str, err: EvalAltResult) {
// Print error // Print error
let pos = err.position(); let pos = err.position();
err.clear_position();
if pos.is_none() { if pos.is_none() {
// No position // No position

View File

@ -366,6 +366,11 @@ impl EvalAltResult {
| Self::Return(_, pos) => *pos, | 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. /// Override the [position][Position] of this error.
pub fn set_position(&mut self, new_position: Position) { pub fn set_position(&mut self, new_position: Position) {
match self { match self {