@@ -30,8 +30,8 @@ module Position = struct
3030 | `ByMatch of int option * cp_match
3131 ]
3232
33- type codepos1 = int * cp_base
34- type codepos = (codepos1 * int ) list * codepos1
33+ type codepos1 = int * cp_base
34+ type codepos = (codepos1 * int ) list * codepos1
3535 type codeoffset1 = [`ByOffset of int | `ByPosition of codepos1 ]
3636
3737 let shift1 ~(offset : int ) ((o , p ) : codepos1 ) : codepos1 =
@@ -176,30 +176,41 @@ module Zipper = struct
176176 let (s, _) = split_at_cpos1 ~after: `No env cpos s in
177177 1 + List. length s
178178
179- let zipper_at_nm_cpos1 (env : EcEnv.env ) ((cp1 , sub ) : codepos1 * int ) s zpr =
179+ let zipper_at_nm_cpos1
180+ (env : EcEnv.env )
181+ ((cp1 , sub ) : codepos1 * int )
182+ (s : stmt )
183+ (zpr : ipath )
184+ : (ipath * stmt ) * (codepos1 * int )
185+ =
180186 let (s1, i, s2) = find_by_cpos1 env cp1 s in
187+ let zpr =
188+ match i.i_node, sub with
189+ | Swhile (e , sw ), 0 ->
190+ (ZWhile (e, ((s1, s2), zpr)), sw)
181191
182- match i.i_node, sub with
183- | Swhile (e , sw ), 0 ->
184- (ZWhile (e, ((s1, s2), zpr)), sw)
185-
186- | Sif (e , ifs1 , ifs2 ), 0 ->
187- (ZIfThen (e, ((s1, s2), zpr), ifs2), ifs1)
192+ | Sif (e , ifs1 , ifs2 ), 0 ->
193+ (ZIfThen (e, ((s1, s2), zpr), ifs2), ifs1)
188194
189- | Sif (e , ifs1 , ifs2 ), 1 ->
190- (ZIfElse (e, ifs1, ((s1, s2), zpr)), ifs2)
195+ | Sif (e , ifs1 , ifs2 ), 1 ->
196+ (ZIfElse (e, ifs1, ((s1, s2), zpr)), ifs2)
191197
192- | _ -> raise InvalidCPos
198+ | _ -> raise InvalidCPos
199+ in zpr, ((0 , `ByPos (1 + List. length s1)), sub)
193200
194- let zipper_of_cpos (env : EcEnv.env ) ((nm , cp1 ) : codepos ) s =
195- let zpr, s =
196- List. fold_left
201+ let zipper_of_cpos_r (env : EcEnv.env ) ((nm , cp1 ) : codepos ) ( s : stmt ) =
202+ let ( zpr, s), nm =
203+ List. fold_left_map
197204 (fun (zpr , s ) nm1 -> zipper_at_nm_cpos1 env nm1 s zpr)
198205 (ZTop , s) nm in
199206
200207 let s1, i, s2 = find_by_cpos1 env cp1 s in
208+ let zpr = zipper s1 (i :: s2) zpr in
209+
210+ (zpr, (nm, (0 , `ByPos (1 + List. length s1))))
201211
202- zipper s1 (i :: s2) zpr
212+ let zipper_of_cpos (env : EcEnv.env ) (cp : codepos ) (s : stmt ) =
213+ fst (zipper_of_cpos_r env cp s)
203214
204215 let split_at_cpos1 env cpos1 s =
205216 split_at_cpos1 ~after: `Auto env cpos1 s
0 commit comments