assigning to tuples should work properly now

This commit is contained in:
Mark
2023-08-15 19:18:52 +02:00
parent 0119211d92
commit ae0e163595
23 changed files with 265 additions and 75 deletions

View File

@@ -1,9 +1,10 @@
use crate::program;
use crate::{parsing::SourcePos, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct AssignTo {
pub pos_in_src: SourcePos,
pub target: Box<dyn MersStatement>,
pub source: Box<dyn MersStatement>,
}
@@ -18,6 +19,7 @@ impl MersStatement for AssignTo {
comp: CompInfo,
) -> Result<Box<dyn program::run::MersStatement>, String> {
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)?,

View File

@@ -1,9 +1,10 @@
use crate::{info, program};
use crate::{info, parsing::SourcePos, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct Block {
pub pos_in_src: SourcePos,
pub statements: Vec<Box<dyn MersStatement>>,
}
impl MersStatement for Block {
@@ -16,6 +17,7 @@ impl MersStatement for Block {
comp: CompInfo,
) -> Result<Box<dyn program::run::MersStatement>, String> {
Ok(Box::new(program::run::block::Block {
pos_in_src: self.pos_in_src,
statements: self
.statements
.iter()

View File

@@ -1,9 +1,11 @@
use crate::parsing::SourcePos;
use crate::{info, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct Chain {
pub pos_in_src: SourcePos,
pub first: Box<dyn MersStatement>,
pub chained: Box<dyn MersStatement>,
}
@@ -17,6 +19,7 @@ impl MersStatement for Chain {
comp: CompInfo,
) -> Result<Box<dyn program::run::MersStatement>, String> {
Ok(Box::new(program::run::chain::Chain {
pos_in_src: self.pos_in_src,
first: self.first.compile(info, comp)?,
chained: self.chained.compile(info, comp)?,
}))

View File

@@ -1,3 +1,4 @@
use crate::parsing::SourcePos;
use std::sync::{Arc, Mutex};
use crate::{
@@ -9,6 +10,7 @@ use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct Function {
pub pos_in_src: SourcePos,
pub arg: Box<dyn MersStatement>,
pub run: Box<dyn MersStatement>,
}
@@ -30,6 +32,7 @@ impl MersStatement for Function {
let arg2 = Arc::clone(&arg_target);
let run2 = Arc::clone(&run);
Ok(Box::new(program::run::function::Function {
pos_in_src: self.pos_in_src,
func_no_info: data::function::Function {
info: Arc::new(program::run::Info::neverused()),
info_check: Arc::new(Mutex::new(CheckInfo::neverused())),
@@ -38,7 +41,7 @@ impl MersStatement for Function {
Ok(run2.check(i, None)?)
}),
run: Arc::new(move |arg, info| {
data::defs::assign(arg, &arg_target.run(info));
data::defs::assign(&arg, &arg_target.run(info));
run.run(info)
}),
},

View File

@@ -1,9 +1,10 @@
use crate::program;
use crate::{parsing::SourcePos, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct If {
pub pos_in_src: SourcePos,
pub condition: Box<dyn MersStatement>,
pub on_true: Box<dyn MersStatement>,
pub on_false: Option<Box<dyn MersStatement>>,
@@ -19,6 +20,7 @@ impl MersStatement for If {
comp: CompInfo,
) -> Result<Box<dyn program::run::MersStatement>, String> {
Ok(Box::new(program::run::r#if::If {
pos_in_src: self.pos_in_src,
condition: self.condition.compile(info, comp)?,
on_true: self.on_true.compile(info, comp)?,
on_false: if let Some(v) = &self.on_false {

View File

@@ -1,9 +1,11 @@
use crate::parsing::SourcePos;
use crate::program;
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct InitTo {
pub pos_in_src: SourcePos,
pub target: Box<dyn MersStatement>,
pub source: Box<dyn MersStatement>,
}
@@ -22,6 +24,7 @@ impl MersStatement for InitTo {
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,

View File

@@ -1,9 +1,10 @@
use crate::{info, program};
use crate::{info, parsing::SourcePos, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct Tuple {
pub pos_in_src: SourcePos,
pub elems: Vec<Box<dyn MersStatement>>,
}
impl MersStatement for Tuple {
@@ -16,6 +17,7 @@ impl MersStatement for Tuple {
comp: CompInfo,
) -> Result<Box<dyn program::run::MersStatement>, String> {
Ok(Box::new(program::run::tuple::Tuple {
pos_in_src: self.pos_in_src,
elems: self
.elems
.iter()

View File

@@ -1,9 +1,13 @@
use crate::parsing::SourcePos;
use crate::{data::Data, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct Value(pub Data);
pub struct Value {
pub pos_in_src: SourcePos,
pub data: Data,
}
impl MersStatement for Value {
fn has_scope(&self) -> bool {
@@ -15,7 +19,8 @@ impl MersStatement for Value {
_comp: CompInfo,
) -> Result<Box<dyn program::run::MersStatement>, String> {
Ok(Box::new(program::run::value::Value {
val: self.0.clone(),
pos_in_src: self.pos_in_src,
val: self.data.clone(),
}))
}
}

View File

@@ -1,9 +1,10 @@
use crate::{info::Local, program};
use crate::{info::Local, parsing::SourcePos, program};
use super::{CompInfo, MersStatement};
#[derive(Debug)]
pub struct Variable {
pub pos_in_src: SourcePos,
pub is_ref: bool,
pub var: String,
}
@@ -27,6 +28,7 @@ impl MersStatement for Variable {
)
}
Ok(Box::new(program::run::variable::Variable {
pos_in_src: self.pos_in_src,
is_init: comp.is_init,
is_ref: comp.is_init || self.is_ref,
var: if let Some(v) = info.get_var(&self.var) {