@@ -645,10 +645,10 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
645645 for item in elab_order. iter ( ) . copied ( ) . map ( |i| & surface_module. items [ i] ) {
646646 match item {
647647 Item :: Def ( item) => {
648- let ( expr, type_value ) =
648+ let ( expr, r#type ) =
649649 self . synth_fun_lit ( item. range , item. params , item. expr , item. r#type ) ;
650650 let expr_value = self . eval_env ( ) . eval ( & expr) ;
651- let r#type = self . quote_env ( ) . quote ( self . scope , & type_value ) ;
651+ let type_value = self . eval_env ( ) . eval ( & r#type ) ;
652652
653653 self . item_env
654654 . push_definition ( item. label . 1 , type_value, expr_value) ;
@@ -887,13 +887,17 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
887887 & mut self ,
888888 pattern : & Pattern < ByteRange > ,
889889 r#type : Option < & Term < ' _ , ByteRange > > ,
890- ) -> ( CheckedPattern , ArcValue < ' arena > ) {
890+ ) -> ( CheckedPattern , core :: Term < ' arena > , ArcValue < ' arena > ) {
891891 match r#type {
892- None => self . synth_pattern ( pattern) ,
892+ None => {
893+ let ( pattern, type_value) = self . synth_pattern ( pattern) ;
894+ let r#type = self . quote_env ( ) . quote ( self . scope , & type_value) ;
895+ ( pattern, r#type, type_value)
896+ }
893897 Some ( r#type) => {
894898 let r#type = self . check ( r#type, & self . universe . clone ( ) ) ;
895899 let type_value = self . eval_env ( ) . eval ( & r#type) ;
896- ( self . check_pattern ( pattern, & type_value) , type_value)
900+ ( self . check_pattern ( pattern, & type_value) , r#type , type_value)
897901 }
898902 }
899903 }
@@ -958,9 +962,8 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
958962
959963 Vec :: from_iter ( params. iter ( ) . map ( |param| {
960964 let range = param. pattern . range ( ) ;
961- let ( pattern, type_value) =
965+ let ( pattern, r#type , type_value) =
962966 self . synth_ann_pattern ( & param. pattern , param. r#type . as_ref ( ) ) ;
963- let r#type = self . quote_env ( ) . quote ( self . scope , & type_value) ;
964967 let ( name, _) = self . push_local_param ( pattern, type_value) ;
965968
966969 ( range, param. plicity , name, r#type)
@@ -980,8 +983,8 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
980983
981984 match ( surface_term, expected_type. as_ref ( ) ) {
982985 ( Term :: Let ( _, def_pattern, def_type, def_expr, body_expr) , _) => {
983- let ( def_pattern, def_type_value) = self . synth_ann_pattern ( def_pattern , * def_type ) ;
984- let def_type = self . quote_env ( ) . quote ( self . scope , & def_type_value ) ;
986+ let ( def_pattern, def_type , def_type_value) =
987+ self . synth_ann_pattern ( def_pattern , * def_type ) ;
985988 let def_expr = self . check ( def_expr, & def_type_value) ;
986989 let def_expr_value = self . eval_env ( ) . eval ( & def_expr) ;
987990
@@ -1376,8 +1379,8 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
13761379 ( ann_expr, type_value)
13771380 }
13781381 Term :: Let ( _, def_pattern, def_type, def_expr, body_expr) => {
1379- let ( def_pattern, def_type_value) = self . synth_ann_pattern ( def_pattern , * def_type ) ;
1380- let def_type = self . quote_env ( ) . quote ( self . scope , & def_type_value ) ;
1382+ let ( def_pattern, def_type , def_type_value) =
1383+ self . synth_ann_pattern ( def_pattern , * def_type ) ;
13811384 let def_expr = self . check ( def_expr, & def_type_value) ;
13821385 let def_expr_value = self . eval_env ( ) . eval ( & def_expr) ;
13831386
@@ -1472,7 +1475,8 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
14721475 ( fun_type, self . universe . clone ( ) )
14731476 }
14741477 Term :: FunLiteral ( range, params, body_expr) => {
1475- self . synth_fun_lit ( * range, params, body_expr, None )
1478+ let ( expr, r#type) = self . synth_fun_lit ( * range, params, body_expr, None ) ;
1479+ ( expr, self . eval_env ( ) . eval ( & r#type) )
14761480 }
14771481 Term :: App ( range, head_expr, args) => {
14781482 let mut head_range = head_expr. range ( ) ;
@@ -1775,7 +1779,8 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
17751779 Value :: Stuck ( Head :: MetaVar ( _) , _) => {
17761780 let range = ByteRange :: merge ( param. pattern . range ( ) , body_expr. range ( ) ) ;
17771781 let ( expr, r#type) = self . synth_fun_lit ( range, params, body_expr, None ) ;
1778- self . convert ( range, expr, & r#type, expected_type)
1782+ let type_value = self . eval_env ( ) . eval ( & r#type) ;
1783+ self . convert ( range, expr, & type_value, expected_type)
17791784 }
17801785 Value :: Stuck ( Head :: Prim ( Prim :: ReportedError ) , _) => {
17811786 core:: Term :: Prim ( file_range. into ( ) , Prim :: ReportedError )
@@ -1801,7 +1806,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
18011806 params : & [ Param < ' _ , ByteRange > ] ,
18021807 body_expr : & Term < ' _ , ByteRange > ,
18031808 body_type : Option < & Term < ' _ , ByteRange > > ,
1804- ) -> ( core:: Term < ' arena > , ArcValue < ' arena > ) {
1809+ ) -> ( core:: Term < ' arena > , core :: Term < ' arena > ) {
18051810 self . local_env . reserve ( params. len ( ) ) ;
18061811 let initial_local_len = self . local_env . len ( ) ;
18071812
@@ -1843,7 +1848,7 @@ impl<'interner, 'arena> Context<'interner, 'arena> {
18431848 ) ;
18441849 }
18451850
1846- ( fun_lit, self . eval_env ( ) . eval ( & fun_type) )
1851+ ( fun_lit, fun_type)
18471852 }
18481853
18491854 fn synth_bin_op (
0 commit comments