@@ -66,7 +66,7 @@ pub struct ItemDef<'arena, Range> {
6666 /// The label that identifies this definition
6767 label : ( Range , StringId ) ,
6868 /// Parameter patterns
69- patterns : & ' arena [ ( Pattern < Range > , Option < & ' arena Term < ' arena , Range > > ) ] ,
69+ patterns : & ' arena [ ( Pattern < ' arena , Range > , Option < & ' arena Term < ' arena , Range > > ) ] ,
7070 /// An optional type annotation for the defined expression
7171 // FIXME: raw identifiers in LALRPOP grammars https://github.com/lalrpop/lalrpop/issues/613
7272 type_ : Option < & ' arena Term < ' arena , Range > > ,
@@ -76,7 +76,7 @@ pub struct ItemDef<'arena, Range> {
7676
7777/// Surface patterns.
7878#[ derive( Debug , Clone ) ]
79- pub enum Pattern < Range > {
79+ pub enum Pattern < ' arena , Range > {
8080 /// Named patterns, eg. `x`, `true`, `false`
8181 Name ( Range , StringId ) ,
8282 /// Placeholder patterns, eg. `_`
@@ -93,8 +93,10 @@ pub enum Pattern<Range> {
9393 NumberLiteral ( Range , StringId ) ,
9494 /// Boolean literal patterns
9595 BooleanLiteral ( Range , bool ) ,
96- // TODO: Record literal patterns
97- // RecordLiteral(Range, &'arena [((ByteRange, StringId), Pattern<'arena, Range>)]),
96+ /// Record literal patterns
97+ RecordLiteral ( Range , & ' arena [ PatternField < ' arena , Range > ] ) ,
98+ /// Tuple literal patterns
99+ Tuple ( Range , & ' arena [ Pattern < ' arena , Range > ] ) ,
98100}
99101
100102#[ derive( Debug , Clone , Copy ) ]
@@ -151,14 +153,16 @@ impl<Range> fmt::Display for BinOp<Range> {
151153 }
152154}
153155
154- impl < Range : Clone > Pattern < Range > {
156+ impl < ' arena , Range : Clone > Pattern < ' arena , Range > {
155157 pub fn range ( & self ) -> Range {
156158 match self {
157159 Pattern :: Name ( range, _)
158160 | Pattern :: Placeholder ( range)
159161 | Pattern :: StringLiteral ( range, _)
160162 | Pattern :: NumberLiteral ( range, _)
161- | Pattern :: BooleanLiteral ( range, _) => range. clone ( ) ,
163+ | Pattern :: BooleanLiteral ( range, _)
164+ | Pattern :: RecordLiteral ( range, _)
165+ | Pattern :: Tuple ( range, _) => range. clone ( ) ,
162166 }
163167 }
164168}
@@ -181,7 +185,7 @@ pub enum Term<'arena, Range> {
181185 /// Let expressions.
182186 Let (
183187 Range ,
184- Pattern < Range > ,
188+ Pattern < ' arena , Range > ,
185189 Option < & ' arena Term < ' arena , Range > > ,
186190 & ' arena Term < ' arena , Range > ,
187191 & ' arena Term < ' arena , Range > ,
@@ -197,7 +201,7 @@ pub enum Term<'arena, Range> {
197201 Match (
198202 Range ,
199203 & ' arena Term < ' arena , Range > ,
200- & ' arena [ ( Pattern < Range > , Term < ' arena , Range > ) ] ,
204+ & ' arena [ ( Pattern < ' arena , Range > , Term < ' arena , Range > ) ] ,
201205 ) ,
202206 /// The type of types.
203207 Universe ( Range ) ,
@@ -210,13 +214,13 @@ pub enum Term<'arena, Range> {
210214 /// Dependent function types.
211215 FunType (
212216 Range ,
213- & ' arena [ ( Pattern < Range > , Option < & ' arena Term < ' arena , Range > > ) ] ,
217+ & ' arena [ ( Pattern < ' arena , Range > , Option < & ' arena Term < ' arena , Range > > ) ] ,
214218 & ' arena Term < ' arena , Range > ,
215219 ) ,
216220 /// Function literals.
217221 FunLiteral (
218222 Range ,
219- & ' arena [ ( Pattern < Range > , Option < & ' arena Term < ' arena , Range > > ) ] ,
223+ & ' arena [ ( Pattern < ' arena , Range > , Option < & ' arena Term < ' arena , Range > > ) ] ,
220224 & ' arena Term < ' arena , Range > ,
221225 ) ,
222226 /// Applications.
@@ -373,6 +377,15 @@ pub struct ExprField<'arena, Range> {
373377 expr : Term < ' arena , Range > ,
374378}
375379
380+ /// A field definition in a record pattern
381+ #[ derive( Debug , Clone ) ]
382+ pub struct PatternField < ' arena , Range > {
383+ /// Label identifying the field
384+ label : ( Range , StringId ) ,
385+ /// The pattern that this field will match
386+ pattern : Pattern < ' arena , Range > ,
387+ }
388+
376389/// Messages produced during parsing
377390#[ derive( Clone , Debug ) ]
378391pub enum ParseMessage {
0 commit comments