checkpoint
This commit is contained in:
parent
57df303eae
commit
8d1e73bbea
|
@ -9,7 +9,7 @@ use uplc::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{BinOp, DataType, Function, Pattern, TypedArg, TypedPattern},
|
ast::{BinOp, DataType, Function, Pattern, Span, TypedArg, TypedPattern},
|
||||||
expr::TypedExpr,
|
expr::TypedExpr,
|
||||||
tipo::{self, ModuleValueConstructor, Type, ValueConstructorVariant},
|
tipo::{self, ModuleValueConstructor, Type, ValueConstructorVariant},
|
||||||
};
|
};
|
||||||
|
@ -120,6 +120,12 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pub fn generate(&mut self, body: TypedExpr, arguments: Vec<TypedArg>) -> Program<Name> {
|
pub fn generate(&mut self, body: TypedExpr, arguments: Vec<TypedArg>) -> Program<Name> {
|
||||||
self.recurse_scope_level(&body, ScopeLevels::new());
|
self.recurse_scope_level(&body, ScopeLevels::new());
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"DATA USAGE HOLDER IS {:#?}",
|
||||||
|
self.uplc_data_usage_holder_lookup
|
||||||
|
);
|
||||||
|
println!("DATA HOLDER IS {:#?}", self.uplc_data_holder_lookup);
|
||||||
|
|
||||||
self.uplc_function_holder_lookup
|
self.uplc_function_holder_lookup
|
||||||
.sort_by(|_key1, value1, _key2, value2| {
|
.sort_by(|_key1, value1, _key2, value2| {
|
||||||
if value1.is_less_than(value2, true) {
|
if value1.is_less_than(value2, true) {
|
||||||
|
@ -213,7 +219,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn recurse_scope_level(&mut self, body: &TypedExpr, scope_level: ScopeLevels) {
|
pub(crate) fn recurse_scope_level(&mut self, body: &TypedExpr, scope_level: ScopeLevels) {
|
||||||
match body {
|
match dbg!(body) {
|
||||||
TypedExpr::Int { .. } => {}
|
TypedExpr::Int { .. } => {}
|
||||||
TypedExpr::String { .. } => {}
|
TypedExpr::String { .. } => {}
|
||||||
TypedExpr::ByteArray { .. } => {}
|
TypedExpr::ByteArray { .. } => {}
|
||||||
|
@ -264,6 +270,10 @@ impl<'a> CodeGenerator<'a> {
|
||||||
.get(&(current_module.to_string(), name.clone()))
|
.get(&(current_module.to_string(), name.clone()))
|
||||||
{
|
{
|
||||||
if scope_level.is_less_than(val, false) {
|
if scope_level.is_less_than(val, false) {
|
||||||
|
println!(
|
||||||
|
"DATA USAGE HOLDER CHANGED 1 IS {:#?}",
|
||||||
|
self.uplc_data_usage_holder_lookup
|
||||||
|
);
|
||||||
self.uplc_data_usage_holder_lookup
|
self.uplc_data_usage_holder_lookup
|
||||||
.insert((current_module, name.clone()), scope_level);
|
.insert((current_module, name.clone()), scope_level);
|
||||||
}
|
}
|
||||||
|
@ -319,9 +329,12 @@ impl<'a> CodeGenerator<'a> {
|
||||||
self.recurse_scope_level(left, scope_level.clone());
|
self.recurse_scope_level(left, scope_level.clone());
|
||||||
self.recurse_scope_level(right, scope_level);
|
self.recurse_scope_level(right, scope_level);
|
||||||
}
|
}
|
||||||
TypedExpr::Assignment { value, pattern, .. } => {
|
TypedExpr::Assignment { value, pattern, .. } => self.recurse_scope_level_pattern(
|
||||||
self.recurse_scope_level_pattern(pattern, value, scope_level.scope_increment(1))
|
pattern,
|
||||||
}
|
value,
|
||||||
|
scope_level.scope_increment(1),
|
||||||
|
&vec![],
|
||||||
|
),
|
||||||
TypedExpr::Try { .. } => todo!(),
|
TypedExpr::Try { .. } => todo!(),
|
||||||
TypedExpr::When {
|
TypedExpr::When {
|
||||||
subjects, clauses, ..
|
subjects, clauses, ..
|
||||||
|
@ -332,6 +345,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pattern,
|
pattern,
|
||||||
&clause.then,
|
&clause.then,
|
||||||
scope_level.scope_increment_sequence(1),
|
scope_level.scope_increment_sequence(1),
|
||||||
|
subjects,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,6 +439,10 @@ impl<'a> CodeGenerator<'a> {
|
||||||
.get(&(module.to_string(), current_var_name.clone()))
|
.get(&(module.to_string(), current_var_name.clone()))
|
||||||
{
|
{
|
||||||
if current_scope.is_less_than(val, false) {
|
if current_scope.is_less_than(val, false) {
|
||||||
|
println!(
|
||||||
|
"DATA USAGE HOLDER CHANGED 2 IS {:#?}",
|
||||||
|
self.uplc_data_usage_holder_lookup
|
||||||
|
);
|
||||||
self.uplc_data_usage_holder_lookup
|
self.uplc_data_usage_holder_lookup
|
||||||
.insert((module, current_var_name), current_scope);
|
.insert((module, current_var_name), current_scope);
|
||||||
}
|
}
|
||||||
|
@ -485,8 +503,9 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pattern: &TypedPattern,
|
pattern: &TypedPattern,
|
||||||
value: &TypedExpr,
|
value: &TypedExpr,
|
||||||
scope_level: ScopeLevels,
|
scope_level: ScopeLevels,
|
||||||
|
vars: &Vec<TypedExpr>,
|
||||||
) {
|
) {
|
||||||
match pattern {
|
match dbg!(pattern) {
|
||||||
Pattern::Int { .. } | Pattern::String { .. } | Pattern::Var { .. } => {
|
Pattern::Int { .. } | Pattern::String { .. } | Pattern::Var { .. } => {
|
||||||
self.recurse_scope_level(value, scope_level);
|
self.recurse_scope_level(value, scope_level);
|
||||||
}
|
}
|
||||||
|
@ -496,11 +515,11 @@ impl<'a> CodeGenerator<'a> {
|
||||||
Pattern::Discard { .. } => todo!(),
|
Pattern::Discard { .. } => todo!(),
|
||||||
Pattern::List { .. } => todo!(),
|
Pattern::List { .. } => todo!(),
|
||||||
Pattern::Constructor {
|
Pattern::Constructor {
|
||||||
// name: constructor_name,
|
name: constructor_name,
|
||||||
tipo,
|
tipo,
|
||||||
// arguments,
|
arguments,
|
||||||
constructor: _constructor,
|
constructor,
|
||||||
// module,
|
module,
|
||||||
..
|
..
|
||||||
} => {
|
} => {
|
||||||
self.recurse_scope_level(value, scope_level.scope_increment_sequence(1));
|
self.recurse_scope_level(value, scope_level.scope_increment_sequence(1));
|
||||||
|
@ -521,50 +540,159 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Type::Fn { .. } => {
|
Type::Fn { .. } => {
|
||||||
// let mapping_index = match constructor {
|
let mut mapping_index: IndexMap<String, usize> = IndexMap::new();
|
||||||
// tipo::PatternConstructor::Record { name, field_map } => {
|
|
||||||
// if let Some(fields_mapping) = field_map {
|
match constructor {
|
||||||
// fields_mapping.fields.clone()
|
tipo::PatternConstructor::Record {
|
||||||
// } else {
|
name: _name,
|
||||||
// HashMap::new()
|
field_map,
|
||||||
// }
|
} => {
|
||||||
// }
|
if let Some(fields_mapping) = field_map {
|
||||||
// };
|
mapping_index.extend(fields_mapping.fields.clone());
|
||||||
// let mut args = arguments.clone();
|
mapping_index
|
||||||
// let local_var_name = "";
|
.sort_by(|_, value1, _, value2| value1.cmp(value2));
|
||||||
// arguments.iter().map(|x| {
|
mapping_index.reverse();
|
||||||
// let name = match &x.value {
|
}
|
||||||
// Pattern::Var { location, name } => {
|
}
|
||||||
// if let Some(val) = self.uplc_data_holder_lookup.get(&(
|
};
|
||||||
// module.to_string(),
|
|
||||||
// .clone(),
|
println!("MAPPING INDEX IS {mapping_index:?}");
|
||||||
// label.clone(),
|
|
||||||
// )) {
|
let module = module.clone().unwrap();
|
||||||
// if current_scope.is_less_than(&val.0, false) {
|
// TODO: support multiple subjects
|
||||||
// self.uplc_data_holder_lookup.insert(
|
let (var_name, tipo) = match &vars[0] {
|
||||||
// (
|
TypedExpr::Var {
|
||||||
// module.to_string(),
|
name, constructor, ..
|
||||||
// current_var_name.clone(),
|
} => (name, constructor.tipo.clone()),
|
||||||
// label.clone(),
|
_ => todo!(),
|
||||||
// ),
|
};
|
||||||
// (current_scope.clone(), a.clone()),
|
|
||||||
// );
|
let mut type_name = "".to_string();
|
||||||
// }
|
let mut is_app = false;
|
||||||
// } else {
|
let current_tipo = &*tipo;
|
||||||
// self.uplc_data_holder_lookup.insert(
|
while !is_app {
|
||||||
// (
|
match current_tipo {
|
||||||
// module.to_string(),
|
Type::App { name, .. } => {
|
||||||
// current_var_name.clone(),
|
type_name = name.to_string();
|
||||||
// label.clone(),
|
is_app = true;
|
||||||
// ),
|
}
|
||||||
// (current_scope.clone(), a.clone()),
|
_ => todo!(),
|
||||||
// );
|
};
|
||||||
// }
|
}
|
||||||
// }
|
|
||||||
// _ => todo!(),
|
for (ind, arg) in arguments.iter().rev().enumerate() {
|
||||||
// };
|
let (label, index) = if let Some(arg_label) = &arg.label {
|
||||||
// });
|
(
|
||||||
todo!()
|
arg_label.to_string(),
|
||||||
|
mapping_index.remove(arg_label).unwrap() as u64,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
let arg_field =
|
||||||
|
mapping_index.pop().unwrap_or((format!("{ind}"), ind));
|
||||||
|
(arg_field.0, arg_field.1 as u64)
|
||||||
|
};
|
||||||
|
|
||||||
|
match &arg.value {
|
||||||
|
Pattern::Var {
|
||||||
|
name: field_name, ..
|
||||||
|
} => {
|
||||||
|
let record_access = TypedExpr::RecordAccess {
|
||||||
|
location: Span::empty(),
|
||||||
|
tipo: Type::App {
|
||||||
|
public: true,
|
||||||
|
module: module.clone(),
|
||||||
|
name: constructor_name.to_string(),
|
||||||
|
args: vec![],
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
label: field_name.clone(),
|
||||||
|
index,
|
||||||
|
record: TypedExpr::Var {
|
||||||
|
location: Span::empty(),
|
||||||
|
constructor: tipo::ValueConstructor {
|
||||||
|
public: false,
|
||||||
|
variant: ValueConstructorVariant::LocalVariable {
|
||||||
|
location: Span::empty(),
|
||||||
|
},
|
||||||
|
tipo: Type::App {
|
||||||
|
public: true,
|
||||||
|
module: module.clone(),
|
||||||
|
name: type_name.clone(),
|
||||||
|
args: vec![],
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
},
|
||||||
|
name: var_name.clone(),
|
||||||
|
}
|
||||||
|
.into(),
|
||||||
|
};
|
||||||
|
|
||||||
|
if let Some(val) = self.uplc_data_holder_lookup.get(&(
|
||||||
|
module.to_string(),
|
||||||
|
var_name.clone(),
|
||||||
|
label.clone(),
|
||||||
|
)) {
|
||||||
|
if scope_level.is_less_than(&val.0, false) {
|
||||||
|
self.uplc_data_holder_lookup.insert(
|
||||||
|
(
|
||||||
|
module.to_string(),
|
||||||
|
var_name.clone(),
|
||||||
|
label.clone(),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
scope_level.scope_increment(1),
|
||||||
|
record_access.clone(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.uplc_data_holder_lookup.insert(
|
||||||
|
(module.to_string(), var_name.clone(), label.clone()),
|
||||||
|
(scope_level.scope_increment(1), record_access.clone()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(val) = self
|
||||||
|
.uplc_data_usage_holder_lookup
|
||||||
|
.get(&(module.to_string(), var_name.clone()))
|
||||||
|
{
|
||||||
|
if scope_level.is_less_than(val, false) {
|
||||||
|
println!(
|
||||||
|
"DATA USAGE HOLDER CHANGED 3 IS {:#?}",
|
||||||
|
self.uplc_data_usage_holder_lookup
|
||||||
|
);
|
||||||
|
self.uplc_data_usage_holder_lookup.insert(
|
||||||
|
(module.to_string(), var_name.clone()),
|
||||||
|
scope_level.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.uplc_data_usage_holder_lookup.insert(
|
||||||
|
(module.to_string(), var_name.clone()),
|
||||||
|
scope_level.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(val) = self
|
||||||
|
.uplc_data_constr_lookup
|
||||||
|
.get(&(module.to_string(), type_name.clone()))
|
||||||
|
{
|
||||||
|
if scope_level.is_less_than(val, false) {
|
||||||
|
self.uplc_data_constr_lookup.insert(
|
||||||
|
(module.to_string(), type_name.clone()),
|
||||||
|
scope_level.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.uplc_data_constr_lookup.insert(
|
||||||
|
(module.to_string(), type_name.clone()),
|
||||||
|
scope_level.clone(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => todo!(),
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
};
|
};
|
||||||
|
@ -1006,13 +1134,21 @@ impl<'a> CodeGenerator<'a> {
|
||||||
Pattern::Constructor {
|
Pattern::Constructor {
|
||||||
name, tipo, module, ..
|
name, tipo, module, ..
|
||||||
} => {
|
} => {
|
||||||
let key = match &**tipo {
|
let mut is_app = false;
|
||||||
|
let mut tipo = &**tipo;
|
||||||
|
let mut key: (String, String) = ("".to_string(), "".to_string());
|
||||||
|
while !is_app {
|
||||||
|
match tipo {
|
||||||
Type::App { module, name, .. } => {
|
Type::App { module, name, .. } => {
|
||||||
(module.clone(), name.clone())
|
is_app = true;
|
||||||
|
key = (module.clone(), name.clone());
|
||||||
}
|
}
|
||||||
Type::Fn { .. } => todo!(),
|
Type::Fn { ret, .. } => {
|
||||||
Type::Var { .. } => todo!(),
|
tipo = ret;
|
||||||
|
}
|
||||||
|
_ => todo!(),
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
let dt = self.data_types.get(&key).unwrap();
|
let dt = self.data_types.get(&key).unwrap();
|
||||||
|
|
||||||
|
@ -1032,6 +1168,8 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
new_current_clauses.sort_by(|a, b| a.0.cmp(&b.0));
|
new_current_clauses.sort_by(|a, b| a.0.cmp(&b.0));
|
||||||
|
|
||||||
|
println!("NEW CURRENT CLAUSES {new_current_clauses:?}");
|
||||||
|
|
||||||
let subject = &subjects[0];
|
let subject = &subjects[0];
|
||||||
|
|
||||||
let mut is_var = false;
|
let mut is_var = false;
|
||||||
|
@ -1085,15 +1223,20 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let need_lam = total_constr_length - new_current_clauses.len() > 0;
|
let need_lam = total_constr_length - new_current_clauses.len() > 0;
|
||||||
|
|
||||||
let (last, new_current_clauses) = new_current_clauses.split_last().unwrap();
|
let (last, new_current_clauses) = new_current_clauses.split_last().unwrap();
|
||||||
|
|
||||||
let mut new_current_clauses = new_current_clauses.to_vec();
|
let mut new_current_clauses = new_current_clauses.to_vec();
|
||||||
|
new_current_clauses.reverse();
|
||||||
let last_term =
|
let last_term =
|
||||||
self.recurse_code_gen(&last.1, scope_level.scope_increment_sequence(1));
|
self.recurse_code_gen(&last.1, scope_level.scope_increment_sequence(1));
|
||||||
|
|
||||||
|
println!("NEW CURRENT CLAUSES AFTER SPLIT {new_current_clauses:?}");
|
||||||
|
|
||||||
let mut current: Option<(usize, TypedExpr)> = None;
|
let mut current: Option<(usize, TypedExpr)> = None;
|
||||||
for index in 0..total_constr_length - 1 {
|
for index in 0..total_constr_length - 1 {
|
||||||
if current.is_none() {
|
if current.is_none() {
|
||||||
current = new_current_clauses.pop();
|
current = new_current_clauses.pop();
|
||||||
}
|
}
|
||||||
|
println!("CURRENT IS {current:?}");
|
||||||
if let Some(val) = current.clone() {
|
if let Some(val) = current.clone() {
|
||||||
if val.0 == index {
|
if val.0 == index {
|
||||||
let branch_term = self
|
let branch_term = self
|
||||||
|
@ -1103,6 +1246,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
function: term.into(),
|
function: term.into(),
|
||||||
argument: Term::Delay(branch_term.into()).into(),
|
argument: Term::Delay(branch_term.into()).into(),
|
||||||
};
|
};
|
||||||
|
current = None;
|
||||||
} else {
|
} else {
|
||||||
term = Term::Apply {
|
term = Term::Apply {
|
||||||
function: term.into(),
|
function: term.into(),
|
||||||
|
@ -1398,7 +1542,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
body: Term::Force(constr_term.into()).into(),
|
body: Term::Force(constr_term.into()).into(),
|
||||||
};
|
};
|
||||||
|
|
||||||
for index in 0..length - 1 {
|
for index in (0..length - 1).rev() {
|
||||||
constr_term = Term::Lambda {
|
constr_term = Term::Lambda {
|
||||||
parameter_name: Name {
|
parameter_name: Name {
|
||||||
text: format!("constr_{index}_result"),
|
text: format!("constr_{index}_result"),
|
||||||
|
|
Loading…
Reference in New Issue