]> matita.cs.unibo.it Git - helm.git/commitdiff
- Disambiguation error exception enriched with more information
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Wed, 18 Oct 2006 15:06:03 +0000 (15:06 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Wed, 18 Oct 2006 15:06:03 +0000 (15:06 +0000)
  (the same returned in case of correct disambiguation)
- The disambiguation error interface now shows the complete environment
  in which the error occurs. I am not sure if this is better or worst than
  showing only the diffs.

components/cic_disambiguation/disambiguate.ml
components/cic_disambiguation/disambiguate.mli
components/grafite_parser/grafiteDisambiguate.ml
components/grafite_parser/grafiteDisambiguator.ml
components/grafite_parser/grafiteDisambiguator.mli
matita/matitaExcPp.ml
matita/matitaGui.ml

index 352b043a4df4704ff8d6b288efbfca16ac77e418..04357ef92ac1e3e3e52ca48b461ecfcdaad2b662 100644 (file)
@@ -32,7 +32,10 @@ open UriManager
 
 (* the integer is an offset to be added to each location *)
 exception NoWellTypedInterpretation of
- int * ((DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list * Token.flocation option * string Lazy.t) list
+ int *
+ ((Token.flocation list * string * string) list *
+  (DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
+  Token.flocation option * string Lazy.t) list
 exception PathNotWellFormed
 
   (** raised when an environment is not enough informative to decide *)
@@ -945,7 +948,8 @@ in refine_profiler.HExtlib.profile foo ()
             (match test_env aliases [] base_univ with
             | Ok (thing, metasenv),new_univ -> 
                [ aliases, diff, metasenv, thing, new_univ ], []
-            | Ko (loc,msg),_ | Uncertain (loc,msg),_ -> [],[diff,loc,msg])
+            | Ko (loc,msg),_
+            | Uncertain (loc,msg),_ -> [],[aliases,diff,loc,msg])
         | (locs,item) :: remaining_dom ->
             debug_print (lazy (sprintf "CHOOSED ITEM: %s"
              (string_of_domain_item item)));
@@ -955,7 +959,7 @@ in refine_profiler.HExtlib.profile foo ()
               | Some choices -> choices in
             match choices with
                [] ->
-                [], [diff,
+                [], [aliases, diff,
                      Some (List.hd locs),
                      lazy ("No choices for " ^ string_of_domain_item item)]
              | [codomain_item] ->
@@ -986,11 +990,11 @@ in refine_profiler.HExtlib.profile foo ()
                             remaining_dom new_univ)
                     | Uncertain (loc,msg),new_univ ->
                         (match remaining_dom with
-                        | [] -> [], [new_diff,loc,msg]
+                        | [] -> [], [new_env,new_diff,loc,msg]
                         | _ ->
                            aux new_env new_diff lookup_in_todo_dom
                             remaining_dom new_univ)
-                    | Ko (loc,msg),_ -> [], [new_diff,loc,msg])
+                    | Ko (loc,msg),_ -> [], [new_env,new_diff,loc,msg])
              | _::_ ->
                let rec filter univ = function 
                 | [] -> [],[]
@@ -1007,11 +1011,11 @@ in refine_profiler.HExtlib.profile foo ()
                           filter univ tl
                     | Uncertain (loc,msg),new_univ ->
                         (match remaining_dom with
-                        | [] -> [],[new_diff,loc,msg]
+                        | [] -> [],[new_env,new_diff,loc,msg]
                         | _ -> aux new_env new_diff None remaining_dom new_univ
                         ) @@ 
                           filter univ tl
-                    | Ko (loc,msg),_ -> ([],[new_diff,loc,msg]) @@ filter univ tl)
+                    | Ko (loc,msg),_ -> ([],[new_env,new_diff,loc,msg]) @@ filter univ tl)
                in
                 filter base_univ choices
       in
@@ -1019,7 +1023,26 @@ in refine_profiler.HExtlib.profile foo ()
       try
         let res =
          match aux aliases [] None todo_dom base_univ with
-         | [],errors -> raise (NoWellTypedInterpretation (0,errors))
+         | [],errors ->
+            let errors =
+             List.map
+              (fun (env,diff,loc,msg) ->
+                let env' =
+                 HExtlib.filter_map
+                   (fun (locs,domain_item) ->
+                     try
+                      let description =
+                       fst (Environment.find domain_item env)
+                      in
+                       Some (locs,descr_of_domain_item domain_item,description)
+                     with
+                      Not_found -> None)
+                   thing_dom
+                in
+                 env',diff,loc,msg
+              ) errors
+            in
+             raise (NoWellTypedInterpretation (0,errors))
          | [_,diff,metasenv,t,ugraph],_ ->
              debug_print (lazy "SINGLE INTERPRETATION");
              [diff,metasenv,t,ugraph], false
index 88162df7bfdff900564f179a1008ad97950c68ac..4a8f90b00303eeb771c6cb15e5739992e1ca3e78 100644 (file)
 
 (* the integer is an offset to be added to each location *)
 exception NoWellTypedInterpretation of
- int * ((DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list * Token.flocation option * string Lazy.t) list
+ int *
+ ((Token.flocation list * string * string) list *
+  (DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
+  Token.flocation option * string Lazy.t) list
 exception PathNotWellFormed
 
 val interpretate_path :
index e9dc23328f338fb5b184552638b636bb74e27c3c..9a4cb472d75517b3742b956a3b2a2ec9c0580d28 100644 (file)
@@ -157,7 +157,7 @@ let disambiguate_tactic
                     metasenv,(GrafiteAst.Type (uri, tyno) :: types)
                 | _ ->
                   raise (GrafiteDisambiguator.DisambiguationError
-                   (0,[[[],None,lazy "Decompose works only on inductive types"]])))
+                   (0,[[[],[],None,lazy "Decompose works only on inductive types"]])))
         in
         let metasenv,types =
          List.fold_left disambiguate (metasenv,[]) types
index ee156674f0a6abe284b21babb08b34467801891f..2c38dd8a9adb24904afcb86c60a5746f3026fb52 100644 (file)
@@ -30,8 +30,10 @@ open Printf
 exception Ambiguous_input
 (* the integer is an offset to be added to each location *)
 exception DisambiguationError of
- int * ((DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
- Token.flocation option * string Lazy.t) list list
+ int *
+ ((Token.flocation list * string * string) list *
+  (DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
+  Token.flocation option * string Lazy.t) list list
   (** parameters are: option name, error message *)
 exception Unbound_identifier of string
 
index 78b0353d8c1b4391d6aed0dc149fe689e9dc7d49..1b63690d77838c380877c89f80c7da5543bfeb55 100644 (file)
 exception Ambiguous_input
 (* the integer is an offset to be added to each location *)
 exception DisambiguationError of
- int * ((DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
- Token.flocation option * string Lazy.t) list list
+ int *
+ ((Token.flocation list * string * string) list *
+  (DisambiguateTypes.domain_item * DisambiguateTypes.codomain_item) list *
+  Token.flocation option * string Lazy.t) list list
+  (** parameters are: option name, error message *)
 
 (** initially false; for debugging only (???) *)
 val only_one_pass: bool ref
index f378e99b0e0c54d65d8528506a71c5a8ce630955..a314556bd19dfbdca87c6fa1eede5e24bce14ee3 100644 (file)
@@ -71,7 +71,7 @@ let rec to_string =
        | phase::tl ->
           let msg =
            String.concat "\n\n\n"
-            (List.map (fun (_,floc,msg) ->
+            (List.map (fun (_,_,floc,msg) ->
               let loc_descr =
                match floc with
                   None -> ""
@@ -88,7 +88,7 @@ let rec to_string =
              (aux (n+1) (msg,[n]) tl) in
      let loc =
       match errorll with
-         ((_,Some floc,_)::_)::_ ->
+         ((_,_,Some floc,_)::_)::_ ->
           let (x, y) = HExtlib.loc_of_floc floc in
           let x = x + offset in
           let y = y + offset in
index ec9cea5312f7befb064f761ee5f8e5253ab90c9b..50c55619e30f41dfbc82733e2152adb0944e957a 100644 (file)
@@ -150,26 +150,27 @@ class interpErrorModel =
           let idx = ref 0 in
           fun interp ->
             try
-              List.assoc "0" interp
+             let _,_,y = List.find (fun (_,x,y) -> x="0") interp in y
             with Not_found ->
               incr idx; string_of_int !idx
         in
         tree_store#clear ();
         let idx = ref ~-1 in
         List.iter
-          (fun _,interp,_,_ ->
+          (fun pass,env,_,_,_ ->
             incr idx;
             let interp_row = tree_store#append () in
             tree_store#set ~row:interp_row ~column:id_col
-              (name_of_interp interp);
+              ("Pass " ^ string_of_int pass ^
+               "; Interpretation " ^ name_of_interp env);
             tree_store#set ~row:interp_row ~column:interp_no_col !idx;
             List.iter
-              (fun (id, dsc) ->
+              (fun (_, id, dsc) ->
                 let row = tree_store#append ~parent:interp_row () in
                 tree_store#set ~row ~column:id_col id;
                 tree_store#set ~row ~column:dsc_col dsc;
                 tree_store#set ~row ~column:interp_no_col !idx)
-              interp)
+              env)
           choices
 
       method get_interp_no tree_path =
@@ -184,21 +185,15 @@ let rec interactive_error_interp ?(all_passes=false) source_buffer notify_exn
   let errorll' =
    if all_passes then errorll else List.rev (List.tl (List.tl (List.rev errorll))) in
   let choices =
+   let pass = ref 0 in
    List.flatten
     (List.map
-      (List.map
-        (fun (choices,offset,msg) ->
-          let textual_choices =
-           List.map
-            (fun (dom,(descr,_)) ->
-              DisambiguateTypes.string_of_domain_item dom, descr
-            ) choices
-          in
-           choices, textual_choices, offset, msg
-        )
+      (fun l ->
+        incr pass;
+        List.map (fun (env,diff,offset,msg) -> !pass, env, diff, offset, msg) l
       ) errorll') in
-  let choices_eq (_,c1,_,_) (_,c2,_,_) = c1 = c2 in
-  let choices_compare (_,c1,_,_) (_,c2,_,_) = compare c1 c2 in
+  let choices_eq (_,e1,_,_,_) (_,e2,_,_,_) = e1 = e2 in
+  let choices_compare (_,e1,_,_,_) (_,e2,_,_,_) = compare e1 e2 in
   (* Here we are doing a stable sort and list_uniq returns the latter
      "equal" element. I.e. we are showing the error corresponding to the
      most advanced disambiguation pass *)
@@ -208,10 +203,10 @@ let rec interactive_error_interp ?(all_passes=false) source_buffer notify_exn
   in
    match choices with
       [] -> assert false
-    | [interp,_,loffset,msg] ->
+    | [_,env,diff,loffset,msg] ->
         notify_exn
          (GrafiteDisambiguator.DisambiguationError
-           (offset,[[interp,loffset,msg]]));
+           (offset,[[env,diff,loffset,msg]]));
     | _::_ ->
        let dialog = new disambiguationErrors () in
        dialog#check_widgets ();
@@ -226,7 +221,7 @@ let rec interactive_error_interp ?(all_passes=false) source_buffer notify_exn
             None -> assert false
          | Some tp -> tp in
         let idx = model#get_interp_no tree_path in
-        let interp,_,loffset,msg = List.nth choices idx in
+        let _,env,diff,loffset,msg = List.nth choices idx in
         let script = MatitaScript.current () in
         let error_tag = script#error_tag in
          source_buffer#remove_tag error_tag
@@ -234,7 +229,7 @@ let rec interactive_error_interp ?(all_passes=false) source_buffer notify_exn
            ~stop:source_buffer#end_iter;
          notify_exn
           (GrafiteDisambiguator.DisambiguationError
-            (offset,[[interp,loffset,msg]]))
+            (offset,[[env,diff,loffset,msg]]))
          ));
        let return _ =
          dialog#disambiguationErrors#destroy ();