Skip to content

Commit 643b188

Browse files
committed
fix a mistake of refactoring about passing type environments
1 parent e849618 commit 643b188

File tree

1 file changed

+10
-22
lines changed

1 file changed

+10
-22
lines changed

src/frontend/typechecker.ml

+10-22
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,10 @@ let rec typecheck_pattern (pre : pre) (tyenv : Typeenv.t) ((rng, utpatmain) : un
254254
return (PConstructor(ctornm, epat1), (rng, DataType(tyargs, tyid)), tyenv1)
255255

256256

257-
let typecheck_function_parameter_unit (pre : pre) (tyenv : Typeenv.t) (param_unit : untyped_parameter_unit) : (pattern_var_map * mono_row * mono_type * EvalVarID.t LabelMap.t * pattern_tree) ok =
257+
let typecheck_function_parameter_unit ~(cons : label ranged -> mono_type -> 'a -> 'a) ~(nil : 'a) (pre : pre) (tyenv : Typeenv.t) (param_unit : untyped_parameter_unit) : (Typeenv.t * 'a * mono_type * EvalVarID.t LabelMap.t * pattern_tree) ok =
258258
let open ResultMonad in
259259
let UTParameterUnit(opt_params, utpat, mnty_opt) = param_unit in
260260
let (optrow, evid_labmap, tyenv) =
261-
let cons rlabel ty row = (RowCons(rlabel, ty, row)) in
262-
let nil = RowEmpty in
263261
add_optionals_to_type_environment ~cons ~nil tyenv pre opt_params
264262
in
265263
let* (epat, ty_pat, patvarmap) = typecheck_pattern pre tyenv utpat in
@@ -272,31 +270,20 @@ let typecheck_function_parameter_unit (pre : pre) (tyenv : Typeenv.t) (param_uni
272270
| None ->
273271
return ()
274272
in
275-
return (patvarmap, optrow, ty_pat, evid_labmap, epat)
273+
let tyenv = add_pattern_var_mono pre tyenv patvarmap in
274+
return (tyenv, optrow, ty_pat, evid_labmap, epat)
276275

277276

278277
let typecheck_abstraction (pre : pre) (tyenv : Typeenv.t) (param_units : untyped_parameter_unit list) : (Typeenv.t * (EvalVarID.t LabelMap.t * pattern_tree * mono_type LabelMap.t * mono_type) list) ok =
279278
let open ResultMonad in
280279
let* (tyenv, acc) =
281280
param_units |> foldM (fun (tyenv, acc) param_unit ->
282-
let UTParameterUnit(opt_params, utpat, mnty_opt) = param_unit in
283-
let (ty_labmap, evid_labmap, tyenv) =
281+
let* (patvarmap, ty_labmap, ty_pat, evid_labmap, epat) =
284282
let cons (_, label) ty ty_labmap = ty_labmap |> LabelMap.add label ty in
285283
let nil = LabelMap.empty in
286-
add_optionals_to_type_environment ~cons ~nil tyenv pre opt_params
284+
typecheck_function_parameter_unit ~cons ~nil pre tyenv param_unit
287285
in
288-
let* (pat, ty_pat, patvarmap) = typecheck_pattern pre tyenv utpat in
289-
let* () =
290-
match mnty_opt with
291-
| Some(mnty) ->
292-
let* typat_annot = ManualTypeDecoder.decode_manual_type pre tyenv mnty in
293-
unify ty_pat typat_annot
294-
295-
| None ->
296-
return ()
297-
in
298-
let tyenv = add_pattern_var_mono pre tyenv patvarmap in
299-
return (tyenv, Alist.extend acc (evid_labmap, pat, ty_labmap, ty_pat))
286+
return (tyenv, Alist.extend acc (evid_labmap, epat, ty_labmap, ty_pat))
300287
) (tyenv, Alist.empty)
301288
in
302289
return (tyenv, acc |> Alist.to_list)
@@ -671,11 +658,12 @@ let rec typecheck (pre : pre) (tyenv : Typeenv.t) ((rng, utastmain) : untyped_ab
671658
end
672659

673660
| UTFunction(param_unit, utast1) ->
674-
let* (patvarmap, optrow, ty_pat, evid_labmap, epat) =
675-
typecheck_function_parameter_unit pre tyenv param_unit
661+
let* (tyenv, optrow, ty_pat, evid_labmap, epat) =
662+
let cons rlabel ty row = (RowCons(rlabel, ty, row)) in
663+
let nil = RowEmpty in
664+
typecheck_function_parameter_unit ~cons ~nil pre tyenv param_unit
676665
in
677666
let* (e1, ty1) =
678-
let tyenv = add_pattern_var_mono pre tyenv patvarmap in
679667
typecheck pre tyenv utast1
680668
in
681669
return (Function(evid_labmap, PatternBranch(epat, e1)), (rng, FuncType(optrow, ty_pat, ty1)))

0 commit comments

Comments
 (0)