Browse Source

add `iter_expr`

Simon Krajewski 9 years ago
parent
commit
38a5392359
1 changed files with 28 additions and 1 deletions
  1. 28 1
      src/syntax/ast.ml

+ 28 - 1
src/syntax/ast.ml

@@ -696,7 +696,6 @@ let unescape s =
 	loop false 0;
 	Buffer.contents b
 
-
 let map_expr loop (e,p) =
 	let opt f o =
 		match o with None -> None | Some v -> Some (f v)
@@ -762,6 +761,34 @@ let map_expr loop (e,p) =
 	) in
 	(e,p)
 
+let iter_expr loop (e,p) =
+	let opt eo = match eo with None -> () | Some e -> loop e in
+	let exprs = List.iter loop in
+	match e with
+	| EConst _ | EContinue | EBreak | EDisplayNew _ | EReturn None -> ()
+	| EParenthesis e1 | EField(e1,_) | EUnop(_,_,e1) | EReturn(Some e1) | EThrow e1 | EMeta(_,e1)
+	| ECheckType(e1,_) | EDisplay(e1,_) | ECast(e1,_) | EUntyped e1 -> loop e1;
+	| EArray(e1,e2) | EBinop(_,e1,e2) | EIn(e1,e2) | EFor(e1,e2) | EWhile(e1,e2,_) | EIf(e1,e2,None) -> loop e1; loop e2;
+	| ETernary(e1,e2,e3) | EIf(e1,e2,Some e3) -> loop e1; loop e2; loop e3;
+	| EArrayDecl el | ENew(_,el) | EBlock el -> List.iter loop el
+	| ECall(e1,el) -> loop e1; exprs el;
+	| EObjectDecl fl -> List.iter (fun (_,e) -> loop e) fl;
+	| ETry(e1,catches) ->
+		loop e1;
+		List.iter (fun (_,_,e) -> loop e) catches
+	| ESwitch(e1,cases,def) ->
+		loop e1;
+		List.iter (fun (el,eg,e) ->
+			exprs el;
+			opt eg;
+			opt e;
+		) cases;
+		(match def with None -> () | Some e -> opt e);
+	| EFunction(_,f) ->
+		List.iter (fun (_,_,_,eo) -> opt eo) f.f_args;
+		opt f.f_expr
+	| EVars vl -> List.iter (fun (_,_,eo) -> opt eo) vl
+
 let s_expr e =
 	let rec s_expr_inner tabs (e,_) =
 		match e with