Implement SimpleExpr logic for configuration parsing
We can now use boolean, lists & all in configuration.
This commit is contained in:
parent
f674f9ee97
commit
f35afe8d65
|
@ -1259,6 +1259,19 @@ impl Annotation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn list(inner: Annotation, location: Span) -> Self {
|
||||||
|
Annotation::Constructor {
|
||||||
|
name: "List".to_string(),
|
||||||
|
module: None,
|
||||||
|
arguments: vec![inner],
|
||||||
|
location,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn tuple(elems: Vec<Annotation>, location: Span) -> Self {
|
||||||
|
Annotation::Tuple { elems, location }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn is_logically_equal(&self, other: &Annotation) -> bool {
|
pub fn is_logically_equal(&self, other: &Annotation) -> bool {
|
||||||
match self {
|
match self {
|
||||||
Annotation::Constructor {
|
Annotation::Constructor {
|
||||||
|
|
|
@ -45,7 +45,7 @@ pub enum SimpleExpr {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SimpleExpr {
|
impl SimpleExpr {
|
||||||
pub fn as_untyped_expr(&self) -> UntypedExpr {
|
pub fn as_untyped_expr(&self, annotation: &Annotation) -> UntypedExpr {
|
||||||
match self {
|
match self {
|
||||||
SimpleExpr::Bool(b) => UntypedExpr::Var {
|
SimpleExpr::Bool(b) => UntypedExpr::Var {
|
||||||
location: Span::empty(),
|
location: Span::empty(),
|
||||||
|
@ -63,38 +63,73 @@ impl SimpleExpr {
|
||||||
bytes: bs.to_vec(),
|
bytes: bs.to_vec(),
|
||||||
preferred_format: *preferred_format,
|
preferred_format: *preferred_format,
|
||||||
},
|
},
|
||||||
SimpleExpr::List(es) => UntypedExpr::List {
|
SimpleExpr::List(es) => match annotation {
|
||||||
|
Annotation::Tuple { elems, .. } => UntypedExpr::Tuple {
|
||||||
location: Span::empty(),
|
location: Span::empty(),
|
||||||
elements: es.iter().map(|e| e.as_untyped_expr()).collect(),
|
elems: es
|
||||||
|
.iter()
|
||||||
|
.zip(elems)
|
||||||
|
.map(|(e, ann)| e.as_untyped_expr(ann))
|
||||||
|
.collect(),
|
||||||
|
},
|
||||||
|
Annotation::Constructor {
|
||||||
|
module,
|
||||||
|
name,
|
||||||
|
arguments,
|
||||||
|
..
|
||||||
|
} if name == "List" && module.is_none() => UntypedExpr::List {
|
||||||
|
location: Span::empty(),
|
||||||
|
elements: es
|
||||||
|
.iter()
|
||||||
|
.map(|e| e.as_untyped_expr(arguments.first().unwrap()))
|
||||||
|
.collect(),
|
||||||
tail: None,
|
tail: None,
|
||||||
},
|
},
|
||||||
|
_ => unreachable!(
|
||||||
|
"unexpected annotation for simple list expression: {annotation:#?}"
|
||||||
|
),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn as_definition(&self, identifier: &str) -> UntypedDefinition {
|
pub fn as_annotation(&self) -> Annotation {
|
||||||
let location = Span::empty();
|
let location = Span::empty();
|
||||||
|
match self {
|
||||||
|
SimpleExpr::Bool(..) => Annotation::boolean(location),
|
||||||
|
SimpleExpr::Int(_) => Annotation::int(location),
|
||||||
|
SimpleExpr::ByteArray(_, _) => Annotation::bytearray(location),
|
||||||
|
SimpleExpr::List(elems) => {
|
||||||
|
let elems = elems.iter().map(|e| e.as_annotation()).collect::<Vec<_>>();
|
||||||
|
|
||||||
let (value, annotation) = match self {
|
let (is_uniform, inner) =
|
||||||
SimpleExpr::Bool(..) => todo!("requires https://github.com/aiken-lang/aiken/pull/992"),
|
elems
|
||||||
SimpleExpr::Int(_) => (
|
.iter()
|
||||||
// TODO: Replace with 'self.as_untyped_expr()' after https://github.com/aiken-lang/aiken/pull/992
|
.fold((true, None), |(matches, ann), a| match ann {
|
||||||
self.as_untyped_expr(),
|
None => (matches, Some(a)),
|
||||||
Some(Annotation::int(location)),
|
Some(b) => (matches && a == b, ann),
|
||||||
),
|
});
|
||||||
SimpleExpr::ByteArray(_, _) => (
|
|
||||||
// TODO: Replace with 'self.as_untyped_expr()' after https://github.com/aiken-lang/aiken/pull/992
|
|
||||||
self.as_untyped_expr(),
|
|
||||||
Some(Annotation::bytearray(location)),
|
|
||||||
),
|
|
||||||
SimpleExpr::List(..) => todo!("requires https://github.com/aiken-lang/aiken/pull/992"),
|
|
||||||
};
|
|
||||||
|
|
||||||
|
if is_uniform {
|
||||||
|
Annotation::list(
|
||||||
|
inner.cloned().unwrap_or_else(|| Annotation::data(location)),
|
||||||
|
location,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Annotation::tuple(elems, location)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_definition(&self, identifier: &str) -> UntypedDefinition {
|
||||||
|
let annotation = self.as_annotation();
|
||||||
|
let value = self.as_untyped_expr(&annotation);
|
||||||
UntypedDefinition::ModuleConstant(ModuleConstant {
|
UntypedDefinition::ModuleConstant(ModuleConstant {
|
||||||
location: Span::empty(),
|
location: Span::empty(),
|
||||||
doc: None,
|
doc: None,
|
||||||
public: true,
|
public: true,
|
||||||
name: identifier.to_string(),
|
name: identifier.to_string(),
|
||||||
annotation,
|
annotation: Some(annotation),
|
||||||
value,
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue