Release coccinelle-0.1.11rc1
[bpt/coccinelle.git] / parsing_cocci / iso_pattern.ml
index 632c01a..199c8a9 100644 (file)
@@ -1,23 +1,23 @@
 (*
-* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen
-* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller
-* 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-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.
+ *
+ * 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.
+ *)
 
 
 (* Potential problem: offset of mcode is not updated when an iso is
@@ -44,11 +44,12 @@ type isomorphism =
 
 let strip_info =
   let mcode (term,_,_,_,_,_) =
-    (term,Ast0.NONE,Ast0.default_info(),Ast0.PLUS,ref Ast0.NoMetaPos,-1) in
+    (term,Ast0.NONE,Ast0.default_info(),Ast0.PLUS Ast.ONE,
+     ref Ast0.NoMetaPos,-1) in
   let donothing r k e =
     let x = k e in
     {(Ast0.wrap (Ast0.unwrap x)) with
-      Ast0.mcodekind = ref Ast0.PLUS;
+      Ast0.mcodekind = ref (Ast0.PLUS Ast.ONE);
       Ast0.true_if_test = x.Ast0.true_if_test} in
   V0.flat_rebuilder
     mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode mcode
@@ -290,7 +291,7 @@ let rec is_pure_context s =
              (match Ast.unwrap s with
                Ast.IfThen(_,_,_) -> false (* potentially dangerous *)
              | _ -> true)
-         |     (_,_) -> false)
+         | (_,_) -> false)
       | _ -> false))
 
 let is_minus e =
@@ -1222,7 +1223,7 @@ let make_minus =
            mcodekind := Ast0.MINUS(ref([],Ast0.default_token_info))
        | _ -> failwith "make_minus: unexpected befaft")
     | Ast0.MINUS(_mc) -> () (* in the part copied from the src term *)
-    | Ast0.PLUS -> failwith "make_minus donothing: unexpected plus mcodekind"
+    | Ast0.PLUS -> failwith "make_minus donothing: unexpected plus mcodekind"
     | _ -> failwith "make_minus donothing: unexpected mcodekind" in
 
   let donothing r k e =
@@ -1330,12 +1331,12 @@ let make_minus =
 let rebuild_mcode start_line =
   let copy_mcodekind = function
       Ast0.CONTEXT(mc) -> Ast0.CONTEXT(ref (!mc))
-    | Ast0.MINUS(mc) -> Ast0.MINUS(ref (!mc))
-    | Ast0.MIXED(mc) -> Ast0.MIXED(ref (!mc))
-    | Ast0.PLUS ->
+    | Ast0.MINUS(mc) ->   Ast0.MINUS(ref (!mc))
+    | Ast0.MIXED(mc) ->   Ast0.MIXED(ref (!mc))
+    | Ast0.PLUS count ->
        (* this function is used elsewhere where we need to rebuild the
           indices, and so we allow PLUS code as well *)
-        Ast0.PLUS in
+        Ast0.PLUS count in
 
   let mcode (term,arity,info,mcodekind,pos,adj) =
     let info =
@@ -1644,8 +1645,8 @@ let instantiate bindings mv_bindings =
                        (Ast0.get_mcode_mcodekind op) ->
                          k e1
                  | Ast0.Edots(_,_) -> k (Ast0.rewrap e (Ast0.unwrap res))
-                 | Ast0.Paren(lp,e,rp) ->
-                     negate e e
+                 | Ast0.Paren(lp,e1,rp) ->
+                     negate e e1
                        (function x ->
                          k (Ast0.rewrap res (Ast0.Paren(lp,x,rp))))
                  | Ast0.Binary(e1,op,e2) when
@@ -1847,33 +1848,38 @@ let merge_plus model_mcode e_mcode =
          let merged =
            match (mba,eba) with
              (x,Ast.NOTHING) | (Ast.NOTHING,x) -> x
-           | (Ast.BEFORE(b1),Ast.BEFORE(b2)) -> Ast.BEFORE(b1@b2)
-           | (Ast.BEFORE(b),Ast.AFTER(a)) -> Ast.BEFOREAFTER(b,a)
-           | (Ast.BEFORE(b1),Ast.BEFOREAFTER(b2,a)) ->
-               Ast.BEFOREAFTER(b1@b2,a)
-           | (Ast.AFTER(a),Ast.BEFORE(b)) -> Ast.BEFOREAFTER(b,a)
-           | (Ast.AFTER(a1),Ast.AFTER(a2)) ->Ast.AFTER(a2@a1)
-           | (Ast.AFTER(a1),Ast.BEFOREAFTER(b,a2)) -> Ast.BEFOREAFTER(b,a2@a1)
-           | (Ast.BEFOREAFTER(b1,a),Ast.BEFORE(b2)) ->
-               Ast.BEFOREAFTER(b1@b2,a)
-           | (Ast.BEFOREAFTER(b,a1),Ast.AFTER(a2)) ->
-               Ast.BEFOREAFTER(b,a2@a1)
-           | (Ast.BEFOREAFTER(b1,a1),Ast.BEFOREAFTER(b2,a2)) ->
-                Ast.BEFOREAFTER(b1@b2,a2@a1) in
+           | (Ast.BEFORE(b1,it1),Ast.BEFORE(b2,it2)) ->
+               Ast.BEFORE(b1@b2,Ast.lub_count it1 it2)
+           | (Ast.BEFORE(b,it1),Ast.AFTER(a,it2)) ->
+               Ast.BEFOREAFTER(b,a,Ast.lub_count it1 it2)
+           | (Ast.BEFORE(b1,it1),Ast.BEFOREAFTER(b2,a,it2)) ->
+               Ast.BEFOREAFTER(b1@b2,a,Ast.lub_count it1 it2)
+           | (Ast.AFTER(a,it1),Ast.BEFORE(b,it2)) ->
+               Ast.BEFOREAFTER(b,a,Ast.lub_count it1 it2)
+           | (Ast.AFTER(a1,it1),Ast.AFTER(a2,it2)) ->
+               Ast.AFTER(a2@a1,Ast.lub_count it1 it2)
+           | (Ast.AFTER(a1,it1),Ast.BEFOREAFTER(b,a2,it2)) ->
+               Ast.BEFOREAFTER(b,a2@a1,Ast.lub_count it1 it2)
+           | (Ast.BEFOREAFTER(b1,a,it1),Ast.BEFORE(b2,it2)) ->
+               Ast.BEFOREAFTER(b1@b2,a,Ast.lub_count it1 it2)
+           | (Ast.BEFOREAFTER(b,a1,it1),Ast.AFTER(a2,it2)) ->
+               Ast.BEFOREAFTER(b,a2@a1,Ast.lub_count it1 it2)
+           | (Ast.BEFOREAFTER(b1,a1,it1),Ast.BEFOREAFTER(b2,a2,it2)) ->
+                Ast.BEFOREAFTER(b1@b2,a2@a1,Ast.lub_count it1 it2) in
          emc := (merged,tb,ta)
       |        Ast0.MINUS(emc) ->
          let (anything_bef_aft,_,_) = !mc in
          let (anythings,t) = !emc in
          emc :=
            (match anything_bef_aft with
-             Ast.BEFORE(b) -> (b@anythings,t)
-           | Ast.AFTER(a) -> (anythings@a,t)
-           | Ast.BEFOREAFTER(b,a) -> (b@anythings@a,t)
+             Ast.BEFORE(b,_) -> (b@anythings,t)
+           | Ast.AFTER(a,_) -> (anythings@a,t)
+           | Ast.BEFOREAFTER(b,a,_) -> (b@anythings@a,t)
            | Ast.NOTHING -> (anythings,t))
       | Ast0.MIXED(_) -> failwith "how did this become mixed?"
       |        _ -> failwith "not possible 7")
   | Ast0.MIXED(_) -> failwith "not possible 8"
-  | Ast0.PLUS -> failwith "not possible 9"
+  | Ast0.PLUS -> failwith "not possible 9"
 
 let copy_plus printer minusify model e =
   if !Flag.sgrep_mode2
@@ -1895,7 +1901,7 @@ let copy_minus printer minusify model e =
       if !Flag.sgrep_mode2
       then e
       else failwith "not possible 8"
-  | Ast0.PLUS -> failwith "not possible 9"
+  | Ast0.PLUS -> failwith "not possible 9"
 
 let whencode_allowed prev_ecount prev_icount prev_dcount
     ecount icount dcount rest =