with Ada.Containers.Hashed_Maps;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Ada.Text_IO; use Ada.Text_IO;
with Libfoolang.Analysis; use Libfoolang.Analysis;
procedure Main is
package Node_Image_Maps is new Ada.Containers.Hashed_Maps
(Key_Type => Foo_Node,
Element_Type => Unbounded_String,
Equivalent_Keys => "=",
Hash => Hash);
Node_Images : Node_Image_Maps.Map;
function Img (Node : Foo_Node) return String
is (To_String (Node_Images.Element (Node)));
procedure Crash_On_Parsing_Error (U : Analysis_Unit);
procedure Build_Node_Images (Prefix : String; Node : Foo_Node);
procedure Check (Left, Right : Foo_Node);
----------------------------
-- Crash_On_Parsing_Error --
----------------------------
procedure Crash_On_Parsing_Error (U : Analysis_Unit) is
begin
if U.Has_Diagnostics then
for D of U.Diagnostics loop
Put_Line (U.Format_GNU_Diagnostic (D));
end loop;
raise Program_Error;
end if;
end Crash_On_Parsing_Error;
-----------------------
-- Build_Node_Images --
-----------------------
procedure Build_Node_Images (Prefix : String; Node : Foo_Node)
is
Filling : constant String := (1 .. 6 - Prefix'Length => ' ');
begin
Node_Images.Insert (Node, To_Unbounded_String (Filling & Prefix));
if not Node.Is_Null then
for I in 1 .. Node.Children_Count loop
declare
Suffix : constant String := I'Image;
begin
Build_Node_Images
(Prefix & Suffix (Suffix'First + 1 .. Suffix'Last),
Node.Child (I));
end;
end loop;
end if;
end Build_Node_Images;
-----------
-- Check --
-----------
procedure Check (Left, Right : Foo_Node) is
begin
Put_Line
("CCP (" & Img (Left) & ", " & Img (Right) & ") = "
& Img (Left.Closest_Common_Parent (Right)));
end Check;
Ctx : constant Analysis_Context := Create_Context;
U1 : constant Analysis_Unit :=
Ctx.Get_From_Buffer ("s1.txt", Buffer => "example");
U2 : constant Analysis_Unit :=
Ctx.Get_From_Buffer
("s2.txt", Buffer => "((example example) (example example))");
U2_N : constant Foo_Node := U2.Root;
U2_N1 : constant Foo_Node := U2_N.As_Cons.F_Left;
U2_N11 : constant Foo_Node := U2_N1.As_Cons.F_Left;
U2_N2 : constant Foo_Node := U2_N.As_Cons.F_Right;
begin
Crash_On_Parsing_Error (U1);
Crash_On_Parsing_Error (U2);
Build_Node_Images ("None", No_Foo_Node);
Build_Node_Images ("U1_N", U1.Root);
Build_Node_Images ("U2_N", U2.Root);
Check (No_Foo_Node, No_Foo_Node);
Check (No_Foo_Node, U1.Root);
Check (U1.Root, No_Foo_Node);
Check (U1.Root, U2.Root);
New_Line;
Check (U2_N, U2_N);
Check (U2_N, U2_N1);
Check (U2_N, U2_N11);
Check (U2_N1, U2_N2);
Check (U2_N1, U2_N11);
Check (U2_N2, U2_N11);
Put_Line ("Done.");
end Main;