Release coccinelle-0.2.5-rc2
[bpt/coccinelle.git] / parsing_cocci / ast_cocci.ml
index 1446b48..5d3f26d 100644 (file)
@@ -1,27 +1,7 @@
 (*
- * Copyright 2005-2010, 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.
- *
- * Coccinelle is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, according to version 2 of the License.
- *
- * Coccinelle is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with Coccinelle.  If not, see <http://www.gnu.org/licenses/>.
- *
- * The authors reserve the right to distribute this or future versions of
- * Coccinelle under other licenses.
- *)
-
-
-(*
- * 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.
  *
@@ -66,6 +46,8 @@ type 'a wrap =
       (* the following is for or expressions *)
       pos_info : meta_name mcode option; (* pos info, try not to duplicate *)
       true_if_test_exp : bool;(* true if "test_exp from iso", only for exprs *)
+      (* the following is only for declarations *)
+      safe_for_multi_decls : bool;
       (* isos relevant to the term; ultimately only used for rule_elems *)
       iso_info : (string*anything) list }
 
@@ -81,7 +63,7 @@ and 'a mcode = 'a * info * mcodekind * meta_pos (* pos variable *)
     (* int list is the match instances, which are only meaningful in annotated
        C code *)
     (* int is the adjacency index, which is incremented on context dots *)
-(* iteration is only allowed on contect code, the intuition vaguely being
+(* iteration is only allowed on context code, the intuition vaguely being
 that there is no way to replace something more than once.  Actually,
 allowing iterated additions on minus code would cause problems with some
 heuristics for adding braces, because one couldn't identify simple
@@ -123,7 +105,7 @@ and metavar =
   | MetaInitDecl of arity * meta_name (* name *)
   | MetaListlenDecl of meta_name (* name *)
   | MetaParamDecl of arity * meta_name (* name *)
-  | MetaParamListDecl of arity * meta_name (*name*) * meta_name option (*len*)
+  | MetaParamListDecl of arity * meta_name (*name*) * list_len (*len*)
   | MetaConstDecl of
       arity * meta_name (* name *) * Type_cocci.typeC list option
   | MetaErrDecl of arity * meta_name (* name *)
@@ -133,7 +115,9 @@ and metavar =
       arity * meta_name (* name *) * Type_cocci.typeC list option
   | MetaLocalIdExpDecl of
       arity * meta_name (* name *) * Type_cocci.typeC list option
-  | MetaExpListDecl of arity * meta_name (*name*) * meta_name option (*len*)
+  | MetaExpListDecl of arity * meta_name (*name*) * list_len (*len*)
+  | MetaDeclDecl of arity * meta_name (* name *)
+  | MetaFieldDecl of arity * meta_name (* name *)
   | MetaStmDecl of arity * meta_name (* name *)
   | MetaStmListDecl of arity * meta_name (* name *)
   | MetaFuncDecl of arity * meta_name (* name *)
@@ -142,6 +126,8 @@ and metavar =
   | MetaDeclarerDecl of arity * meta_name (* name *)
   | MetaIteratorDecl of arity * meta_name (* name *)
 
+and list_len = AnyLen | MetaLen of meta_name | CstLen of int
+
 and seed = NoVal | StringSeed of string | ListSeed of seed_elem list
 and seed_elem = SeedString of string | SeedId of meta_name
 
@@ -206,7 +192,7 @@ and base_expression =
                      inherited
   | MetaExpr       of meta_name mcode * constraints * keep_binding *
                      Type_cocci.typeC list option * form * inherited
-  | MetaExprList   of meta_name mcode * listlen option * keep_binding *
+  | MetaExprList   of meta_name mcode * listlen * keep_binding *
                       inherited (* only in arg lists *)
 
   | EComma         of string mcode (* only in arg lists *)
@@ -248,7 +234,10 @@ and form = ANY | ID | LocalID | CONST (* form for MetaExp *)
 
 and expression = base_expression wrap
 
-and listlen = meta_name mcode * keep_binding * inherited
+and listlen =
+    MetaListLen of meta_name mcode * keep_binding * inherited
+  | CstListLen of int
+  | AnyListLen
 
 and  unaryOp = GetRef | DeRef | UnPlus |  UnMinus | Tilde | Not
 and  assignOp = SimpleAssign | OpAssign of arithOp
@@ -290,7 +279,9 @@ and base_typeC =
 
   | Array           of fullType * string mcode (* [ *) *
                       expression option * string mcode (* ] *)
-  | EnumName        of string mcode (*enum*) * ident (* name *)
+  | EnumName        of string mcode (*enum*) * ident option (* name *)
+  | EnumDef  of fullType (* either EnumName or metavar *) *
+       string mcode (* { *) * expression dots * string mcode (* } *)
   | StructUnionName of structUnion mcode * ident option (* name *)
   | StructUnionDef  of fullType (* either StructUnionName or metavar *) *
        string mcode (* { *) * declaration dots * string mcode (* } *)
@@ -302,7 +293,7 @@ and fullType = base_fullType wrap
 and typeC = base_typeC wrap
 
 and baseType = VoidType | CharType | ShortType | IntType | DoubleType
-  | FloatType | LongType | LongLongType
+  | FloatType | LongType | LongLongType | SizeType | SSizeType | PtrDiffType
 
 and structUnion = Struct | Union
 
@@ -329,6 +320,7 @@ and base_declaration =
   | Ddots    of string mcode (* ... *) * declaration option (* whencode *)
 
   | MetaDecl of meta_name mcode * keep_binding * inherited
+  | MetaField of meta_name mcode * keep_binding * inherited
 
   | OptDecl    of declaration
   | UniqueDecl of declaration
@@ -341,7 +333,9 @@ and declaration = base_declaration wrap
 and base_initialiser =
     MetaInit of meta_name mcode * keep_binding * inherited
   | InitExpr of expression
-  | InitList of string mcode (*{*) * initialiser list * string mcode (*}*) *
+  | ArInitList of string mcode (*{*) * initialiser dots * string mcode (*}*)
+  | StrInitList of bool (* true if all are - *) *
+        string mcode (*{*) * initialiser list * string mcode (*}*) *
        initialiser list (* whencode: elements that shouldn't appear in init *)
   | InitGccExt of
       designator list (* name *) * string mcode (*=*) *
@@ -349,6 +343,7 @@ and base_initialiser =
   | InitGccName of ident (* name *) * string mcode (*:*) *
        initialiser
   | IComma of string mcode (* , *)
+  | Idots  of string mcode (* ... *) * initialiser option (* whencode *)
 
   | OptIni    of initialiser
   | UniqueIni of initialiser
@@ -370,8 +365,7 @@ and base_parameterTypeDef =
   | Param         of fullType * ident option
 
   | MetaParam     of meta_name mcode * keep_binding * inherited
-  | MetaParamList of meta_name mcode * listlen option * keep_binding *
-                    inherited
+  | MetaParamList of meta_name mcode * listlen * keep_binding * inherited
 
   | PComma        of string mcode
 
@@ -472,6 +466,7 @@ and base_rule_elem =
   | Ty            of fullType (* only at SP top level, matches a subterm *)
   | TopInit       of initialiser (* only at top level *)
   | Include       of string mcode (*#include*) * inc_file mcode (*file *)
+  | Undef         of string mcode (* #define *) * ident (* name *)
   | DefineHeader  of string mcode (* #define *) * ident (* name *) *
                     define_parameters (*params*)
   | Case          of string mcode (* case *) * expression * string mcode (*:*)
@@ -574,9 +569,12 @@ and rulename =
        string list * string list * exists * bool
   | GeneratedRulename of string option * dependency *
        string list * string list * exists * bool
-  | ScriptRulename of string * dependency
-  | InitialScriptRulename of string * dependency
-  | FinalScriptRulename of string * dependency
+  | ScriptRulename of string option (* name *) * string (* language *) *
+       dependency
+  | InitialScriptRulename of string option (* name *) * string (* language *) *
+       dependency
+  | FinalScriptRulename of string option (* name *) * string (* language *) *
+       dependency
 
 and ruletype = Normal | Generated
 
@@ -584,9 +582,17 @@ and rule =
     CocciRule of string (* name *) *
        (dependency * string list (* dropped isos *) * exists) * top_level list
        * bool list * ruletype
-  | ScriptRule of string * dependency * (string * meta_name) list * string
-  | InitialScriptRule of string (*language*) * dependency * string (*code*)
-  | FinalScriptRule of string (*language*) * dependency * string (*code*)
+  | ScriptRule of string (* name *) *
+      (* metaname for python (untyped), metavar for ocaml (typed) *)
+      string * dependency *
+       (script_meta_name * meta_name * metavar) list (*inherited vars*) *
+       meta_name list (*script vars*) * string
+  | InitialScriptRule of  string (* name *) *
+       string (*language*) * dependency * string (*code*)
+  | FinalScriptRule of  string (* name *) *
+       string (*language*) * dependency * string (*code*)
+
+and script_meta_name = string option (*string*) * string option (*ast*)
 
 and dependency =
     Dep of string (* rule applies for the current binding *)
@@ -670,8 +676,9 @@ let get_dots_bef_aft x     = x.bef_aft
 let set_dots_bef_aft d x   = {x with bef_aft = d}
 let get_pos x              = x.pos_info
 let set_pos x pos          = {x with pos_info = pos}
-let get_test_exp x      = x.true_if_test_exp
-let set_test_exp x      = {x with true_if_test_exp = true}
+let get_test_exp x         = x.true_if_test_exp
+let set_test_exp x         = {x with true_if_test_exp = true}
+let get_safe_decl x        = x.safe_for_multi_decls
 let get_isos x             = x.iso_info
 let set_isos x isos        = {x with iso_info = isos}
 let get_pos_var (_,_,_,p)  = p
@@ -705,6 +712,8 @@ let get_meta_name = function
   | MetaIdExpDecl(ar,nm,ty) -> nm
   | MetaLocalIdExpDecl(ar,nm,ty) -> nm
   | MetaExpListDecl(ar,nm,nm1) -> nm
+  | MetaDeclDecl(ar,nm) -> nm
+  | MetaFieldDecl(ar,nm) -> nm
   | MetaStmDecl(ar,nm) -> nm
   | MetaStmListDecl(ar,nm) -> nm
   | MetaFuncDecl(ar,nm) -> nm
@@ -764,6 +773,7 @@ let make_term x =
     bef_aft = NoDots;
     pos_info = None;
     true_if_test_exp = false;
+    safe_for_multi_decls = false;
     iso_info = [] }
 
 let make_meta_rule_elem s d (fvs,fresh,inh) =