better errors, colors, and fix bug where x := x would panic

This commit is contained in:
Mark
2023-11-16 13:09:17 +01:00
parent 39951a59e9
commit c39e784939
11 changed files with 159 additions and 68 deletions

View File

@@ -8,8 +8,8 @@ use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct AssignTo {
pub pos_in_src: SourceRange,
pub target: Box<dyn MersStatement>,
pub source: Box<dyn MersStatement>,
pub target: Box<dyn MersStatement>,
}
impl MersStatement for AssignTo {
@@ -24,8 +24,8 @@ impl MersStatement for AssignTo {
Ok(Box::new(program::run::assign_to::AssignTo {
pos_in_src: self.pos_in_src,
is_init: false,
target: self.target.compile(info, comp)?,
source: self.source.compile(info, comp)?,
target: self.target.compile(info, comp)?,
}))
}
fn source_range(&self) -> SourceRange {

View File

@@ -7,7 +7,7 @@ use crate::{
info::{self, Local},
program::{
self,
run::{CheckError, SourceRange},
run::{error_colors, CheckError, SourceRange},
},
};
@@ -31,8 +31,8 @@ impl MersStatement for IncludeMers {
Ok(v) => Arc::new(v),
Err(e) => {
return Err(CheckError::new()
.src(vec![(self.pos_in_src, Some(colored::Color::Red))])
.msg("Error in inner mers statement! (note: inner errors may refer to a different file)".red().to_string())
.src(vec![(self.pos_in_src, Some(error_colors::HashIncludeErrorInIncludedFile))])
.msg("Error in inner mers statement! (note: inner errors may refer to a different file)".color(error_colors::HashIncludeErrorInIncludedFile).to_string())
.err(e))
}
};

View File

@@ -6,8 +6,8 @@ use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct InitTo {
pub pos_in_src: SourceRange,
pub target: Box<dyn MersStatement>,
pub source: Box<dyn MersStatement>,
pub target: Box<dyn MersStatement>,
}
impl MersStatement for InitTo {
@@ -19,15 +19,17 @@ impl MersStatement for InitTo {
info: &mut crate::info::Info<super::Local>,
mut comp: CompInfo,
) -> Result<Box<dyn crate::program::run::MersStatement>, CheckError> {
// source must be compiled BEFORE target!
comp.is_init = false;
let source = self.source.compile(info, comp)?;
comp.is_init = true;
let target = self.target.compile(info, comp)?;
comp.is_init = false;
let source = self.source.compile(info, comp)?;
Ok(Box::new(program::run::assign_to::AssignTo {
pos_in_src: self.pos_in_src,
is_init: true,
target,
source,
target,
}))
}
fn source_range(&self) -> SourceRange {

View File

@@ -2,7 +2,7 @@ use crate::{
info::Local,
program::{
self,
run::{CheckError, SourceRange},
run::{error_colors, CheckError, SourceRange},
},
};
@@ -41,7 +41,7 @@ impl MersStatement for Variable {
*v
} else {
return Err(CheckError::new()
.src(vec![(self.pos_in_src, Some(colored::Color::Red))])
.src(vec![(self.pos_in_src, Some(error_colors::UnknownVariable))])
.msg(format!("No variable named '{}' found!", self.var)));
},
}))