remove some warnings and start on when
This commit is contained in:
parent
805bf19081
commit
28697586f2
|
@ -9,7 +9,9 @@ use uplc::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{DataType, Function, ModuleConstant, Pattern, TypeAlias, TypedArg, Use},
|
ast::{
|
||||||
|
BinOp, DataType, Function, ModuleConstant, Pattern, TypeAlias, TypedArg, TypedPattern, Use,
|
||||||
|
},
|
||||||
expr::TypedExpr,
|
expr::TypedExpr,
|
||||||
tipo::{self, ModuleValueConstructor, Type, ValueConstructorVariant},
|
tipo::{self, ModuleValueConstructor, Type, ValueConstructorVariant},
|
||||||
};
|
};
|
||||||
|
@ -86,6 +88,7 @@ pub struct CodeGenerator<'a> {
|
||||||
uplc_function_holder: Vec<(String, Term<Name>)>,
|
uplc_function_holder: Vec<(String, Term<Name>)>,
|
||||||
uplc_function_holder_lookup: IndexMap<(String, String), (ScopeLevels, TypedExpr)>,
|
uplc_function_holder_lookup: IndexMap<(String, String), (ScopeLevels, TypedExpr)>,
|
||||||
uplc_data_holder_lookup: IndexMap<(String, String, String), (ScopeLevels, TypedExpr)>,
|
uplc_data_holder_lookup: IndexMap<(String, String, String), (ScopeLevels, TypedExpr)>,
|
||||||
|
uplc_when_lookup: IndexMap<(String, String, String), (ScopeLevels, TypedExpr)>,
|
||||||
uplc_data_usage_holder_lookup: IndexMap<(String, String), ScopeLevels>,
|
uplc_data_usage_holder_lookup: IndexMap<(String, String), ScopeLevels>,
|
||||||
functions: &'a HashMap<(String, String), &'a Function<Arc<tipo::Type>, TypedExpr>>,
|
functions: &'a HashMap<(String, String), &'a Function<Arc<tipo::Type>, TypedExpr>>,
|
||||||
type_aliases: &'a HashMap<(String, String), &'a TypeAlias<Arc<tipo::Type>>>,
|
type_aliases: &'a HashMap<(String, String), &'a TypeAlias<Arc<tipo::Type>>>,
|
||||||
|
@ -106,6 +109,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
uplc_function_holder: Vec::new(),
|
uplc_function_holder: Vec::new(),
|
||||||
uplc_function_holder_lookup: IndexMap::new(),
|
uplc_function_holder_lookup: IndexMap::new(),
|
||||||
uplc_data_holder_lookup: IndexMap::new(),
|
uplc_data_holder_lookup: IndexMap::new(),
|
||||||
|
uplc_when_lookup: IndexMap::new(),
|
||||||
uplc_data_usage_holder_lookup: IndexMap::new(),
|
uplc_data_usage_holder_lookup: IndexMap::new(),
|
||||||
functions,
|
functions,
|
||||||
type_aliases,
|
type_aliases,
|
||||||
|
@ -447,10 +451,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pattern,
|
pattern,
|
||||||
} => todo!(),
|
} => todo!(),
|
||||||
TypedExpr::When {
|
TypedExpr::When {
|
||||||
location,
|
subjects, clauses, ..
|
||||||
tipo,
|
|
||||||
subjects,
|
|
||||||
clauses,
|
|
||||||
} => {
|
} => {
|
||||||
for clause in clauses {
|
for clause in clauses {
|
||||||
for pattern in clause.pattern.iter() {
|
for pattern in clause.pattern.iter() {
|
||||||
|
@ -458,9 +459,12 @@ impl<'a> CodeGenerator<'a> {
|
||||||
pattern,
|
pattern,
|
||||||
&clause.then,
|
&clause.then,
|
||||||
scope_level.scope_increment_sequence(1),
|
scope_level.scope_increment_sequence(1),
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for subject in subjects {
|
||||||
|
self.recurse_scope_level(subject, scope_level.clone());
|
||||||
|
}
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
//if statements increase scope due to branching.
|
//if statements increase scope due to branching.
|
||||||
|
@ -488,7 +492,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
let mut current_var_name = "".to_string();
|
let mut current_var_name = "".to_string();
|
||||||
let mut module = "".to_string();
|
let mut module = "".to_string();
|
||||||
let mut current_record = *record.clone();
|
let mut current_record = *record.clone();
|
||||||
let mut current_scope = scope_level.clone();
|
let mut current_scope = scope_level;
|
||||||
while !is_var {
|
while !is_var {
|
||||||
match current_record.clone() {
|
match current_record.clone() {
|
||||||
TypedExpr::Var {
|
TypedExpr::Var {
|
||||||
|
@ -599,7 +603,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ModuleValueConstructor::Constant { literal, location } => todo!(),
|
ModuleValueConstructor::Constant { .. } => todo!(),
|
||||||
},
|
},
|
||||||
TypedExpr::Todo {
|
TypedExpr::Todo {
|
||||||
location,
|
location,
|
||||||
|
@ -616,9 +620,9 @@ impl<'a> CodeGenerator<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recurse_scope_level_pattern<Constructor, Type>(
|
fn recurse_scope_level_pattern(
|
||||||
&mut self,
|
&mut self,
|
||||||
pattern: &Pattern<Constructor, Type>,
|
pattern: &TypedPattern,
|
||||||
value: &TypedExpr,
|
value: &TypedExpr,
|
||||||
scope_level: ScopeLevels,
|
scope_level: ScopeLevels,
|
||||||
) {
|
) {
|
||||||
|
@ -653,6 +657,18 @@ impl<'a> CodeGenerator<'a> {
|
||||||
tipo,
|
tipo,
|
||||||
} => {
|
} => {
|
||||||
self.recurse_scope_level(value, scope_level);
|
self.recurse_scope_level(value, scope_level);
|
||||||
|
|
||||||
|
match &**tipo {
|
||||||
|
Type::App {
|
||||||
|
public,
|
||||||
|
module,
|
||||||
|
name,
|
||||||
|
args,
|
||||||
|
} => todo!(),
|
||||||
|
_ => todo!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
// self.data_types.get();
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -667,10 +683,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
TypedExpr::ByteArray { bytes, .. } => {
|
TypedExpr::ByteArray { bytes, .. } => {
|
||||||
Term::Constant(Constant::ByteString(bytes.clone()))
|
Term::Constant(Constant::ByteString(bytes.clone()))
|
||||||
}
|
}
|
||||||
TypedExpr::Sequence {
|
TypedExpr::Sequence { expressions, .. } => {
|
||||||
location,
|
|
||||||
expressions,
|
|
||||||
} => {
|
|
||||||
for (i, exp) in expressions.iter().enumerate().rev() {
|
for (i, exp) in expressions.iter().enumerate().rev() {
|
||||||
let mut term = self
|
let mut term = self
|
||||||
.recurse_code_gen(exp, scope_level.scope_increment_sequence(i as i32 + 1));
|
.recurse_code_gen(exp, scope_level.scope_increment_sequence(i as i32 + 1));
|
||||||
|
@ -685,19 +698,17 @@ impl<'a> CodeGenerator<'a> {
|
||||||
self.uplc_function_holder.pop().unwrap().1
|
self.uplc_function_holder.pop().unwrap().1
|
||||||
}
|
}
|
||||||
TypedExpr::Pipeline {
|
TypedExpr::Pipeline {
|
||||||
location,
|
expressions: _expressions,
|
||||||
expressions,
|
..
|
||||||
} => todo!(),
|
} => todo!(),
|
||||||
TypedExpr::Var {
|
TypedExpr::Var {
|
||||||
location,
|
constructor, name, ..
|
||||||
constructor,
|
|
||||||
name,
|
|
||||||
} => {
|
} => {
|
||||||
if name == "True" || name == "False" {
|
if name == "True" || name == "False" {
|
||||||
Term::Constant(Constant::Bool(name == "True"))
|
Term::Constant(Constant::Bool(name == "True"))
|
||||||
} else {
|
} else {
|
||||||
match constructor.variant.clone() {
|
match constructor.variant.clone() {
|
||||||
ValueConstructorVariant::LocalVariable { location } => Term::Var(Name {
|
ValueConstructorVariant::LocalVariable { .. } => Term::Var(Name {
|
||||||
text: name.to_string(),
|
text: name.to_string(),
|
||||||
unique: 0.into(),
|
unique: 0.into(),
|
||||||
}),
|
}),
|
||||||
|
@ -739,12 +750,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
elements,
|
elements,
|
||||||
tail,
|
tail,
|
||||||
} => todo!(),
|
} => todo!(),
|
||||||
TypedExpr::Call {
|
TypedExpr::Call { fun, args, .. } => {
|
||||||
location,
|
|
||||||
tipo,
|
|
||||||
fun,
|
|
||||||
args,
|
|
||||||
} => {
|
|
||||||
let mut term =
|
let mut term =
|
||||||
self.recurse_code_gen(fun, scope_level.scope_increment(args.len() as i32 + 1));
|
self.recurse_code_gen(fun, scope_level.scope_increment(args.len() as i32 + 1));
|
||||||
|
|
||||||
|
@ -760,24 +766,15 @@ impl<'a> CodeGenerator<'a> {
|
||||||
term
|
term
|
||||||
}
|
}
|
||||||
TypedExpr::BinOp {
|
TypedExpr::BinOp {
|
||||||
location,
|
name, left, right, ..
|
||||||
tipo,
|
|
||||||
name,
|
|
||||||
left,
|
|
||||||
right,
|
|
||||||
} => {
|
} => {
|
||||||
let left_term = self.recurse_code_gen(left, scope_level.clone());
|
let left_term = self.recurse_code_gen(left, scope_level.clone());
|
||||||
|
|
||||||
let right_term = self.recurse_code_gen(right, scope_level);
|
let right_term = self.recurse_code_gen(right, scope_level);
|
||||||
println!("NAME IS {name:#?}");
|
println!("NAME IS {name:#?}");
|
||||||
match name {
|
match name {
|
||||||
Eq => match &*left.tipo() {
|
BinOp::Eq => match &*left.tipo() {
|
||||||
Type::App {
|
Type::App { name, .. } => match name.as_str() {
|
||||||
public,
|
|
||||||
module,
|
|
||||||
name,
|
|
||||||
args,
|
|
||||||
} => match name.as_str() {
|
|
||||||
"Int" => Term::Apply {
|
"Int" => Term::Apply {
|
||||||
function: Term::Apply {
|
function: Term::Apply {
|
||||||
function: Term::Builtin(DefaultFunction::EqualsInteger).into(),
|
function: Term::Builtin(DefaultFunction::EqualsInteger).into(),
|
||||||
|
@ -801,30 +798,24 @@ impl<'a> CodeGenerator<'a> {
|
||||||
Type::Fn { args, ret } => todo!(),
|
Type::Fn { args, ret } => todo!(),
|
||||||
Type::Var { tipo } => todo!(),
|
Type::Var { tipo } => todo!(),
|
||||||
},
|
},
|
||||||
And => todo!(),
|
BinOp::And => todo!(),
|
||||||
Or => todo!(),
|
BinOp::Or => todo!(),
|
||||||
NotEq => todo!(),
|
BinOp::NotEq => todo!(),
|
||||||
LtInt => todo!(),
|
BinOp::LtInt => todo!(),
|
||||||
LtEqInt => todo!(),
|
BinOp::LtEqInt => todo!(),
|
||||||
GtEqInt => todo!(),
|
BinOp::GtEqInt => todo!(),
|
||||||
GtInt => todo!(),
|
BinOp::GtInt => todo!(),
|
||||||
AddInt => todo!(),
|
BinOp::AddInt => todo!(),
|
||||||
SubInt => todo!(),
|
BinOp::SubInt => todo!(),
|
||||||
MultInt => todo!(),
|
BinOp::MultInt => todo!(),
|
||||||
DivInt => todo!(),
|
BinOp::DivInt => todo!(),
|
||||||
ModInt => todo!(),
|
BinOp::ModInt => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TypedExpr::Assignment {
|
TypedExpr::Assignment { value, pattern, .. } => match pattern {
|
||||||
location,
|
Pattern::Int { .. } => todo!(),
|
||||||
tipo,
|
Pattern::String { .. } => todo!(),
|
||||||
value,
|
Pattern::Var { name, .. } => Term::Apply {
|
||||||
pattern,
|
|
||||||
kind,
|
|
||||||
} => match pattern {
|
|
||||||
Pattern::Int { location, value } => todo!(),
|
|
||||||
Pattern::String { location, value } => todo!(),
|
|
||||||
Pattern::Var { location, name } => Term::Apply {
|
|
||||||
function: Term::Lambda {
|
function: Term::Lambda {
|
||||||
parameter_name: Name {
|
parameter_name: Name {
|
||||||
text: name.to_string(),
|
text: name.to_string(),
|
||||||
|
@ -848,7 +839,7 @@ impl<'a> CodeGenerator<'a> {
|
||||||
location,
|
location,
|
||||||
pattern,
|
pattern,
|
||||||
} => todo!(),
|
} => todo!(),
|
||||||
Pattern::Discard { name, location } => todo!(),
|
Pattern::Discard { .. } => todo!(),
|
||||||
Pattern::List {
|
Pattern::List {
|
||||||
location,
|
location,
|
||||||
elements,
|
elements,
|
||||||
|
|
|
@ -14,6 +14,10 @@ pub fn spend(datum: sample.Datum, rdmr: Redeemer, ctx: spend.ScriptContext) -> B
|
||||||
let x = datum.sc.signer
|
let x = datum.sc.signer
|
||||||
let a = datum.sc.signer.hash
|
let a = datum.sc.signer.hash
|
||||||
let b = datum.rdmr
|
let b = datum.rdmr
|
||||||
let c = 1
|
|
||||||
c == 1
|
when b is {
|
||||||
|
sample.Buy -> True
|
||||||
|
sample.Sell -> False
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue