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,7 +1,7 @@
use std::sync::{Arc, Mutex};
use crate::{
data::{self, Data, MersType, Type},
data::{self, Data, Type},
program::run::{CheckInfo, Info},
};
@@ -18,7 +18,6 @@ impl Config {
info: Arc::new(Info::neverused()),
info_check: Arc::new(Mutex::new(CheckInfo::neverused())),
out: Arc::new(|a, i| {
dbg!(a);
let mut o = Type::empty();
for t in &a.types {
if let Some(t) = t.as_any().downcast_ref::<data::function::FunctionT>() {

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) {

View File

@@ -1,9 +1,13 @@
use crate::data::{self, Type};
use crate::{
data::{self, Type},
parsing::SourcePos,
};
use super::{CheckError, CheckInfo, MersStatement};
#[derive(Debug)]
pub struct AssignTo {
pub pos_in_src: SourcePos,
pub is_init: bool,
pub target: Box<dyn MersStatement>,
pub source: Box<dyn MersStatement>,
@@ -27,10 +31,13 @@ impl MersStatement for AssignTo {
fn run_custom(&self, info: &mut super::Info) -> crate::data::Data {
let source = self.source.run(info);
let target = self.target.run(info);
data::defs::assign(source, &target);
data::defs::assign(&source, &target);
target
}
fn has_scope(&self) -> bool {
false
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -1,9 +1,10 @@
use crate::data::Type;
use crate::{data::Type, parsing::SourcePos};
use super::{CheckError, MersStatement};
#[derive(Debug)]
pub struct Block {
pub pos_in_src: SourcePos,
pub statements: Vec<Box<dyn MersStatement>>,
}
impl MersStatement for Block {
@@ -31,4 +32,7 @@ impl MersStatement for Block {
fn has_scope(&self) -> bool {
true
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -1,11 +1,15 @@
use std::sync::Arc;
use crate::data::{Data, Type};
use crate::{
data::{Data, Type},
parsing::SourcePos,
};
use super::{CheckError, MersStatement};
#[derive(Debug)]
pub struct Chain {
pub pos_in_src: SourcePos,
pub first: Box<dyn MersStatement>,
pub chained: Box<dyn MersStatement>,
}
@@ -54,4 +58,7 @@ impl MersStatement for Chain {
fn has_scope(&self) -> bool {
false
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -1,11 +1,15 @@
use std::sync::Arc;
use crate::data::{self, Data, MersData, Type};
use crate::{
data::{self, Data, MersData, Type},
parsing::SourcePos,
};
use super::{CheckError, MersStatement};
#[derive(Debug)]
pub struct Function {
pub pos_in_src: SourcePos,
pub func_no_info: data::function::Function,
}
@@ -29,4 +33,7 @@ impl MersStatement for Function {
fn has_scope(&self) -> bool {
true
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -1,11 +1,15 @@
use std::sync::Arc;
use crate::data::{self, Data, MersType, Type};
use crate::{
data::{self, Data, MersType, Type},
parsing::SourcePos,
};
use super::{CheckError, 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>>,
@@ -55,4 +59,7 @@ impl MersStatement for If {
fn has_scope(&self) -> bool {
true
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -6,6 +6,7 @@ use std::{
use crate::{
data::{self, Data, Type},
info,
parsing::SourcePos,
};
#[cfg(feature = "run")]
@@ -34,6 +35,7 @@ pub trait MersStatement: Debug + Send + Sync {
fn run_custom(&self, info: &mut Info) -> Data;
/// if true, local variables etc. will be contained inside their own scope.
fn has_scope(&self) -> bool;
fn pos_in_src(&self) -> &SourcePos;
fn check(&self, info: &mut CheckInfo, assign: Option<&Type>) -> Result<Type, CheckError> {
if self.has_scope() {
info.create_scope();

View File

@@ -1,11 +1,15 @@
use std::sync::Arc;
use crate::data::{self, tuple::TupleT, Data, Type};
use crate::{
data::{self, tuple::TupleT, Data, Type},
parsing::SourcePos,
};
use super::{CheckError, MersStatement};
#[derive(Debug)]
pub struct Tuple {
pub pos_in_src: SourcePos,
pub elems: Vec<Box<dyn MersStatement>>,
}
impl MersStatement for Tuple {
@@ -31,7 +35,7 @@ impl MersStatement for Tuple {
}
} else {
return Err(CheckError(
"can't init to statement type Tuple with value type {t}, which is part of {init_to} - only tuples can be assigned to tuples".to_string(),
format!("can't init to statement type Tuple with value type {t}, which is part of {init_to} - only tuples can be assigned to tuples"),
));
}
}
@@ -64,4 +68,7 @@ impl MersStatement for Tuple {
fn has_scope(&self) -> bool {
false
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -1,9 +1,13 @@
use crate::data::{Data, Type};
use crate::{
data::{Data, Type},
parsing::SourcePos,
};
use super::{CheckError, MersStatement};
#[derive(Debug)]
pub struct Value {
pub pos_in_src: SourcePos,
pub val: Data,
}
@@ -24,4 +28,7 @@ impl MersStatement for Value {
fn run_custom(&self, _info: &mut super::Info) -> Data {
self.val.clone()
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}

View File

@@ -1,11 +1,15 @@
use std::sync::{Arc, Mutex};
use crate::data::{self, Data, Type};
use crate::{
data::{self, Data, Type},
parsing::SourcePos,
};
use super::MersStatement;
#[derive(Debug)]
pub struct Variable {
pub pos_in_src: SourcePos,
pub is_init: bool,
pub is_ref: bool,
pub var: (usize, usize),
@@ -55,4 +59,7 @@ impl MersStatement for Variable {
.clone()
}
}
fn pos_in_src(&self) -> &SourcePos {
&self.pos_in_src
}
}