@@ -200,6 +200,23 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
200200 Term :: Ann ( ( ) , self . scope . to_scope ( expr) , self . scope . to_scope ( r#type) )
201201 }
202202
203+ fn check_dependent_tuple (
204+ & mut self ,
205+ labels : & [ StringId ] ,
206+ exprs : & [ core:: Term < ' _ > ] ,
207+ ) -> Term < ' arena , ( ) > {
208+ let initial_local_len = self . local_len ( ) ;
209+ let exprs = ( self . scope ) . to_scope_from_iter (
210+ Iterator :: zip ( labels. iter ( ) , exprs. iter ( ) ) . map ( |( label, expr) | {
211+ let expr = self . check ( expr) ;
212+ self . push_local ( Some ( * label) ) ;
213+ expr
214+ } ) ,
215+ ) ;
216+ self . truncate_local ( initial_local_len) ;
217+ Term :: Tuple ( ( ) , exprs)
218+ }
219+
203220 /// Distill a core term into a surface term, in a 'checkable' context.
204221 pub fn check ( & mut self , core_term : & core:: Term < ' _ > ) -> Term < ' arena , ( ) > {
205222 match core_term {
@@ -247,9 +264,12 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
247264 core:: Term :: RecordType ( _, labels, types)
248265 if is_tuple_type ( & mut self . interner . borrow_mut ( ) , labels, types) =>
249266 {
250- let scope = self . scope ;
251- let types = types. iter ( ) . map ( |expr| self . check ( expr) ) ;
252- Term :: Tuple ( ( ) , scope. to_scope_from_iter ( types) )
267+ self . check_dependent_tuple ( labels, types)
268+ }
269+ core:: Term :: FormatRecord ( _, labels, formats)
270+ if is_tuple_type ( & mut self . interner . borrow_mut ( ) , labels, formats) =>
271+ {
272+ self . check_dependent_tuple ( labels, formats)
253273 }
254274 core:: Term :: RecordLit ( _, labels, exprs)
255275 if self . interner . borrow_mut ( ) . is_tuple_labels ( labels) =>
@@ -274,13 +294,6 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
274294
275295 Term :: ArrayLiteral ( ( ) , scope. to_scope_from_iter ( elem_exprs) )
276296 }
277- core:: Term :: FormatRecord ( _, labels, formats)
278- if is_tuple_type ( & mut self . interner . borrow_mut ( ) , labels, formats) =>
279- {
280- let scope = self . scope ;
281- let formats = formats. iter ( ) . map ( |format| self . check ( format) ) ;
282- Term :: Tuple ( ( ) , scope. to_scope_from_iter ( formats) )
283- }
284297 core:: Term :: ConstLit ( _span, r#const) => match r#const {
285298 core:: Const :: Bool ( boolean) => Term :: BooleanLiteral ( ( ) , * boolean) ,
286299 core:: Const :: U8 ( number, style) => self . check_number_literal_styled ( number, * style) ,
@@ -520,20 +533,13 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
520533 core:: Term :: RecordType ( _, labels, types)
521534 if is_tuple_type ( & mut self . interner . borrow_mut ( ) , labels, types) =>
522535 {
523- let initial_local_len = self . local_len ( ) ;
524- let types = ( self . scope ) . to_scope_from_iter (
525- Iterator :: zip ( labels. iter ( ) , types. iter ( ) ) . map ( |( label, r#type) | {
526- let r#type = self . check ( r#type) ;
527- self . push_local ( Some ( * label) ) ;
528- r#type
529- } ) ,
530- ) ;
531- self . truncate_local ( initial_local_len) ;
532- Term :: Ann (
533- ( ) ,
534- self . scope . to_scope ( Term :: Tuple ( ( ) , types) ) ,
535- & Term :: Universe ( ( ) ) ,
536- )
536+ let tuple = self . check_dependent_tuple ( labels, types) ;
537+ Term :: Ann ( ( ) , self . scope . to_scope ( tuple) , & Term :: Universe ( ( ) ) )
538+ }
539+ core:: Term :: FormatRecord ( _span, labels, formats)
540+ if is_tuple_type ( & mut self . interner . borrow_mut ( ) , labels, formats) =>
541+ {
542+ self . check_dependent_tuple ( labels, formats)
537543 }
538544 core:: Term :: RecordType ( _span, labels, types) => {
539545 let initial_local_len = self . local_len ( ) ;
@@ -591,13 +597,7 @@ impl<'interner, 'arena, 'env> Context<'interner, 'arena, 'env> {
591597 // FIXME: Type annotations
592598 Term :: ArrayLiteral ( ( ) , scope. to_scope_from_iter ( elem_exprs) )
593599 }
594- core:: Term :: FormatRecord ( _span, labels, formats)
595- if is_tuple_type ( & mut self . interner . borrow_mut ( ) , labels, formats) =>
596- {
597- let scope = self . scope ;
598- let formats = formats. iter ( ) . map ( |format| self . synth ( format) ) ;
599- Term :: Tuple ( ( ) , scope. to_scope_from_iter ( formats) )
600- }
600+
601601 core:: Term :: FormatRecord ( _span, labels, formats) => {
602602 Term :: FormatRecord ( ( ) , self . synth_format_fields ( labels, formats) )
603603 }
0 commit comments