]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/software/components/grafite_parser/grafiteDisambiguator.ml
fixed wrong calculation of free_metas
[helm.git] / helm / software / components / grafite_parser / grafiteDisambiguator.ml
index abe8c1de1f75373c33fbfdf018eaaf3984d4c785..d9de808b019ea796235e551e4c33a591453f02f1 100644 (file)
@@ -37,7 +37,9 @@ exception Unbound_identifier of string
 type choose_uris_callback =
   id:string -> UriManager.uri list -> UriManager.uri list
 
-type choose_interp_callback = (string * string) list list -> int list
+type choose_interp_callback = 
+  string -> int -> 
+    (Token.flocation list * string * string) list list -> int list
 
 let mono_uris_callback ~id =
  if Helm_registry.get_opt_default Helm_registry.get_bool ~default:true
@@ -47,7 +49,7 @@ let mono_uris_callback ~id =
  else
   raise Ambiguous_input
 
-let mono_interp_callback _ = raise Ambiguous_input
+let mono_interp_callback _ _ _ = raise Ambiguous_input
 
 let _choose_uris_callback = ref mono_uris_callback
 let _choose_interp_callback = ref mono_interp_callback
@@ -63,12 +65,10 @@ module Callbacks =
     let interactive_interpretation_choice interp =
       !_choose_interp_callback interp
 
-    let input_or_locate_uri ~(title:string) ?id =
+    let input_or_locate_uri ~(title:string) ?id () = None
       (* Zack: I try to avoid using this callback. I therefore assume that
       * the presence of an identifier that can't be resolved via "locate"
       * query is a syntax error *)
-      let msg = match id with Some id -> id | _ -> "_" in
-      raise (Unbound_identifier msg)
   end
   
 module Disambiguator = Disambiguate.Make (Callbacks)
@@ -80,7 +80,7 @@ let disambiguate_thing ~aliases ~universe
       aliases:DisambiguateTypes.environment ->
       universe:DisambiguateTypes.multiple_environment option ->
       'a -> 'b)
-  ~(drop_aliases: 'b -> 'b)
+  ~(drop_aliases: ?minimize_instances:bool -> 'b -> 'b)
   ~(drop_aliases_and_clear_diff: 'b -> 'b)
   (thing: 'a)
 =
@@ -95,6 +95,8 @@ let disambiguate_thing ~aliases ~universe
       (true, multi_aliases, false);
       (true, mono_aliases, true);
       (true, multi_aliases, true);
+      (true, library, false); 
+        (* for demo to reduce the number of interpretations *)
       (true, library, true);
     ]
   in
@@ -106,7 +108,7 @@ let disambiguate_thing ~aliases ~universe
    if use_mono_aliases && not instances then
     drop_aliases res
    else if user_asked then
-    drop_aliases res (* one shot aliases *)
+    drop_aliases ~minimize_instances:true res (* one shot aliases *)
    else
     drop_aliases_and_clear_diff res
   in
@@ -142,7 +144,7 @@ type disambiguator_thing =
        aliases:DisambiguateTypes.environment ->
        universe:DisambiguateTypes.multiple_environment option ->
        'a -> 'b * bool) ->
-    drop_aliases:('b * bool -> 'b * bool) ->
+    drop_aliases:(?minimize_instances:bool -> 'b * bool -> 'b * bool) ->
     drop_aliases_and_clear_diff:('b * bool -> 'b * bool) -> 'a -> 'b * bool
  }
 
@@ -155,8 +157,39 @@ let disambiguate_thing =
            ~drop_aliases_and_clear_diff) thing
   }
 
-let drop_aliases (choices, user_asked) =
-  (List.map (fun (d, a, b, c) -> d, a, b, c) choices),
+let drop_aliases ?(minimize_instances=false) (choices, user_asked) =
+ let module D = DisambiguateTypes in
+ let minimize d =
+  if not minimize_instances then
+   d
+  else
+   let rec aux =
+    function
+       [] -> []
+     | (D.Symbol (s,n),((descr,_) as ci)) as he::tl when n > 0 ->
+         if
+          List.for_all
+           (function
+               (D.Symbol (s2,_),(descr2,_)) -> s2 <> s || descr = descr2
+             | _ -> true
+           ) d
+         then
+          (D.Symbol (s,0),ci)::(aux tl)
+         else
+          he::(aux tl)
+     | (D.Num n,((descr,_) as ci)) as he::tl when n > 0 ->
+         if
+          List.for_all
+           (function (D.Num _,(descr2,_)) -> descr = descr2 | _ -> true) d
+         then
+          (D.Num 0,ci)::(aux tl)
+         else
+          he::(aux tl)
+      | he::tl -> he::(aux tl)
+   in
+    aux d
+ in
+  (List.map (fun (d, a, b, c) -> minimize d, a, b, c) choices),
   user_asked
 
 let drop_aliases_and_clear_diff (choices, user_asked) =