@@ -19,10 +19,13 @@ let combine_result = (r1: match_result, r2: match_result): match_result =>
1919 * Collected during pattern matching when patterns are targeted. */
2020type sample_closures = list ((Sample . call_stack , int , int ) => Sample . t );
2121
22- /* Core pattern matching logic - just a switch on pattern structure */
22+ /* Core pattern matching logic - just a switch on pattern structure.
23+ sample_closures is optional: when provided, type probe closures from
24+ pattern ascriptions (Asc) are captured. */
2325let match_pattern =
2426 (
2527 ~targets: Sample . targets ,
28+ ~sample_closures: option (ref (sample_closures ))=?,
2629 recur: (Pat . t , DHExp . t ) => match_result ,
2730 dp: Pat . t ,
2831 d: DHExp . t ,
@@ -73,9 +76,13 @@ let match_pattern =
7376 List . map2 (recur , ps , ds ) |> List . fold_left (combine_result , Matches ([] ));
7477 | Parens (p ) => recur(p, d)
7578 | Asc (p , t1 ) =>
76- // TODO Capture closures
77- let (_closures , exp ) =
79+ let (closures , exp ) =
7880 Ascriptions . transition_multiple(~targets, Asc (d, t1) |> DHExp . fresh);
81+ /* Capture type probe closures from the pattern ascription */
82+ switch (sample_closures) {
83+ | Some (ref_closures ) => ref_closures := closures @ ref_closures^
84+ | None => ()
85+ };
7986 recur(p, exp);
8087 };
8188
@@ -117,13 +124,14 @@ let rec matches_inner =
117124 d: DHExp . t ,
118125 )
119126 : match_result => {
120- // TODO Record closures
121- let (_closures , d ) = Ascriptions . transition_multiple(~targets, d);
127+ // Capture type probe closures from value ascriptions
128+ let (closures , d ) = Ascriptions . transition_multiple(~targets, d);
129+ sample_closures := closures @ sample_closures^;
122130 let pat_id = Pat . rep_id(dp);
123131 let maybe_spec = Id . Map . find_opt(pat_id, targets);
124132 let recur = matches_inner(targets, sample_closures);
125133
126- let result = match_pattern(~targets, recur, dp, d);
134+ let result = match_pattern(~targets, ~sample_closures , recur, dp, d);
127135 record_sample(sample_closures, pat_id, maybe_spec, d, result);
128136 result;
129137};
0 commit comments