@@ -110,13 +110,13 @@ exception Not_expression
110110
111111let rec expression_of_statement_list l =
112112 match l with
113- | (J. Return_statement (Some e ), _ ) :: _ -> e
113+ | (J. Return_statement (Some e , _ ), _ ) :: _ -> e
114114 | (J. Expression_statement e , _ ) :: rem -> J. ESeq (e, expression_of_statement_list rem)
115115 | _ -> raise Not_expression
116116
117117let expression_of_statement st =
118118 match fst st with
119- | J. Return_statement (Some e ) -> e
119+ | J. Return_statement (Some e , _ ) -> e
120120 | J. Block l -> expression_of_statement_list l
121121 | _ -> raise Not_expression
122122
@@ -194,15 +194,16 @@ and depth_class_block b =
194194 | J. CEField _ -> acc
195195 | J. CEStaticBLock b -> depth_block b + 2 )
196196
197- let rec if_statement_2 e loc iftrue truestop iffalse falsestop =
197+ let rec if_statement_2 ~ function_end e loc iftrue truestop iffalse falsestop =
198198 let e = simplify_condition e in
199199 match fst iftrue, fst iffalse with
200200 (* Empty blocks *)
201201 | J. Block [] , J. Block [] -> (
202202 match e with
203203 | J. EVar _ -> []
204204 | _ -> [ J. Expression_statement e, loc ])
205- | J. Block [] , _ -> if_statement_2 (enot e) loc iffalse falsestop iftrue truestop
205+ | J. Block [] , _ ->
206+ if_statement_2 ~function_end (enot e) loc iffalse falsestop iftrue truestop
206207 | _ , J. Block [] -> [ J. If_statement (e, iftrue, None ), loc ]
207208 | _ -> (
208209 try
@@ -226,7 +227,7 @@ let rec if_statement_2 e loc iftrue truestop iffalse falsestop =
226227 try
227228 let e1 = expression_of_statement iftrue in
228229 let e2 = expression_of_statement iffalse in
229- [ J. Return_statement (Some (J. ECond (e, e1, e2))), loc ]
230+ [ J. Return_statement (Some (J. ECond (e, e1, e2)), function_end () ), loc ]
230231 with Not_expression ->
231232 let truestop, falsestop =
232233 if truestop && falsestop
@@ -247,32 +248,48 @@ let unopt b =
247248 | Some b -> b
248249 | None -> J. Block [] , J. N
249250
250- let if_statement e loc iftrue truestop iffalse falsestop =
251+ let if_statement ~ function_end e loc iftrue truestop iffalse falsestop =
251252 (* FIX: should be done at an earlier stage*)
252253 let e = simplify_condition e in
253254 match iftrue, iffalse with
254255 (* Shared statements *)
255256 | (J. If_statement (e' , iftrue' , iffalse' ), _ ), _ when Poly. (iffalse = unopt iffalse') ->
256- if_statement_2 (J. EBin (J. And , e, e')) loc iftrue' truestop iffalse falsestop
257+ if_statement_2
258+ ~function_end
259+ (J. EBin (J. And , e, e'))
260+ loc
261+ iftrue'
262+ truestop
263+ iffalse
264+ falsestop
257265 | (J. If_statement (e' , iftrue' , iffalse' ), _ ), _ when Poly. (iffalse = iftrue') ->
258266 if_statement_2
267+ ~function_end
259268 (J. EBin (J. And , e, J. EUn (J. Not , e')))
260269 loc
261270 (unopt iffalse')
262271 truestop
263272 iffalse
264273 falsestop
265274 | _ , (J. If_statement (e' , iftrue' , iffalse' ), _ ) when Poly. (iftrue = iftrue') ->
266- if_statement_2 (J. EBin (J. Or , e, e')) loc iftrue truestop (unopt iffalse') falsestop
275+ if_statement_2
276+ ~function_end
277+ (J. EBin (J. Or , e, e'))
278+ loc
279+ iftrue
280+ truestop
281+ (unopt iffalse')
282+ falsestop
267283 | _ , (J. If_statement (e' , iftrue' , iffalse' ), _ ) when Poly. (iftrue = unopt iffalse') ->
268284 if_statement_2
285+ ~function_end
269286 (J. EBin (J. Or , e, J. EUn (J. Not , e')))
270287 loc
271288 iftrue
272289 truestop
273290 iftrue'
274291 falsestop
275- | _ -> if_statement_2 e loc iftrue truestop iffalse falsestop
292+ | _ -> if_statement_2 ~function_end e loc iftrue truestop iffalse falsestop
276293
277294let function_body b =
278295 (* We only check for a return at the end since it is by far the most
@@ -281,7 +298,7 @@ let function_body b =
281298 let rec check l =
282299 match l with
283300 | [] -> false
284- | [ (J. Return_statement None , _) ] -> true
301+ | [ (J. Return_statement ( None , _) , _) ] -> true
285302 | _ :: r -> check r
286303 in
287304 check b
@@ -291,7 +308,7 @@ let function_body b =
291308 let rec remove acc l =
292309 match l with
293310 | [] -> acc
294- | [ (J. Return_statement None , _) ] -> acc
311+ | [ (J. Return_statement ( None , _) , _) ] -> acc
295312 | i :: r -> remove (i :: acc) r
296313 in
297314 List. rev (remove [] b)
0 commit comments