(*
- * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen
+ * Copyright 2010, INRIA, University of Copenhagen
+ * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix
+ * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix
* This file is part of Coccinelle.
*
let astfvident recursor k i =
bind (k i)
(match Ast.unwrap i with
- Ast.MetaId(name,_,_,_) | Ast.MetaFunc(name,_,_,_)
- | Ast.MetaLocalFunc(name,_,_,_) -> [metaid name]
+ Ast.MetaId(name,idconstraint,_,_) | Ast.MetaFunc(name,idconstraint,_,_)
+ | Ast.MetaLocalFunc(name,idconstraint,_,_) ->
+ let metas =
+ if include_constraints
+ then
+ match idconstraint with
+ Ast.IdNegIdSet (_,metas) -> metas
+ | _ -> []
+ else [] in
+ bind (List.rev metas) [metaid name]
| _ -> option_default) in
let rec type_collect res = function
let astfvexpr recursor k e =
bind (k e)
(match Ast.unwrap e with
- Ast.MetaExpr(name,_,_,Some type_list,_,_) ->
+ Ast.MetaExpr(name,constraints,_,Some type_list,_,_) ->
let types = List.fold_left type_collect option_default type_list in
- bind [metaid name] types
- | Ast.MetaErr(name,_,_,_) | Ast.MetaExpr(name,_,_,_,_,_) -> [metaid name]
+ let extra =
+ if include_constraints
+ then
+ match constraints with
+ Ast.SubExpCstrt l -> l
+ | _ -> []
+ else [] in
+ bind extra (bind [metaid name] types)
+ | Ast.MetaErr(name,constraints,_,_)
+ | Ast.MetaExpr(name,constraints,_,_,_,_) ->
+ let extra =
+ if include_constraints
+ then
+ match constraints with
+ Ast.SubExpCstrt l -> l
+ | _ -> []
+ else [] in
+ bind extra [metaid name]
| Ast.MetaExprList(name,None,_,_) -> [metaid name]
| Ast.MetaExprList(name,Some (lenname,_,_),_,_) ->
[metaid name;metaid lenname]
[] -> []
| (metavars, rule)::rules ->
match rule with
- Ast.ScriptRule (_,_,_,_)
- | Ast.InitialScriptRule (_,_,_) | Ast.FinalScriptRule (_,_,_) ->
+ Ast.ScriptRule (_,_,_,_,_)
+ | Ast.InitialScriptRule (_,_,_,_) | Ast.FinalScriptRule (_,_,_,_) ->
(* bound stays as is because script rules have no names, so no
inheritance is possible *)
rule::(loop bound rules)
used_after in
let free_vars =
match r with
- Ast.ScriptRule (_,_,mv,_) ->
- drop_virt(List.map (function (_,(r,v)) -> (r,v)) mv)
- | Ast.InitialScriptRule (_,_,_) | Ast.FinalScriptRule (_,_,_) -> []
+ Ast.ScriptRule (_,_,_,mv,_) ->
+ drop_virt(List.map (function (_,(r,v),_) -> (r,v)) mv)
+ | Ast.InitialScriptRule (_,_,_,_)
+ | Ast.FinalScriptRule (_,_,_,_) -> []
| Ast.CocciRule (_,_,rule,_,_) ->
drop_virt
(Common.union_set (nub (collect_all_rule_refs rule))
(function (metavars,r) ->
function used_after ->
match r with
- Ast.ScriptRule (_,_,_,_)
- | Ast.InitialScriptRule (_,_,_) | Ast.FinalScriptRule (_,_,_) ->
+ Ast.ScriptRule (_,_,_,_,_)
+ | Ast.InitialScriptRule (_,_,_,_) | Ast.FinalScriptRule (_,_,_,_) ->
([], [used_after], [], [])
| Ast.CocciRule (name, rule_info, minirules, _,_) ->
collect_local_used_after metavars minirules used_after