diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index 0d5ea2a2..58541f64 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -694,14 +694,6 @@ pub enum Pattern { name: String, }, - /// A reference to a variable in a bit string. This is always a variable - /// being used rather than a new variable being assigned. - VarUsage { - location: Span, - name: String, - tipo: Type, - }, - /// A name given to a sub-pattern using the `as` keyword. /// e.g. `assert (1, [_, _] as the_list) = x` Assign { @@ -747,7 +739,6 @@ impl Pattern { Pattern::Assign { pattern, .. } => pattern.location(), Pattern::Int { location, .. } | Pattern::Var { location, .. } - | Pattern::VarUsage { location, .. } | Pattern::List { location, .. } | Pattern::Discard { location, .. } | Pattern::String { location, .. } @@ -763,6 +754,13 @@ impl Pattern { pub fn is_discard(&self) -> bool { matches!(self, Self::Discard { .. }) } + + /// Returns `true` if the pattern is [`Var`]. + /// + /// [`Var`]: Pattern::Discard + pub fn is_var(&self) -> bool { + matches!(self, Self::Var { .. }) + } } #[derive(Debug, Clone, PartialEq, Eq, Copy)] diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index 8b559603..6bb0a76c 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -1458,8 +1458,6 @@ impl<'comments> Formatter<'comments> { Pattern::Var { name, .. } => name.to_doc(), - Pattern::VarUsage { name, .. } => name.to_doc(), - Pattern::Assign { name, pattern, .. } => { self.pattern(pattern).append(" as ").append(name.as_str()) } diff --git a/crates/aiken-lang/src/tipo/expr.rs b/crates/aiken-lang/src/tipo/expr.rs index 851a80c3..262766f8 100644 --- a/crates/aiken-lang/src/tipo/expr.rs +++ b/crates/aiken-lang/src/tipo/expr.rs @@ -831,7 +831,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> { Some(ann_typ), )? } else { - if value_typ.is_data() { + if value_typ.is_data() && !pattern.is_var() && !pattern.is_discard() { return Err(Error::CastDataNoAnn { location, value: UntypedExpr::Assignment { diff --git a/crates/aiken-lang/src/tipo/pattern.rs b/crates/aiken-lang/src/tipo/pattern.rs index 3269e28f..e7e83dd0 100644 --- a/crates/aiken-lang/src/tipo/pattern.rs +++ b/crates/aiken-lang/src/tipo/pattern.rs @@ -12,7 +12,7 @@ use super::{ environment::{assert_no_labeled_arguments, collapse_links, EntityKind, Environment}, error::Error, hydrator::Hydrator, - PatternConstructor, Type, ValueConstructor, ValueConstructorVariant, + PatternConstructor, Type, ValueConstructorVariant, }; use crate::{ ast::{CallArg, Pattern, Span, TypedPattern, UntypedMultiPattern, UntypedPattern}, @@ -235,32 +235,6 @@ impl<'a, 'b> PatternTyper<'a, 'b> { Ok(Pattern::Var { name, location }) } - Pattern::VarUsage { name, location, .. } => { - let ValueConstructor { tipo, .. } = self - .environment - .get_variable(&name) - .cloned() - .ok_or_else(|| Error::UnknownVariable { - location, - name: name.to_string(), - variables: self.environment.local_value_names(), - })?; - - self.environment.increment_usage(&name); - - let tipo = self - .environment - .instantiate(tipo, &mut HashMap::new(), self.hydrator); - - self.environment.unify(int(), tipo.clone(), location)?; - - Ok(Pattern::VarUsage { - name, - location, - tipo, - }) - } - // Pattern::Concatenate { // location, // left_location, diff --git a/crates/aiken-lang/src/uplc.rs b/crates/aiken-lang/src/uplc.rs index 667abe6e..cdec3f90 100644 --- a/crates/aiken-lang/src/uplc.rs +++ b/crates/aiken-lang/src/uplc.rs @@ -864,7 +864,6 @@ impl<'a> CodeGenerator<'a> { }); pattern_vec.append(values); } - Pattern::VarUsage { .. } => unreachable!(), Pattern::Assign { name, pattern, .. } => { let mut new_vec = vec![]; new_vec.push(Air::Let { @@ -1034,7 +1033,6 @@ impl<'a> CodeGenerator<'a> { Pattern::Int { .. } => unreachable!(), Pattern::String { .. } => unreachable!(), Pattern::Var { .. } => unreachable!(), - Pattern::VarUsage { .. } => unreachable!(), Pattern::Assign { .. } => todo!("Nested assign not yet implemented"), Pattern::Discard { .. } => { pattern_vec.push(Air::Void { scope }); @@ -1504,7 +1502,6 @@ impl<'a> CodeGenerator<'a> { Pattern::Assign { .. } => todo!("Nested assign is not yet done"), Pattern::Int { .. } => unimplemented!(), Pattern::String { .. } => unimplemented!(), - Pattern::VarUsage { .. } => unreachable!(), } } @@ -1552,7 +1549,6 @@ impl<'a> CodeGenerator<'a> { pattern_vec.append(&mut assert_vec); } } - Pattern::VarUsage { .. } => unreachable!(), Pattern::Assign { .. } => todo!("Assign not yet implemented yet"), Pattern::Discard { .. } => { pattern_vec.push(Air::Let { @@ -1651,7 +1647,6 @@ impl<'a> CodeGenerator<'a> { Pattern::Int { .. } => todo!(), Pattern::String { .. } => todo!(), Pattern::Var { .. } => todo!(), - Pattern::VarUsage { .. } => todo!(), Pattern::Assign { .. } => todo!(), Pattern::Discard { .. } => todo!(), Pattern::List { elements, tail, .. } => { @@ -1697,7 +1692,6 @@ impl<'a> CodeGenerator<'a> { } Pattern::Int { .. } => todo!(), Pattern::String { .. } => todo!(), - Pattern::VarUsage { .. } => todo!(), Pattern::Assign { .. } => todo!(), Pattern::Discard { .. } => { names.push("_".to_string()); @@ -1846,7 +1840,6 @@ impl<'a> CodeGenerator<'a> { self.recursive_assert_tipo(tipo, pattern_vec, name, scope); } - Pattern::VarUsage { .. } => todo!(), Pattern::Assign { .. } => todo!(), Pattern::Discard { .. } => unreachable!(), Pattern::List { elements, tail, .. } => { @@ -1858,7 +1851,6 @@ impl<'a> CodeGenerator<'a> { Pattern::Var { name, .. } => { names.push(name.clone()); } - Pattern::VarUsage { .. } => todo!(), Pattern::Assign { .. } => todo!(), l @ (Pattern::List { .. } | Pattern::Constructor { .. } @@ -2582,7 +2574,6 @@ impl<'a> CodeGenerator<'a> { } Pattern::Int { .. } => todo!(), Pattern::String { .. } => todo!(), - Pattern::VarUsage { .. } => todo!(), Pattern::Assign { .. } => todo!(), };