From 97247ce949175614b435bc9097fc53da4593e4d8 Mon Sep 17 00:00:00 2001 From: rvcas Date: Mon, 11 Mar 2024 18:53:29 -0400 Subject: [PATCH] chore: assignment patterns refactor tuple into struct --- crates/aiken-lang/src/ast.rs | 21 ++++++++ crates/aiken-lang/src/expr.rs | 12 ++--- crates/aiken-lang/src/format.rs | 48 +++++++++++-------- .../definition/snapshots/def_test_fail.snap | 8 ++-- .../snapshots/function_assignment_only.snap | 8 ++-- .../aiken-lang/src/parser/expr/assignment.rs | 16 +++++-- .../src/parser/expr/snapshots/block_let.snap | 16 +++---- .../src/parser/expr/snapshots/expect.snap | 8 ++-- .../expr/snapshots/expect_bool_sugar.snap | 8 ++-- .../expr/snapshots/expect_expect_let.snap | 16 +++---- .../expr/snapshots/expect_let_in_let.snap | 16 +++---- .../snapshots/expect_let_in_let_parens.snap | 16 +++---- .../snapshots/expect_let_in_let_return.snap | 16 +++---- .../expr/snapshots/expect_trace_if_false.snap | 8 ++-- .../expr/snapshots/function_invoke.snap | 16 +++---- .../snapshots/int_numeric_underscore.snap | 24 +++++----- .../parser/expr/snapshots/let_bindings.snap | 8 ++-- .../parser/expr/snapshots/parse_tuple.snap | 8 ++-- .../parser/expr/snapshots/parse_tuple2.snap | 8 ++-- .../expr/when/snapshots/when_basic.snap | 8 ++-- .../function_ambiguous_sequence.snap | 32 ++++++------- .../src/snapshots/parse_unicode_offset_1.snap | 8 ++-- .../src/snapshots/parse_unicode_offset_2.snap | 8 ++-- crates/aiken-lang/src/tipo/expr.rs | 29 +++++++---- 24 files changed, 205 insertions(+), 161 deletions(-) diff --git a/crates/aiken-lang/src/ast.rs b/crates/aiken-lang/src/ast.rs index d8902507..750d7cc4 100644 --- a/crates/aiken-lang/src/ast.rs +++ b/crates/aiken-lang/src/ast.rs @@ -1436,6 +1436,27 @@ impl Default for Bls12_381Point { } } +#[derive(Debug, Clone, PartialEq)] +pub struct AssignmentPattern { + pub pattern: UntypedPattern, + pub annotation: Option, +} + +impl AssignmentPattern { + pub fn new(pattern: UntypedPattern, annotation: Option) -> AssignmentPattern { + Self { + pattern, + annotation, + } + } +} + +impl From for Vec1 { + fn from(value: AssignmentPattern) -> Self { + Vec1::new(value) + } +} + pub type UntypedAssignmentKind = AssignmentKind; pub type TypedAssignmentKind = AssignmentKind<()>; diff --git a/crates/aiken-lang/src/expr.rs b/crates/aiken-lang/src/expr.rs index 7dbf771c..d159dc23 100644 --- a/crates/aiken-lang/src/expr.rs +++ b/crates/aiken-lang/src/expr.rs @@ -1,10 +1,10 @@ use crate::{ ast::{ - self, Annotation, Arg, ArgName, BinOp, Bls12_381Point, ByteArrayFormatPreference, CallArg, - Curve, DataType, DataTypeKey, DefinitionLocation, IfBranch, Located, LogicalOpChainKind, - ParsedCallArg, Pattern, RecordConstructorArg, RecordUpdateSpread, Span, TraceKind, - TypedAssignmentKind, TypedClause, TypedDataType, TypedRecordUpdateArg, UnOp, - UntypedAssignmentKind, UntypedClause, UntypedPattern, UntypedRecordUpdateArg, + self, Annotation, Arg, ArgName, AssignmentPattern, BinOp, Bls12_381Point, + ByteArrayFormatPreference, CallArg, Curve, DataType, DataTypeKey, DefinitionLocation, + IfBranch, Located, LogicalOpChainKind, ParsedCallArg, Pattern, RecordConstructorArg, + RecordUpdateSpread, Span, TraceKind, TypedAssignmentKind, TypedClause, TypedDataType, + TypedRecordUpdateArg, UnOp, UntypedAssignmentKind, UntypedClause, UntypedRecordUpdateArg, }, builtins::void, parser::token::Base, @@ -518,7 +518,7 @@ pub enum UntypedExpr { Assignment { location: Span, value: Box, - patterns: Vec1<(UntypedPattern, Option)>, + patterns: Vec1, kind: UntypedAssignmentKind, }, diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index 8ca3e68b..43a35930 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -1,12 +1,12 @@ use crate::{ ast::{ - Annotation, Arg, ArgName, ArgVia, AssignmentKind, BinOp, ByteArrayFormatPreference, - CallArg, ClauseGuard, Constant, CurveType, DataType, Definition, Function, IfBranch, - LogicalOpChainKind, ModuleConstant, Pattern, RecordConstructor, RecordConstructorArg, - RecordUpdateSpread, Span, TraceKind, TypeAlias, TypedArg, UnOp, UnqualifiedImport, - UntypedArg, UntypedArgVia, UntypedAssignmentKind, UntypedClause, UntypedClauseGuard, - UntypedDefinition, UntypedFunction, UntypedModule, UntypedPattern, UntypedRecordUpdateArg, - Use, Validator, CAPTURE_VARIABLE, + Annotation, Arg, ArgName, ArgVia, AssignmentKind, AssignmentPattern, BinOp, + ByteArrayFormatPreference, CallArg, ClauseGuard, Constant, CurveType, DataType, Definition, + Function, IfBranch, LogicalOpChainKind, ModuleConstant, Pattern, RecordConstructor, + RecordConstructorArg, RecordUpdateSpread, Span, TraceKind, TypeAlias, TypedArg, UnOp, + UnqualifiedImport, UntypedArg, UntypedArgVia, UntypedAssignmentKind, UntypedClause, + UntypedClauseGuard, UntypedDefinition, UntypedFunction, UntypedModule, UntypedPattern, + UntypedRecordUpdateArg, Use, Validator, CAPTURE_VARIABLE, }, docvec, expr::{FnStyle, UntypedExpr, DEFAULT_ERROR_STR, DEFAULT_TODO_STR}, @@ -679,7 +679,7 @@ impl<'comments> Formatter<'comments> { fn assignment<'a>( &mut self, - patterns: &'a Vec1<(UntypedPattern, Option)>, + patterns: &'a Vec1, value: &'a UntypedExpr, kind: UntypedAssignmentKind, ) -> Document<'a> { @@ -691,12 +691,13 @@ impl<'comments> Formatter<'comments> { let symbol = if kind.is_backpassing() { "<-" } else { "=" }; match patterns.first() { - ( - UntypedPattern::Constructor { - name, module: None, .. - }, + AssignmentPattern { + pattern: + UntypedPattern::Constructor { + name, module: None, .. + }, annotation, - ) if name == "True" + } if name == "True" && annotation.is_none() && kind.is_expect() && patterns.len() == 1 => @@ -704,17 +705,22 @@ impl<'comments> Formatter<'comments> { keyword.to_doc().append(self.case_clause_value(value)) } _ => { - let patterns = patterns.into_iter().map(|(pattern, annotation)| { - self.pop_empty_lines(pattern.location().end); + let patterns = patterns.into_iter().map( + |AssignmentPattern { + pattern, + annotation, + }| { + self.pop_empty_lines(pattern.location().end); - let pattern = self.pattern(pattern); + let pattern = self.pattern(pattern); - let annotation = annotation - .as_ref() - .map(|a| ": ".to_doc().append(self.annotation(a))); + let annotation = annotation + .as_ref() + .map(|a| ": ".to_doc().append(self.annotation(a))); - pattern.append(annotation).group() - }); + pattern.append(annotation).group() + }, + ); keyword .to_doc() diff --git a/crates/aiken-lang/src/parser/definition/snapshots/def_test_fail.snap b/crates/aiken-lang/src/parser/definition/snapshots/def_test_fail.snap index 297d70a5..199199fa 100644 --- a/crates/aiken-lang/src/parser/definition/snapshots/def_test_fail.snap +++ b/crates/aiken-lang/src/parser/definition/snapshots/def_test_fail.snap @@ -15,8 +15,8 @@ Test( name: "False", }, patterns: [ - ( - Constructor { + AssignmentPattern { + pattern: Constructor { is_record: false, location: 38..42, name: "True", @@ -26,8 +26,8 @@ Test( with_spread: false, tipo: (), }, - None, - ), + annotation: None, + }, ], kind: Expect { backpassing: false, diff --git a/crates/aiken-lang/src/parser/definition/snapshots/function_assignment_only.snap b/crates/aiken-lang/src/parser/definition/snapshots/function_assignment_only.snap index c506c61a..f7345b59 100644 --- a/crates/aiken-lang/src/parser/definition/snapshots/function_assignment_only.snap +++ b/crates/aiken-lang/src/parser/definition/snapshots/function_assignment_only.snap @@ -26,13 +26,13 @@ Fn( }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 17..18, name: "x", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/assignment.rs b/crates/aiken-lang/src/parser/expr/assignment.rs index 065232a5..be38d44e 100644 --- a/crates/aiken-lang/src/parser/expr/assignment.rs +++ b/crates/aiken-lang/src/parser/expr/assignment.rs @@ -12,6 +12,10 @@ pub fn let_( .ignore_then( pattern() .then(just(Token::Colon).ignore_then(annotation()).or_not()) + .map(|(pattern, annotation)| ast::AssignmentPattern { + pattern, + annotation, + }) .separated_by(just(Token::Comma)) .at_least(1), ) @@ -44,6 +48,10 @@ pub fn expect( .ignore_then( pattern() .then(just(Token::Colon).ignore_then(annotation()).or_not()) + .map(|(pattern, annotation)| ast::AssignmentPattern { + pattern, + annotation, + }) .separated_by(just(Token::Comma)) .at_least(1) .then(choice((just(Token::Equal), just(Token::LArrow)))) @@ -57,8 +65,8 @@ pub fn expect( let (patterns, kind) = opt_pattern.unwrap_or_else(|| { ( - vec![( - ast::UntypedPattern::Constructor { + vec![ast::AssignmentPattern { + pattern: ast::UntypedPattern::Constructor { is_record: false, location: span, name: "True".to_string(), @@ -68,8 +76,8 @@ pub fn expect( with_spread: false, tipo: (), }, - None, - )], + annotation: None, + }], Token::Equal, ) }); diff --git a/crates/aiken-lang/src/parser/expr/snapshots/block_let.snap b/crates/aiken-lang/src/parser/expr/snapshots/block_let.snap index 6444967a..0d242c2b 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/block_let.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/block_let.snap @@ -17,13 +17,13 @@ Assignment { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 16..17, name: "x", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -47,13 +47,13 @@ Assignment { ], }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..5, name: "b", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect.snap index 21df69fc..4f1e050a 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect.snap @@ -13,8 +13,8 @@ Assignment { }, }, patterns: [ - ( - Constructor { + AssignmentPattern { + pattern: Constructor { is_record: false, location: 7..14, name: "Some", @@ -33,8 +33,8 @@ Assignment { with_spread: false, tipo: (), }, - None, - ), + annotation: None, + }, ], kind: Expect { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect_bool_sugar.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect_bool_sugar.snap index 27e7a77b..92382eb5 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect_bool_sugar.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect_bool_sugar.snap @@ -21,8 +21,8 @@ Assignment { }, }, patterns: [ - ( - Constructor { + AssignmentPattern { + pattern: Constructor { is_record: false, location: 0..29, name: "True", @@ -32,8 +32,8 @@ Assignment { with_spread: false, tipo: (), }, - None, - ), + annotation: None, + }, ], kind: Expect { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect_expect_let.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect_expect_let.snap index 5df2fcab..016864c8 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect_expect_let.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect_expect_let.snap @@ -17,13 +17,13 @@ Assignment { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 13..14, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -32,8 +32,8 @@ Assignment { ], }, patterns: [ - ( - Constructor { + AssignmentPattern { + pattern: Constructor { is_record: false, location: 0..21, name: "True", @@ -43,8 +43,8 @@ Assignment { with_spread: false, tipo: (), }, - None, - ), + annotation: None, + }, ], kind: Expect { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let.snap index 5b26c139..21a383d3 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let.snap @@ -17,13 +17,13 @@ Assignment { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 14..15, name: "b", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -32,13 +32,13 @@ Assignment { ], }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..5, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_parens.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_parens.snap index 12a355bd..d4a6f3db 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_parens.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_parens.snap @@ -17,13 +17,13 @@ Assignment { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 14..15, name: "b", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -32,13 +32,13 @@ Assignment { ], }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..5, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_return.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_return.snap index 5fb0c2eb..f0acd435 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_return.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect_let_in_let_return.snap @@ -17,13 +17,13 @@ Assignment { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 16..17, name: "b", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -36,13 +36,13 @@ Assignment { ], }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..5, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/expect_trace_if_false.snap b/crates/aiken-lang/src/parser/expr/snapshots/expect_trace_if_false.snap index a0300807..add9e781 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/expect_trace_if_false.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/expect_trace_if_false.snap @@ -12,8 +12,8 @@ Assignment { }, }, patterns: [ - ( - Constructor { + AssignmentPattern { + pattern: Constructor { is_record: false, location: 0..11, name: "True", @@ -23,8 +23,8 @@ Assignment { with_spread: false, tipo: (), }, - None, - ), + annotation: None, + }, ], kind: Expect { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/function_invoke.snap b/crates/aiken-lang/src/parser/expr/snapshots/function_invoke.snap index 72540983..7d3d16f6 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/function_invoke.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/function_invoke.snap @@ -28,13 +28,13 @@ Sequence { location: 8..18, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..5, name: "x", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -118,13 +118,13 @@ Sequence { return_annotation: None, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 24..33, name: "map_add_x", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/int_numeric_underscore.snap b/crates/aiken-lang/src/parser/expr/snapshots/int_numeric_underscore.snap index 8042af2d..4b8b0093 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/int_numeric_underscore.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/int_numeric_underscore.snap @@ -15,13 +15,13 @@ Sequence { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 8..9, name: "i", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -37,13 +37,13 @@ Sequence { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 28..29, name: "j", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -63,13 +63,13 @@ Sequence { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 48..49, name: "k", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/let_bindings.snap b/crates/aiken-lang/src/parser/expr/snapshots/let_bindings.snap index 91d6b566..5d7430f9 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/let_bindings.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/let_bindings.snap @@ -29,13 +29,13 @@ Assignment { tail: None, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..9, name: "thing", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple.snap b/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple.snap index 5fd34da5..ac27b641 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple.snap @@ -41,13 +41,13 @@ Sequence { ], }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..9, name: "tuple", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple2.snap b/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple2.snap index 8ac60cc7..9b57ec8a 100644 --- a/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple2.snap +++ b/crates/aiken-lang/src/parser/expr/snapshots/parse_tuple2.snap @@ -28,13 +28,13 @@ Sequence { location: 8..15, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 4..5, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/parser/expr/when/snapshots/when_basic.snap b/crates/aiken-lang/src/parser/expr/when/snapshots/when_basic.snap index 4be8bf53..b1f9628a 100644 --- a/crates/aiken-lang/src/parser/expr/when/snapshots/when_basic.snap +++ b/crates/aiken-lang/src/parser/expr/when/snapshots/when_basic.snap @@ -86,13 +86,13 @@ When { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 55..62, name: "amazing", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/snapshots/function_ambiguous_sequence.snap b/crates/aiken-lang/src/snapshots/function_ambiguous_sequence.snap index 4d8808b3..d6459358 100644 --- a/crates/aiken-lang/src/snapshots/function_ambiguous_sequence.snap +++ b/crates/aiken-lang/src/snapshots/function_ambiguous_sequence.snap @@ -20,13 +20,13 @@ Module { name: "bar", }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 19..20, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -64,13 +64,13 @@ Module { name: "bar", }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 56..57, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -119,13 +119,13 @@ Module { }, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 93..94, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, @@ -170,13 +170,13 @@ Module { location: 130..137, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 126..127, name: "a", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/snapshots/parse_unicode_offset_1.snap b/crates/aiken-lang/src/snapshots/parse_unicode_offset_1.snap index 73d9ba10..dc3f0e3d 100644 --- a/crates/aiken-lang/src/snapshots/parse_unicode_offset_1.snap +++ b/crates/aiken-lang/src/snapshots/parse_unicode_offset_1.snap @@ -25,13 +25,13 @@ Module { preferred_format: Utf8String, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 17..18, name: "x", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/snapshots/parse_unicode_offset_2.snap b/crates/aiken-lang/src/snapshots/parse_unicode_offset_2.snap index dbf759f5..2dec2f89 100644 --- a/crates/aiken-lang/src/snapshots/parse_unicode_offset_2.snap +++ b/crates/aiken-lang/src/snapshots/parse_unicode_offset_2.snap @@ -23,13 +23,13 @@ Module { preferred_format: Utf8String, }, patterns: [ - ( - Var { + AssignmentPattern { + pattern: Var { location: 17..18, name: "x", }, - None, - ), + annotation: None, + }, ], kind: Let { backpassing: false, diff --git a/crates/aiken-lang/src/tipo/expr.rs b/crates/aiken-lang/src/tipo/expr.rs index 62c182d6..84292236 100644 --- a/crates/aiken-lang/src/tipo/expr.rs +++ b/crates/aiken-lang/src/tipo/expr.rs @@ -8,7 +8,7 @@ use super::{ }; use crate::{ ast::{ - self, Annotation, Arg, ArgName, AssignmentKind, BinOp, Bls12_381Point, + self, Annotation, Arg, ArgName, AssignmentKind, AssignmentPattern, BinOp, Bls12_381Point, ByteArrayFormatPreference, CallArg, ClauseGuard, Constant, Curve, IfBranch, LogicalOpChainKind, Pattern, RecordUpdateSpread, Span, TraceKind, TraceLevel, Tracing, TypedArg, TypedCallArg, TypedClause, TypedClauseGuard, TypedIfBranch, TypedPattern, @@ -269,7 +269,10 @@ impl<'a, 'b> ExprTyper<'a, 'b> { } => { // at this point due to backpassing rewrites, // patterns is guaranteed to have one item - let (pattern, annotation) = patterns.into_vec().swap_remove(0); + let AssignmentPattern { + pattern, + annotation, + } = patterns.into_vec().swap_remove(0); self.infer_assignment(pattern, *value, kind, &annotation, location) } @@ -966,7 +969,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> { value: UntypedExpr::Assignment { location, value: untyped_value.into(), - patterns: Vec1::new((untyped_pattern, Some(ann))), + patterns: AssignmentPattern::new(untyped_pattern, Some(ann)).into(), kind, }, }); @@ -1013,14 +1016,15 @@ impl<'a, 'b> ExprTyper<'a, 'b> { name: "...".to_string(), location: Span::empty(), }), - patterns: Vec1::new((untyped_pattern, None)), + patterns: AssignmentPattern::new(untyped_pattern, None) + .into(), kind: AssignmentKind::Let { backpassing: true }, } } _ => UntypedExpr::Assignment { location: Span::empty(), value: Box::new(untyped_value), - patterns: Vec1::new((untyped_pattern, None)), + patterns: AssignmentPattern::new(untyped_pattern, None).into(), kind: AssignmentKind::let_(), }, }, @@ -1753,7 +1757,12 @@ impl<'a, 'b> ExprTyper<'a, 'b> { let mut names = Vec::new(); - for (index, (pattern, annotation)) in patterns.into_iter().enumerate() { + for (index, assignment_pattern) in patterns.into_iter().enumerate() { + let AssignmentPattern { + pattern, + annotation, + } = assignment_pattern; + // In case where we have a Pattern that isn't simply a let-binding to a name, we do insert an extra let-binding // in front of the continuation sequence. This is because we do not support patterns in function argument // (which is perhaps something we should support?). @@ -1773,7 +1782,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> { name: name.clone(), } .into(), - patterns: Vec1::new((pattern, annotation)), + patterns: AssignmentPattern::new(pattern, annotation).into(), // erase backpassing while preserving assignment kind. kind: match kind { AssignmentKind::Let { .. } => AssignmentKind::let_(), @@ -1878,12 +1887,12 @@ impl<'a, 'b> ExprTyper<'a, 'b> { return Err(Error::UnexpectedMultiPatternAssignment { arrow: patterns .last() - .0 + .pattern .location() .map(|_, c_end| (c_end + 1, c_end + 1)), location: patterns[1..] .iter() - .map(|(p, _)| p.location()) + .map(|ap| ap.pattern.location()) .reduce(|acc, loc| acc.union(loc)) .unwrap_or(location) .map_end(|current| current - 1), @@ -2182,7 +2191,7 @@ impl<'a, 'b> ExprTyper<'a, 'b> { sample: UntypedExpr::Assignment { location: Span::empty(), value: Box::new(subject.clone()), - patterns: Vec1::new((clauses[0].patterns[0].clone(), None)), + patterns: AssignmentPattern::new(clauses[0].patterns[0].clone(), None).into(), kind: AssignmentKind::let_(), }, });