- []::[]
- ::(remove_non_significant (List.nth errorll 2))
- ::(remove_non_significant (List.nth errorll 3))
- ::[]::[] in
- let choices =
- let pass = ref 0 in
- List.flatten
- (List.map
- (fun l ->
- incr pass;
- List.map
- (fun (env,diff,offset,msg,significant) ->
- offset, [[!pass], [[!pass], env, diff], msg, significant]) l
- ) errorll') 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 *)
- let choices =
- let choices_compare (o1,_) (o2,_) = compare o1 o2 in
- let choices_compare_by_passes (p1,_,_,_) (p2,_,_,_) =
- compare p1 p2 in
- let rec uniq =
- function
- [] -> []
- | h::[] -> [h]
- | (o1,res1)::(o2,res2)::tl when o1 = o2 ->
- let merge_by_name errors =
- let merge_by_env errors =
- let choices_compare_by_env (_,e1,_) (_,e2,_) = compare e1 e2 in
- let choices_compare_by_passes (p1,_,_) (p2,_,_) =
- compare p1 p2 in
- let rec uniq_by_env =
- function
- [] -> []
- | h::[] -> [h]
- | (p1,e1,_)::(p2,e2,d2)::tl when e1 = e2 ->
- uniq_by_env ((p1@p2,e2,d2) :: tl)
- | h1::tl -> h1 :: uniq_by_env tl
- in
- List.sort choices_compare_by_passes
- (uniq_by_env (List.stable_sort choices_compare_by_env errors))
- in
- let choices_compare_by_msg (_,_,m1,_) (_,_,m2,_) =
- compare (Lazy.force m1) (Lazy.force m2) in
- let rec uniq_by_msg =
- function
- [] -> []
- | h::[] -> [h]
- | (p1,i1,m1,s1)::(p2,i2,m2,s2)::tl
- when Lazy.force m1 = Lazy.force m2 && s1 = s2 ->
- uniq_by_msg ((p1@p2,merge_by_env (i1@i2),m2,s2) :: tl)
- | h1::tl -> h1 :: uniq_by_msg tl
- in
- List.sort choices_compare_by_msg
- (uniq_by_msg (List.stable_sort choices_compare_by_msg errors))
- in
- let res = merge_by_name (res1@res2) in
- uniq ((o1,res) :: tl)
- | h1::tl -> h1 :: uniq tl
+ let res =
+ (1,[])::(2,[])
+ ::(3,remove_non_significant (safe_list_nth errorll 2))
+ ::(4,remove_non_significant (safe_list_nth errorll 3))
+ ::(5,[])::(6,[])::[]
+ in
+ if List.flatten (List.map snd res) <> [] then res
+ else
+ (* all errors (if any) are not significant: we keep them *)
+ let res =
+ (1,[])::(2,[])
+ ::(3,(safe_list_nth errorll 2))
+ ::(4,(safe_list_nth errorll 3))
+ ::(5,[])::(6,[])::[]
+ in
+ if List.flatten (List.map snd res) <> [] then
+ begin
+ HLog.warn
+ "All disambiguation errors are not significant. Showing them anyway." ;
+ res
+ end
+ else
+ begin
+ HLog.warn
+ "No errors in phases 2 and 3. Showing all errors in all phases" ;
+ annotated_errorll ()
+ end