mirror of
https://github.com/Dummi26/mers.git
synced 2025-12-13 19:06:16 +01:00
fix bug where error would reference wrong file
This commit is contained in:
@@ -23,7 +23,9 @@ impl Config {
|
||||
// TODO: Type with generics
|
||||
self.add_type("List".to_string(),
|
||||
Err(Arc::new(|s, i| {
|
||||
let t = crate::parsing::types::parse_type(&mut Source::new_from_string_raw(s.to_owned()))?;
|
||||
let mut src = Source::new_from_string_raw(s.to_owned());
|
||||
let srca = Arc::new(src.clone());
|
||||
let t = crate::parsing::types::parse_type(&mut src, &srca)?;
|
||||
Ok(Arc::new(ListT(crate::parsing::types::type_from_parsed(&t, i)?)))})))
|
||||
.add_var(
|
||||
"pop".to_string(),
|
||||
|
||||
@@ -21,7 +21,9 @@ impl Config {
|
||||
self.add_type(
|
||||
"Thread".to_string(),
|
||||
Err(Arc::new(|s, i| {
|
||||
let t = crate::parsing::types::parse_type(&mut Source::new_from_string_raw(s.to_owned()))?;
|
||||
let mut src = Source::new_from_string_raw(s.to_owned());
|
||||
let srca = Arc::new(src.clone());
|
||||
let t = crate::parsing::types::parse_type(&mut src, &srca)?;
|
||||
Ok(Arc::new(ThreadT(crate::parsing::types::type_from_parsed(&t, i)?)))
|
||||
})),
|
||||
)
|
||||
|
||||
@@ -25,14 +25,14 @@ impl MersStatement for AsType {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::as_type::AsType {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
statement: self.statement.compile(info, comp)?,
|
||||
as_type: self.as_type.clone(),
|
||||
type_pos_in_src: self.type_pos_in_src,
|
||||
type_pos_in_src: self.type_pos_in_src.clone(),
|
||||
expand_type: self.expand_type,
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,13 +22,13 @@ impl MersStatement for AssignTo {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::assign_to::AssignTo {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
is_init: false,
|
||||
source: self.source.compile(info, comp)?,
|
||||
target: self.target.compile(info, comp)?,
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ impl MersStatement for Block {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::block::Block {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
statements: self
|
||||
.statements
|
||||
.iter()
|
||||
@@ -30,6 +30,6 @@ impl MersStatement for Block {
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,13 +21,13 @@ impl MersStatement for Chain {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::chain::Chain {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
first: self.first.compile(info, comp)?,
|
||||
chained: self.chained.compile(info, comp)?,
|
||||
as_part_of_include: None,
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ impl MersStatement for CustomType {
|
||||
Err(s) => Err(s.compile(info, comp)?),
|
||||
};
|
||||
Ok(Box::new(crate::program::run::custom_type::CustomType {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
name: self.name.clone(),
|
||||
source: Box::new(move |ci| match &src {
|
||||
Ok(parsed) => Ok(Ok(Arc::new(type_from_parsed(parsed, ci)?))),
|
||||
@@ -35,7 +35,7 @@ impl MersStatement for CustomType {
|
||||
false
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ impl MersStatement for Function {
|
||||
let arg2: Arc<Box<dyn crate::program::run::MersStatement>> = Arc::clone(&arg_target);
|
||||
let run2: Arc<Box<dyn crate::program::run::MersStatement>> = Arc::clone(&run);
|
||||
Ok(Box::new(program::run::function::Function {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
func_no_info: data::function::Function {
|
||||
info: Arc::new(program::run::Info::neverused()),
|
||||
info_check: Arc::new(Mutex::new(CheckInfo::neverused())),
|
||||
@@ -48,6 +48,6 @@ impl MersStatement for Function {
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ impl MersStatement for If {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::r#if::If {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
condition: self.condition.compile(info, comp)?,
|
||||
on_true: self.on_true.compile(info, comp)?,
|
||||
on_false: if let Some(v) = &self.on_false {
|
||||
@@ -34,6 +34,6 @@ impl MersStatement for If {
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ impl MersStatement for IncludeMers {
|
||||
Err(e) => {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![(
|
||||
self.pos_in_src,
|
||||
self.pos_in_src.clone(),
|
||||
Some(error_colors::HashIncludeErrorInIncludedFile),
|
||||
)])
|
||||
.msg(
|
||||
@@ -41,18 +41,18 @@ impl MersStatement for IncludeMers {
|
||||
.color(error_colors::HashIncludeErrorInIncludedFile)
|
||||
.to_string(),
|
||||
)
|
||||
.err_with_src(e, self.inner_src.clone()))
|
||||
.err_with_diff_src(e))
|
||||
}
|
||||
};
|
||||
let compiled2 = Arc::clone(&compiled);
|
||||
Ok(Box::new(program::run::chain::Chain {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
first: Box::new(program::run::value::Value {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
val: Data::empty_tuple(),
|
||||
}),
|
||||
chained: Box::new(program::run::function::Function {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
func_no_info: data::function::Function {
|
||||
info: Arc::new(info::Info::neverused()),
|
||||
info_check: Arc::new(Mutex::new(info::Info::neverused())),
|
||||
@@ -64,6 +64,6 @@ impl MersStatement for IncludeMers {
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@ impl MersStatement for InitTo {
|
||||
let target = self.target.compile(info, comp)?;
|
||||
comp.is_init = false;
|
||||
Ok(Box::new(program::run::assign_to::AssignTo {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
is_init: true,
|
||||
source,
|
||||
target,
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ impl MersStatement for Tuple {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::tuple::Tuple {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
elems: self
|
||||
.elems
|
||||
.iter()
|
||||
@@ -30,6 +30,6 @@ impl MersStatement for Tuple {
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,11 +22,11 @@ impl MersStatement for Value {
|
||||
_comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, CheckError> {
|
||||
Ok(Box::new(program::run::value::Value {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
val: self.data.clone(),
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ impl MersStatement for Variable {
|
||||
}
|
||||
}
|
||||
Ok(Box::new(program::run::variable::Variable {
|
||||
pos_in_src: self.pos_in_src,
|
||||
pos_in_src: self.pos_in_src.clone(),
|
||||
is_init: comp.is_init,
|
||||
is_ref_not_ignore: if comp.is_init {
|
||||
!init_and_ignore
|
||||
@@ -48,12 +48,15 @@ impl MersStatement for Variable {
|
||||
*v
|
||||
} else {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![(self.pos_in_src, Some(error_colors::UnknownVariable))])
|
||||
.src(vec![(
|
||||
self.pos_in_src.clone(),
|
||||
Some(error_colors::UnknownVariable),
|
||||
)])
|
||||
.msg(format!("No variable named '{}' found!", self.var)));
|
||||
},
|
||||
}))
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ impl MersStatement for AsType {
|
||||
crate::parsing::types::type_from_parsed(&self.as_type, info).map_err(|e| {
|
||||
CheckError::new()
|
||||
.src(vec![(
|
||||
self.type_pos_in_src,
|
||||
self.type_pos_in_src.clone(),
|
||||
Some(error_colors::BadTypeFromParsed),
|
||||
)])
|
||||
.err(e)
|
||||
@@ -40,9 +40,9 @@ impl MersStatement for AsType {
|
||||
if !return_type.is_included_in(&as_type) {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(
|
||||
self.type_pos_in_src,
|
||||
self.type_pos_in_src.clone(),
|
||||
Some(error_colors::AsTypeTypeAnnotation),
|
||||
),
|
||||
(
|
||||
@@ -73,6 +73,6 @@ impl MersStatement for AsType {
|
||||
false
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ impl MersStatement for AssignTo {
|
||||
Err(e) => {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(self.target.source_range(), Some(error_colors::InitTo)),
|
||||
(self.source.source_range(), Some(error_colors::InitFrom)),
|
||||
])
|
||||
@@ -43,7 +43,7 @@ impl MersStatement for AssignTo {
|
||||
if !source.is_included_in(&t) {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(self.target.source_range(), Some(error_colors::AssignTo)),
|
||||
(self.source.source_range(), Some(error_colors::AssignFrom)),
|
||||
])
|
||||
@@ -57,7 +57,7 @@ impl MersStatement for AssignTo {
|
||||
} else {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(
|
||||
self.target.source_range(),
|
||||
Some(error_colors::AssignTargetNonReference),
|
||||
@@ -81,6 +81,6 @@ impl MersStatement for AssignTo {
|
||||
false
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,6 +36,6 @@ impl MersStatement for Block {
|
||||
true
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,10 +37,10 @@ impl MersStatement for Chain {
|
||||
match (func.0)(&arg) {
|
||||
Ok(t) => o.add(Arc::new(t)),
|
||||
Err(e) => {
|
||||
return Err(if let Some(inner_src) = &self.as_part_of_include {
|
||||
return Err(if let Some(_) = &self.as_part_of_include {
|
||||
CheckError::new()
|
||||
.src(vec![(
|
||||
self.pos_in_src,
|
||||
self.pos_in_src.clone(),
|
||||
Some(error_colors::HashIncludeErrorInIncludedFile),
|
||||
)])
|
||||
.msg(
|
||||
@@ -48,11 +48,11 @@ impl MersStatement for Chain {
|
||||
.color(error_colors::HashIncludeErrorInIncludedFile)
|
||||
.to_string(),
|
||||
)
|
||||
.err_with_src(e, inner_src.clone())
|
||||
.err_with_diff_src(e)
|
||||
} else {
|
||||
CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(
|
||||
self.first.source_range(),
|
||||
Some(error_colors::FunctionArgument),
|
||||
@@ -71,7 +71,7 @@ impl MersStatement for Chain {
|
||||
} else {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(
|
||||
self.chained.source_range(),
|
||||
Some(error_colors::ChainWithNonFunction),
|
||||
@@ -99,6 +99,6 @@ impl MersStatement for Chain {
|
||||
false
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ impl MersStatement for CustomType {
|
||||
false
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,6 @@ impl MersStatement for Function {
|
||||
true
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ impl MersStatement for If {
|
||||
if !cond_return_type.is_included_in(&data::bool::BoolT) {
|
||||
return Err(CheckError::new()
|
||||
.src(vec![
|
||||
(self.pos_in_src, None),
|
||||
(self.pos_in_src.clone(), None),
|
||||
(
|
||||
self.condition.source_range(),
|
||||
Some(error_colors::IfConditionNotBool),
|
||||
@@ -71,6 +71,6 @@ impl MersStatement for If {
|
||||
true
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,6 +91,6 @@ impl MersStatement for Tuple {
|
||||
false
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,6 @@ impl MersStatement for Value {
|
||||
self.val.clone()
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,6 @@ impl MersStatement for Variable {
|
||||
}
|
||||
}
|
||||
fn source_range(&self) -> SourceRange {
|
||||
self.pos_in_src
|
||||
self.pos_in_src.clone()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user