diff options
Diffstat (limited to 'gcc/ada/prj-pp.adb')
-rw-r--r-- | gcc/ada/prj-pp.adb | 334 |
1 files changed, 196 insertions, 138 deletions
diff --git a/gcc/ada/prj-pp.adb b/gcc/ada/prj-pp.adb index d318c1192c5..e03146ce4a6 100644 --- a/gcc/ada/prj-pp.adb +++ b/gcc/ada/prj-pp.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2001-2009, Free Software Foundation, Inc. -- +-- Copyright (C) 2001-2010, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -34,19 +34,6 @@ package body Prj.PP is Not_Tested : array (Project_Node_Kind) of Boolean := (others => True); - Max_Line_Length : constant := 255; - -- Maximum length of a line. This is chosen to be compatible with older - -- versions of GNAT that had a strict limit on the maximum line length. - - Column : Natural := 0; - -- Column number of the last character in the line. Used to avoid - -- outputting lines longer than Max_Line_Length. - - First_With_In_List : Boolean := True; - -- Indicate that the next with clause is first in a list such as - -- with "A", "B"; - -- First_With_In_List will be True for "A", but not for "B". - procedure Indicate_Tested (Kind : Project_Node_Kind); -- Set the corresponding component of array Not_Tested to False. -- Only called by pragmas Debug. @@ -67,14 +54,16 @@ package body Prj.PP is procedure Pretty_Print (Project : Prj.Tree.Project_Node_Id; In_Tree : Prj.Tree.Project_Node_Tree_Ref; - Increment : Positive := 3; - Eliminate_Empty_Case_Constructions : Boolean := False; - Minimize_Empty_Lines : Boolean := False; - W_Char : Write_Char_Ap := null; - W_Eol : Write_Eol_Ap := null; - W_Str : Write_Str_Ap := null; + Increment : Positive := 3; + Eliminate_Empty_Case_Constructions : Boolean := False; + Minimize_Empty_Lines : Boolean := False; + W_Char : Write_Char_Ap := null; + W_Eol : Write_Eol_Ap := null; + W_Str : Write_Str_Ap := null; Backward_Compatibility : Boolean; - Id : Prj.Project_Id := Prj.No_Project) + Id : Prj.Project_Id := Prj.No_Project; + Max_Line_Length : Max_Length_Of_Line := + Max_Length_Of_Line'Last) is procedure Print (Node : Project_Node_Id; Indent : Natural); -- A recursive procedure that traverses a project file tree and outputs @@ -82,28 +71,35 @@ package body Prj.PP is -- is used when printing attributes, since in nested packages they -- need to use a fully qualified name. - procedure Output_Attribute_Name (Name : Name_Id); + procedure Output_Attribute_Name (Name : Name_Id; Indent : Natural); -- Outputs an attribute name, taking into account the value of -- Backward_Compatibility. - procedure Output_Name (Name : Name_Id; Capitalize : Boolean := True); + procedure Output_Name + (Name : Name_Id; + Indent : Natural; + Capitalize : Boolean := True); -- Outputs a name procedure Start_Line (Indent : Natural); -- Outputs the indentation at the beginning of the line - procedure Output_String (S : Name_Id); - procedure Output_String (S : Path_Name_Type); + procedure Output_String (S : Name_Id; Indent : Natural); + procedure Output_String (S : Path_Name_Type; Indent : Natural); -- Outputs a string using the default output procedures procedure Write_Empty_Line (Always : Boolean := False); -- Outputs an empty line, only if the previous line was not empty - -- already and either Always is True or Minimize_Empty_Lines is False. + -- already and either Always is True or Minimize_Empty_Lines is + -- False. procedure Write_Line (S : String); -- Outputs S followed by a new line - procedure Write_String (S : String; Truncated : Boolean := False); + procedure Write_String + (S : String; + Indent : Natural; + Truncated : Boolean := False); -- Outputs S using Write_Str, starting a new line if line would -- become too long, when Truncated = False. -- When Truncated = True, only the part of the string that can fit on @@ -112,39 +108,48 @@ package body Prj.PP is procedure Write_End_Of_Line_Comment (Node : Project_Node_Id); Write_Char : Write_Char_Ap := Output.Write_Char'Access; - Write_Eol : Write_Eol_Ap := Output.Write_Eol'Access; - Write_Str : Write_Str_Ap := Output.Write_Str'Access; + Write_Eol : Write_Eol_Ap := Output.Write_Eol'Access; + Write_Str : Write_Str_Ap := Output.Write_Str'Access; -- These three access to procedure values are used for the output Last_Line_Is_Empty : Boolean := False; -- Used to avoid two consecutive empty lines + Column : Natural := 0; + -- Column number of the last character in the line. Used to avoid + -- outputting lines longer than Max_Line_Length. + + First_With_In_List : Boolean := True; + -- Indicate that the next with clause is first in a list such as + -- with "A", "B"; + -- First_With_In_List will be True for "A", but not for "B". + --------------------------- -- Output_Attribute_Name -- --------------------------- - procedure Output_Attribute_Name (Name : Name_Id) is + procedure Output_Attribute_Name (Name : Name_Id; Indent : Natural) is begin if Backward_Compatibility then case Name is when Snames.Name_Spec => - Output_Name (Snames.Name_Specification); + Output_Name (Snames.Name_Specification, Indent); when Snames.Name_Spec_Suffix => - Output_Name (Snames.Name_Specification_Suffix); + Output_Name (Snames.Name_Specification_Suffix, Indent); when Snames.Name_Body => - Output_Name (Snames.Name_Implementation); + Output_Name (Snames.Name_Implementation, Indent); when Snames.Name_Body_Suffix => - Output_Name (Snames.Name_Implementation_Suffix); + Output_Name (Snames.Name_Implementation_Suffix, Indent); when others => - Output_Name (Name); + Output_Name (Name, Indent); end case; else - Output_Name (Name); + Output_Name (Name, Indent); end if; end Output_Attribute_Name; @@ -152,10 +157,18 @@ package body Prj.PP is -- Output_Name -- ----------------- - procedure Output_Name (Name : Name_Id; Capitalize : Boolean := True) is + procedure Output_Name + (Name : Name_Id; + Indent : Natural; + Capitalize : Boolean := True) + is Capital : Boolean := Capitalize; begin + if Column = 0 and then Indent /= 0 then + Start_Line (Indent + Increment); + end if; + Get_Name_String (Name); -- If line would become too long, create new line @@ -163,6 +176,10 @@ package body Prj.PP is if Column + Name_Len > Max_Line_Length then Write_Eol.all; Column := 0; + + if Indent /= 0 then + Start_Line (Indent + Increment); + end if; end if; for J in 1 .. Name_Len loop @@ -186,18 +203,26 @@ package body Prj.PP is -- Output_String -- ------------------- - procedure Output_String (S : Name_Id) is + procedure Output_String (S : Name_Id; Indent : Natural) is begin + if Column = 0 and then Indent /= 0 then + Start_Line (Indent + Increment); + end if; + Get_Name_String (S); - -- If line could become too long, create new line. - -- Note that the number of characters on the line could be - -- twice the number of character in the string (if every - -- character is a '"') plus two (the initial and final '"'). + -- If line could become too long, create new line. Note that the + -- number of characters on the line could be twice the number of + -- character in the string (if every character is a '"') plus two + -- (the initial and final '"'). if Column + Name_Len + Name_Len + 2 > Max_Line_Length then Write_Eol.all; Column := 0; + + if Indent /= 0 then + Start_Line (Indent + Increment); + end if; end if; Write_Char ('"'); @@ -214,14 +239,16 @@ package body Prj.PP is Column := Column + 1; end if; - -- If the string does not fit on one line, cut it in parts - -- and concatenate. + -- If the string does not fit on one line, cut it in parts and + -- concatenate. if J < Name_Len and then Column >= Max_Line_Length then Write_Str (""" &"); Write_Eol.all; + Column := 0; + Start_Line (Indent + Increment); Write_Char ('"'); - Column := 1; + Column := Column + 1; end if; end loop; @@ -229,9 +256,9 @@ package body Prj.PP is Column := Column + 1; end Output_String; - procedure Output_String (S : Path_Name_Type) is + procedure Output_String (S : Path_Name_Type; Indent : Natural) is begin - Output_String (Name_Id (S)); + Output_String (Name_Id (S), Indent); end Output_String; ---------------- @@ -269,8 +296,8 @@ package body Prj.PP is begin if Value /= No_Name then - Write_String (" --"); - Write_String (Get_Name_String (Value), Truncated => True); + Write_String (" --", 0); + Write_String (Get_Name_String (Value), 0, Truncated => True); end if; Write_Line (""); @@ -282,7 +309,7 @@ package body Prj.PP is procedure Write_Line (S : String) is begin - Write_String (S); + Write_String (S, 0); Last_Line_Is_Empty := False; Write_Eol.all; Column := 0; @@ -292,9 +319,16 @@ package body Prj.PP is -- Write_String -- ------------------ - procedure Write_String (S : String; Truncated : Boolean := False) is + procedure Write_String + (S : String; + Indent : Natural; + Truncated : Boolean := False) is Length : Natural := S'Length; begin + if Column = 0 and then Indent /= 0 then + Start_Line (Indent + Increment); + end if; + -- If the string would not fit on the line, -- start a new line. @@ -305,6 +339,10 @@ package body Prj.PP is else Write_Eol.all; Column := 0; + + if Indent /= 0 then + Start_Line (Indent + Increment); + end if; end if; end if; @@ -316,7 +354,7 @@ package body Prj.PP is -- Print -- ----------- - procedure Print (Node : Project_Node_Id; Indent : Natural) is + procedure Print (Node : Project_Node_Id; Indent : Natural) is begin if Present (Node) then @@ -335,27 +373,29 @@ package body Prj.PP is Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Write_String ("project "); + Write_String ("project ", Indent); if Id /= Prj.No_Project then - Output_Name (Id.Display_Name); + Output_Name (Id.Display_Name, Indent); else - Output_Name (Name_Of (Node, In_Tree)); + Output_Name (Name_Of (Node, In_Tree), Indent); end if; -- Check if this project extends another project if Extended_Project_Path_Of (Node, In_Tree) /= No_Path then - Write_String (" extends "); + Write_String (" extends ", Indent); if Is_Extending_All (Node, In_Tree) then - Write_String ("all "); + Write_String ("all ", Indent); end if; - Output_String (Extended_Project_Path_Of (Node, In_Tree)); + Output_String + (Extended_Project_Path_Of (Node, In_Tree), + Indent); end if; - Write_String (" is"); + Write_String (" is", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent + Increment); @@ -368,12 +408,12 @@ package body Prj.PP is (First_Comment_Before_End (Node, In_Tree), Indent + Increment); Start_Line (Indent); - Write_String ("end "); + Write_String ("end ", Indent); if Id /= Prj.No_Project then - Output_Name (Id.Display_Name); + Output_Name (Id.Display_Name, Indent); else - Output_Name (Name_Of (Node, In_Tree)); + Output_Name (Name_Of (Node, In_Tree), Indent); end if; Write_Line (";"); @@ -397,20 +437,20 @@ package body Prj.PP is if Non_Limited_Project_Node_Of (Node, In_Tree) = Empty_Node then - Write_String ("limited "); + Write_String ("limited ", Indent); end if; - Write_String ("with "); + Write_String ("with ", Indent); end if; - Output_String (String_Value_Of (Node, In_Tree)); + Output_String (String_Value_Of (Node, In_Tree), Indent); if Is_Not_Last_In_List (Node, In_Tree) then - Write_String (", "); + Write_String (", ", Indent); First_With_In_List := False; else - Write_String (";"); + Write_String (";", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent); First_With_In_List := True; @@ -441,25 +481,26 @@ package body Prj.PP is Write_Empty_Line (Always => True); Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Write_String ("package "); - Output_Name (Name_Of (Node, In_Tree)); + Write_String ("package ", Indent); + Output_Name (Name_Of (Node, In_Tree), Indent); if Project_Of_Renamed_Package_Of (Node, In_Tree) /= Empty_Node then - Write_String (" renames "); + Write_String (" renames ", Indent); Output_Name (Name_Of (Project_Of_Renamed_Package_Of (Node, In_Tree), - In_Tree)); - Write_String ("."); - Output_Name (Name_Of (Node, In_Tree)); - Write_String (";"); + In_Tree), + Indent); + Write_String (".", Indent); + Output_Name (Name_Of (Node, In_Tree), Indent); + Write_String (";", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After_End (Node, In_Tree), Indent); else - Write_String (" is"); + Write_String (" is", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent + Increment); @@ -475,8 +516,8 @@ package body Prj.PP is Print (First_Comment_Before_End (Node, In_Tree), Indent + Increment); Start_Line (Indent); - Write_String ("end "); - Output_Name (Name_Of (Node, In_Tree)); + Write_String ("end ", Indent); + Output_Name (Name_Of (Node, In_Tree), Indent); Write_Line (";"); Print (First_Comment_After_End (Node, In_Tree), Indent); Write_Empty_Line; @@ -486,11 +527,11 @@ package body Prj.PP is pragma Debug (Indicate_Tested (N_String_Type_Declaration)); Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Write_String ("type "); - Output_Name (Name_Of (Node, In_Tree)); + Write_String ("type ", Indent); + Output_Name (Name_Of (Node, In_Tree), Indent); Write_Line (" is"); Start_Line (Indent + Increment); - Write_String ("("); + Write_String ("(", Indent); declare String_Node : Project_Node_Id := @@ -498,50 +539,57 @@ package body Prj.PP is begin while Present (String_Node) loop - Output_String (String_Value_Of (String_Node, In_Tree)); + Output_String + (String_Value_Of (String_Node, In_Tree), + Indent); String_Node := Next_Literal_String (String_Node, In_Tree); if Present (String_Node) then - Write_String (", "); + Write_String (", ", Indent); end if; end loop; end; - Write_String (");"); + Write_String (");", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent); when N_Literal_String => pragma Debug (Indicate_Tested (N_Literal_String)); - Output_String (String_Value_Of (Node, In_Tree)); + Output_String (String_Value_Of (Node, In_Tree), Indent); if Source_Index_Of (Node, In_Tree) /= 0 then - Write_String (" at"); - Write_String (Source_Index_Of (Node, In_Tree)'Img); + Write_String (" at", Indent); + Write_String + (Source_Index_Of (Node, In_Tree)'Img, + Indent); end if; when N_Attribute_Declaration => pragma Debug (Indicate_Tested (N_Attribute_Declaration)); Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Write_String ("for "); - Output_Attribute_Name (Name_Of (Node, In_Tree)); + Write_String ("for ", Indent); + Output_Attribute_Name (Name_Of (Node, In_Tree), Indent); if Associative_Array_Index_Of (Node, In_Tree) /= No_Name then - Write_String (" ("); + Write_String (" (", Indent); Output_String - (Associative_Array_Index_Of (Node, In_Tree)); + (Associative_Array_Index_Of (Node, In_Tree), + Indent); if Source_Index_Of (Node, In_Tree) /= 0 then - Write_String (" at"); - Write_String (Source_Index_Of (Node, In_Tree)'Img); + Write_String (" at", Indent); + Write_String + (Source_Index_Of (Node, In_Tree)'Img, + Indent); end if; - Write_String (")"); + Write_String (")", Indent); end if; - Write_String (" use "); + Write_String (" use ", Indent); if Present (Expression_Of (Node, In_Tree)) then Print (Expression_Of (Node, In_Tree), Indent); @@ -555,16 +603,18 @@ package body Prj.PP is Output_Name (Name_Of (Associative_Project_Of (Node, In_Tree), - In_Tree)); + In_Tree), + Indent); if Present (Associative_Package_Of (Node, In_Tree)) then - Write_String ("."); + Write_String (".", Indent); Output_Name (Name_Of (Associative_Package_Of (Node, In_Tree), - In_Tree)); + In_Tree), + Indent); end if; elsif @@ -573,14 +623,15 @@ package body Prj.PP is Output_Name (Name_Of (Associative_Package_Of (Node, In_Tree), - In_Tree)); + In_Tree), + Indent); end if; - Write_String ("'"); - Output_Attribute_Name (Name_Of (Node, In_Tree)); + Write_String ("'", Indent); + Output_Attribute_Name (Name_Of (Node, In_Tree), Indent); end if; - Write_String (";"); + Write_String (";", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent); @@ -589,13 +640,14 @@ package body Prj.PP is (Indicate_Tested (N_Typed_Variable_Declaration)); Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Output_Name (Name_Of (Node, In_Tree)); - Write_String (" : "); + Output_Name (Name_Of (Node, In_Tree), Indent); + Write_String (" : ", Indent); Output_Name - (Name_Of (String_Type_Of (Node, In_Tree), In_Tree)); - Write_String (" := "); + (Name_Of (String_Type_Of (Node, In_Tree), In_Tree), + Indent); + Write_String (" := ", Indent); Print (Expression_Of (Node, In_Tree), Indent); - Write_String (";"); + Write_String (";", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent); @@ -603,10 +655,10 @@ package body Prj.PP is pragma Debug (Indicate_Tested (N_Variable_Declaration)); Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Output_Name (Name_Of (Node, In_Tree)); - Write_String (" := "); + Output_Name (Name_Of (Node, In_Tree), Indent); + Write_String (" := ", Indent); Print (Expression_Of (Node, In_Tree), Indent); - Write_String (";"); + Write_String (";", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), Indent); @@ -621,7 +673,7 @@ package body Prj.PP is Term := Next_Term (Term, In_Tree); if Present (Term) then - Write_String (" & "); + Write_String (" & ", Indent); end if; end loop; end; @@ -632,7 +684,7 @@ package body Prj.PP is when N_Literal_String_List => pragma Debug (Indicate_Tested (N_Literal_String_List)); - Write_String ("("); + Write_String ("(", Indent); declare Expression : Project_Node_Id := @@ -645,40 +697,42 @@ package body Prj.PP is Next_Expression_In_List (Expression, In_Tree); if Present (Expression) then - Write_String (", "); + Write_String (", ", Indent); end if; end loop; end; - Write_String (")"); + Write_String (")", Indent); when N_Variable_Reference => pragma Debug (Indicate_Tested (N_Variable_Reference)); if Present (Project_Node_Of (Node, In_Tree)) then Output_Name - (Name_Of (Project_Node_Of (Node, In_Tree), In_Tree)); - Write_String ("."); + (Name_Of (Project_Node_Of (Node, In_Tree), In_Tree), + Indent); + Write_String (".", Indent); end if; if Present (Package_Node_Of (Node, In_Tree)) then Output_Name - (Name_Of (Package_Node_Of (Node, In_Tree), In_Tree)); - Write_String ("."); + (Name_Of (Package_Node_Of (Node, In_Tree), In_Tree), + Indent); + Write_String (".", Indent); end if; - Output_Name (Name_Of (Node, In_Tree)); + Output_Name (Name_Of (Node, In_Tree), Indent); when N_External_Value => pragma Debug (Indicate_Tested (N_External_Value)); - Write_String ("external ("); + Write_String ("external (", Indent); Print (External_Reference_Of (Node, In_Tree), Indent); if Present (External_Default_Of (Node, In_Tree)) then - Write_String (", "); + Write_String (", ", Indent); Print (External_Default_Of (Node, In_Tree), Indent); end if; - Write_String (")"); + Write_String (")", Indent); when N_Attribute_Reference => pragma Debug (Indicate_Tested (N_Attribute_Reference)); @@ -687,24 +741,27 @@ package body Prj.PP is and then Project_Node_Of (Node, In_Tree) /= Project then Output_Name - (Name_Of (Project_Node_Of (Node, In_Tree), In_Tree)); + (Name_Of (Project_Node_Of (Node, In_Tree), In_Tree), + Indent); if Present (Package_Node_Of (Node, In_Tree)) then - Write_String ("."); + Write_String (".", Indent); Output_Name - (Name_Of (Package_Node_Of (Node, In_Tree), In_Tree)); + (Name_Of (Package_Node_Of (Node, In_Tree), In_Tree), + Indent); end if; elsif Present (Package_Node_Of (Node, In_Tree)) then Output_Name - (Name_Of (Package_Node_Of (Node, In_Tree), In_Tree)); + (Name_Of (Package_Node_Of (Node, In_Tree), In_Tree), + Indent); else - Write_String ("project"); + Write_String ("project", Indent); end if; - Write_String ("'"); - Output_Attribute_Name (Name_Of (Node, In_Tree)); + Write_String ("'", Indent); + Output_Attribute_Name (Name_Of (Node, In_Tree), Indent); declare Index : constant Name_Id := @@ -712,9 +769,9 @@ package body Prj.PP is begin if Index /= No_Name then - Write_String (" ("); - Output_String (Index); - Write_String (")"); + Write_String (" (", Indent); + Output_String (Index, Indent); + Write_String (")", Indent); end if; end; @@ -743,11 +800,11 @@ package body Prj.PP is Write_Empty_Line; Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Write_String ("case "); + Write_String ("case ", Indent); Print (Case_Variable_Reference_Of (Node, In_Tree), Indent); - Write_String (" is"); + Write_String (" is", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), @@ -784,10 +841,10 @@ package body Prj.PP is Write_Empty_Line; Print (First_Comment_Before (Node, In_Tree), Indent); Start_Line (Indent); - Write_String ("when "); + Write_String ("when ", Indent); if No (First_Choice_Of (Node, In_Tree)) then - Write_String ("others"); + Write_String ("others", Indent); else declare @@ -799,13 +856,13 @@ package body Prj.PP is Label := Next_Literal_String (Label, In_Tree); if Present (Label) then - Write_String (" | "); + Write_String (" | ", Indent); end if; end loop; end; end if; - Write_String (" =>"); + Write_String (" =>", Indent); Write_End_Of_Line_Comment (Node); Print (First_Comment_After (Node, In_Tree), @@ -837,9 +894,10 @@ package body Prj.PP is end if; Start_Line (Indent); - Write_String ("--"); + Write_String ("--", Indent); Write_String (Get_Name_String (String_Value_Of (Node, In_Tree)), + Indent, Truncated => True); Write_Line (""); |