diff options
Diffstat (limited to 'gcc/ada/prj-env.adb')
-rw-r--r-- | gcc/ada/prj-env.adb | 621 |
1 files changed, 376 insertions, 245 deletions
diff --git a/gcc/ada/prj-env.adb b/gcc/ada/prj-env.adb index 1ce1209..02a602e 100644 --- a/gcc/ada/prj-env.adb +++ b/gcc/ada/prj-env.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2001-2004 Free Software Foundation, Inc. -- +-- Copyright (C) 2001-2005 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- -- @@ -29,7 +29,6 @@ with Opt; with Osint; use Osint; with Output; use Output; with Prj.Com; use Prj.Com; -with Table; with Tempdir; with GNAT.Directory_Operations; use GNAT.Directory_Operations; @@ -37,8 +36,6 @@ with GNAT.OS_Lib; use GNAT.OS_Lib; package body Prj.Env is - type Naming_Id is new Nat; - Current_Source_Path_File : Name_Id := No_Name; -- Current value of project source path file env var. -- Used to avoid setting the env var to the same value. @@ -62,63 +59,33 @@ package body Prj.Env is -- platforms, except on VMS where the logical names are deassigned, thus -- avoiding the pollution of the environment of the caller. - package Namings is new Table.Table - (Table_Component_Type => Naming_Data, - Table_Index_Type => Naming_Id, - Table_Low_Bound => 1, - Table_Initial => 5, - Table_Increment => 100, - Table_Name => "Prj.Env.Namings"); - - Default_Naming : constant Naming_Id := Namings.First; + Default_Naming : constant Naming_Id := Naming_Table.First; Fill_Mapping_File : Boolean := True; - package Path_Files is new Table.Table - (Table_Component_Type => Name_Id, - Table_Index_Type => Natural, - Table_Low_Bound => 1, - Table_Initial => 50, - Table_Increment => 50, - Table_Name => "Prj.Env.Path_Files"); - -- Table storing all the temp path file names. - -- Used by Delete_All_Path_Files. - type Project_Flags is array (Project_Id range <>) of Boolean; -- A Boolean array type used in Create_Mapping_File to select the projects -- in the closure of a specific project. - package Source_Paths is new Table.Table - (Table_Component_Type => Name_Id, - Table_Index_Type => Natural, - Table_Low_Bound => 1, - Table_Initial => 50, - Table_Increment => 50, - Table_Name => "Prj.Env.Source_Paths"); - -- A table to store the source dirs before creating the source path file - - package Object_Paths is new Table.Table - (Table_Component_Type => Name_Id, - Table_Index_Type => Natural, - Table_Low_Bound => 1, - Table_Initial => 50, - Table_Increment => 50, - Table_Name => "Prj.Env.Source_Paths"); - -- A table to store the object dirs, before creating the object path file - ----------------------- -- Local Subprograms -- ----------------------- - function Body_Path_Name_Of (Unit : Unit_Id) return String; + function Body_Path_Name_Of + (Unit : Unit_Id; + In_Tree : Project_Tree_Ref) return String; -- Returns the path name of the body of a unit. -- Compute it first, if necessary. - function Spec_Path_Name_Of (Unit : Unit_Id) return String; + function Spec_Path_Name_Of + (Unit : Unit_Id; + In_Tree : Project_Tree_Ref) return String; -- Returns the path name of the spec of a unit. -- Compute it first, if necessary. - procedure Add_To_Path (Source_Dirs : String_List_Id); + procedure Add_To_Path + (Source_Dirs : String_List_Id; + In_Tree : Project_Tree_Ref); -- Add to Ada_Path_Buffer all the source directories in string list -- Source_Dirs, if any. Increment Ada_Path_Length. @@ -128,11 +95,14 @@ package body Prj.Env is -- If Ada_Path_Length /= 0, prepend a Path_Separator character to -- Path. - procedure Add_To_Source_Path (Source_Dirs : String_List_Id); + procedure Add_To_Source_Path + (Source_Dirs : String_List_Id; In_Tree : Project_Tree_Ref); -- Add to Ada_Path_B all the source directories in string list -- Source_Dirs, if any. Increment Ada_Path_Length. - procedure Add_To_Object_Path (Object_Dir : Name_Id); + procedure Add_To_Object_Path + (Object_Dir : Name_Id; + In_Tree : Project_Tree_Ref); -- Add Object_Dir to object path table. Make sure it is not duplicate -- and it is the last one in the current table. @@ -140,7 +110,8 @@ package body Prj.Env is -- Return True if there is at least one ALI file in the directory Dir procedure Create_New_Path_File - (Path_FD : out File_Descriptor; + (In_Tree : Project_Tree_Ref; + Path_FD : out File_Descriptor; Path_Name : out Name_Id); -- Create a new temporary path file. Get the file name in Path_Name. -- The name is normally obtained by increasing the number in @@ -149,7 +120,8 @@ package body Prj.Env is procedure Set_Path_File_Var (Name : String; Value : String); -- Call Setenv, after calling To_Host_File_Spec - function Ultimate_Extension_Of (Project : in Project_Id) return Project_Id; + function Ultimate_Extension_Of + (Project : in Project_Id; In_Tree : Project_Tree_Ref) return Project_Id; -- Return a project that is either Project or an extended ancestor of -- Project that itself is not extended. @@ -157,7 +129,9 @@ package body Prj.Env is -- Ada_Include_Path -- ---------------------- - function Ada_Include_Path (Project : Project_Id) return String_Access is + function Ada_Include_Path + (Project : Project_Id; + In_Tree : Project_Tree_Ref) return String_Access is procedure Add (Project : Project_Id); -- Add all the source directories of a project to the path only if @@ -173,17 +147,18 @@ package body Prj.Env is begin -- If Seen is empty, then the project cannot have been visited - if not Projects.Table (Project).Seen then - Projects.Table (Project).Seen := True; + if not In_Tree.Projects.Table (Project).Seen then + In_Tree.Projects.Table (Project).Seen := True; declare - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); List : Project_List := Data.Imported_Projects; begin -- Add to path all source directories of this project - Add_To_Path (Data.Source_Dirs); + Add_To_Path (Data.Source_Dirs, In_Tree); -- Call Add to the project being extended, if any @@ -194,8 +169,9 @@ package body Prj.Env is -- Call Add for each imported project, if any while List /= Empty_Project_List loop - Add (Project_Lists.Table (List).Project); - List := Project_Lists.Table (List).Next; + Add + (In_Tree.Project_Lists.Table (List).Project); + List := In_Tree.Project_Lists.Table (List).Next; end loop; end; end if; @@ -207,19 +183,23 @@ package body Prj.Env is -- If it is the first time we call this function for -- this project, compute the source path - if Projects.Table (Project).Ada_Include_Path = null then + if + In_Tree.Projects.Table (Project).Ada_Include_Path = null + then Ada_Path_Length := 0; - for Index in 1 .. Projects.Last loop - Projects.Table (Index).Seen := False; + for Index in Project_Table.First .. + Project_Table.Last (In_Tree.Projects) + loop + In_Tree.Projects.Table (Index).Seen := False; end loop; Add (Project); - Projects.Table (Project).Ada_Include_Path := + In_Tree.Projects.Table (Project).Ada_Include_Path := new String'(Ada_Path_Buffer (1 .. Ada_Path_Length)); end if; - return Projects.Table (Project).Ada_Include_Path; + return In_Tree.Projects.Table (Project).Ada_Include_Path; end Ada_Include_Path; ---------------------- @@ -228,14 +208,16 @@ package body Prj.Env is function Ada_Include_Path (Project : Project_Id; + In_Tree : Project_Tree_Ref; Recursive : Boolean) return String is begin if Recursive then - return Ada_Include_Path (Project).all; + return Ada_Include_Path (Project, In_Tree).all; else Ada_Path_Length := 0; - Add_To_Path (Projects.Table (Project).Source_Dirs); + Add_To_Path + (In_Tree.Projects.Table (Project).Source_Dirs, In_Tree); return Ada_Path_Buffer (1 .. Ada_Path_Length); end if; end Ada_Include_Path; @@ -246,6 +228,7 @@ package body Prj.Env is function Ada_Objects_Path (Project : Project_Id; + In_Tree : Project_Tree_Ref; Including_Libraries : Boolean := True) return String_Access is procedure Add (Project : Project_Id); @@ -262,11 +245,12 @@ package body Prj.Env is begin -- If this project has not been seen yet - if not Projects.Table (Project).Seen then - Projects.Table (Project).Seen := True; + if not In_Tree.Projects.Table (Project).Seen then + In_Tree.Projects.Table (Project).Seen := True; declare - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); List : Project_List := Data.Imported_Projects; begin @@ -286,7 +270,8 @@ package body Prj.Env is if Data.Library then if Data.Object_Directory = No_Name - or else Contains_ALI_Files (Data.Library_Dir) + or else + Contains_ALI_Files (Data.Library_Dir) then Add_To_Path (Get_Name_String (Data.Library_Dir)); else @@ -309,8 +294,9 @@ package body Prj.Env is -- Call Add for each imported project, if any while List /= Empty_Project_List loop - Add (Project_Lists.Table (List).Project); - List := Project_Lists.Table (List).Next; + Add + (In_Tree.Project_Lists.Table (List).Project); + List := In_Tree.Project_Lists.Table (List).Next; end loop; end; @@ -323,60 +309,78 @@ package body Prj.Env is -- If it is the first time we call this function for -- this project, compute the objects path - if Projects.Table (Project).Ada_Objects_Path = null then + if + In_Tree.Projects.Table (Project).Ada_Objects_Path = null + then Ada_Path_Length := 0; - for Index in 1 .. Projects.Last loop - Projects.Table (Index).Seen := False; + for Index in Project_Table.First .. + Project_Table.Last (In_Tree.Projects) + loop + In_Tree.Projects.Table (Index).Seen := False; end loop; Add (Project); - Projects.Table (Project).Ada_Objects_Path := + In_Tree.Projects.Table (Project).Ada_Objects_Path := new String'(Ada_Path_Buffer (1 .. Ada_Path_Length)); end if; - return Projects.Table (Project).Ada_Objects_Path; + return In_Tree.Projects.Table (Project).Ada_Objects_Path; end Ada_Objects_Path; ------------------------ -- Add_To_Object_Path -- ------------------------ - procedure Add_To_Object_Path (Object_Dir : Name_Id) is + procedure Add_To_Object_Path + (Object_Dir : Name_Id; In_Tree : Project_Tree_Ref) + is begin -- Check if the directory is already in the table - for Index in 1 .. Object_Paths.Last loop + for Index in Object_Path_Table.First .. + Object_Path_Table.Last (In_Tree.Private_Part.Object_Paths) + loop -- If it is, remove it, and add it as the last one - if Object_Paths.Table (Index) = Object_Dir then - for Index2 in Index + 1 .. Object_Paths.Last loop - Object_Paths.Table (Index2 - 1) := - Object_Paths.Table (Index2); + if In_Tree.Private_Part.Object_Paths.Table (Index) = Object_Dir then + for Index2 in Index + 1 .. + Object_Path_Table.Last + (In_Tree.Private_Part.Object_Paths) + loop + In_Tree.Private_Part.Object_Paths.Table (Index2 - 1) := + In_Tree.Private_Part.Object_Paths.Table (Index2); end loop; - Object_Paths.Table (Object_Paths.Last) := Object_Dir; + In_Tree.Private_Part.Object_Paths.Table + (Object_Path_Table.Last (In_Tree.Private_Part.Object_Paths)) := + Object_Dir; return; end if; end loop; -- The directory is not already in the table, add it - Object_Paths.Increment_Last; - Object_Paths.Table (Object_Paths.Last) := Object_Dir; + Object_Path_Table.Increment_Last (In_Tree.Private_Part.Object_Paths); + In_Tree.Private_Part.Object_Paths.Table + (Object_Path_Table.Last (In_Tree.Private_Part.Object_Paths)) := + Object_Dir; end Add_To_Object_Path; ----------------- -- Add_To_Path -- ----------------- - procedure Add_To_Path (Source_Dirs : String_List_Id) is + procedure Add_To_Path + (Source_Dirs : String_List_Id; + In_Tree : Project_Tree_Ref) + is Current : String_List_Id := Source_Dirs; Source_Dir : String_Element; begin while Current /= Nil_String loop - Source_Dir := String_Elements.Table (Current); + Source_Dir := In_Tree.String_Elements.Table (Current); Add_To_Path (Get_Name_String (Source_Dir.Display_Value)); Current := Source_Dir.Next; end loop; @@ -467,7 +471,9 @@ package body Prj.Env is -- Add_To_Source_Path -- ------------------------ - procedure Add_To_Source_Path (Source_Dirs : String_List_Id) is + procedure Add_To_Source_Path + (Source_Dirs : String_List_Id; In_Tree : Project_Tree_Ref) + is Current : String_List_Id := Source_Dirs; Source_Dir : String_Element; Add_It : Boolean; @@ -476,23 +482,31 @@ package body Prj.Env is -- Add each source directory while Current /= Nil_String loop - Source_Dir := String_Elements.Table (Current); + Source_Dir := In_Tree.String_Elements.Table (Current); Add_It := True; -- Check if the source directory is already in the table - for Index in 1 .. Source_Paths.Last loop + for Index in Source_Path_Table.First .. + Source_Path_Table.Last + (In_Tree.Private_Part.Source_Paths) + loop -- If it is already, no need to add it - if Source_Paths.Table (Index) = Source_Dir.Value then + if In_Tree.Private_Part.Source_Paths.Table (Index) = + Source_Dir.Value + then Add_It := False; exit; end if; end loop; if Add_It then - Source_Paths.Increment_Last; - Source_Paths.Table (Source_Paths.Last) := Source_Dir.Value; + Source_Path_Table.Increment_Last + (In_Tree.Private_Part.Source_Paths); + In_Tree.Private_Part.Source_Paths.Table + (Source_Path_Table.Last (In_Tree.Private_Part.Source_Paths)) := + Source_Dir.Value; end if; -- Next source directory @@ -505,8 +519,10 @@ package body Prj.Env is -- Body_Path_Name_Of -- ----------------------- - function Body_Path_Name_Of (Unit : Unit_Id) return String is - Data : Unit_Data := Units.Table (Unit); + function Body_Path_Name_Of + (Unit : Unit_Id; In_Tree : Project_Tree_Ref) return String + is + Data : Unit_Data := In_Tree.Units.Table (Unit); begin -- If we don't know the path name of the body of this unit, @@ -515,7 +531,8 @@ package body Prj.Env is if Data.File_Names (Body_Part).Path = No_Name then declare Current_Source : String_List_Id := - Projects.Table (Data.File_Names (Body_Part).Project).Sources; + In_Tree.Projects.Table + (Data.File_Names (Body_Part).Project).Sources; Path : GNAT.OS_Lib.String_Access; begin @@ -532,10 +549,11 @@ package body Prj.Env is (Namet.Get_Name_String (Data.File_Names (Body_Part).Name), Namet.Get_Name_String - (String_Elements.Table (Current_Source).Value)); + (In_Tree.String_Elements.Table + (Current_Source).Value)); - -- If the file is in this directory, - -- then we store the path, and we are done. + -- If the file is in this directory, then we store the path, + -- and we are done. if Path /= null then Name_Len := Path'Length; @@ -545,11 +563,12 @@ package body Prj.Env is else Current_Source := - String_Elements.Table (Current_Source).Next; + In_Tree.String_Elements.Table + (Current_Source).Next; end if; end loop; - Units.Table (Unit) := Data; + In_Tree.Units.Table (Unit) := Data; end; end if; @@ -604,6 +623,7 @@ package body Prj.Env is procedure Create_Config_Pragmas_File (For_Project : Project_Id; Main_Project : Project_Id; + In_Tree : Project_Tree_Ref; Include_Config_Files : Boolean := True) is pragma Unreferenced (Main_Project); @@ -612,7 +632,7 @@ package body Prj.Env is File_Name : Name_Id := No_Name; File : File_Descriptor := Invalid_FD; - Current_Unit : Unit_Id := Units.First; + Current_Unit : Unit_Id := Unit_Table.First; First_Project : Project_List := Empty_Project_List; @@ -648,7 +668,8 @@ package body Prj.Env is ----------- procedure Check (Project : Project_Id) is - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); begin if Current_Verbosity = High then @@ -662,34 +683,44 @@ package body Prj.Env is Current_Project := First_Project; while Current_Project /= Empty_Project_List - and then Project_Lists.Table (Current_Project).Project /= Project + and then In_Tree.Project_Lists.Table + (Current_Project).Project /= Project loop - Current_Project := Project_Lists.Table (Current_Project).Next; + Current_Project := + In_Tree.Project_Lists.Table (Current_Project).Next; end loop; -- If it is not, put it in the list, and visit it if Current_Project = Empty_Project_List then - Project_Lists.Increment_Last; - Project_Lists.Table (Project_Lists.Last) := - (Project => Project, Next => First_Project); - First_Project := Project_Lists.Last; + Project_List_Table.Increment_Last + (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table + (Project_List_Table.Last (In_Tree.Project_Lists)) := + (Project => Project, Next => First_Project); + First_Project := + Project_List_Table.Last (In_Tree.Project_Lists); -- Is the naming scheme of this project one that we know? Current_Naming := Default_Naming; - while Current_Naming <= Namings.Last and then - not Same_Naming_Scheme - (Left => Namings.Table (Current_Naming), + while Current_Naming <= + Naming_Table.Last (In_Tree.Private_Part.Namings) + and then not Same_Naming_Scheme + (Left => In_Tree.Private_Part.Namings.Table (Current_Naming), Right => Data.Naming) loop Current_Naming := Current_Naming + 1; end loop; -- If we don't know it, add it - if Current_Naming > Namings.Last then - Namings.Increment_Last; - Namings.Table (Namings.Last) := Data.Naming; + if Current_Naming > + Naming_Table.Last (In_Tree.Private_Part.Namings) + then + Naming_Table.Increment_Last (In_Tree.Private_Part.Namings); + In_Tree.Private_Part.Namings.Table + (Naming_Table.Last (In_Tree.Private_Part.Namings)) := + Data.Naming; -- We need a temporary file to be created @@ -760,8 +791,11 @@ package body Prj.Env is begin while Current /= Empty_Project_List loop - Check (Project_Lists.Table (Current).Project); - Current := Project_Lists.Table (Current).Next; + Check + (In_Tree.Project_Lists.Table + (Current).Project); + Current := In_Tree.Project_Lists.Table + (Current).Next; end loop; end; end if; @@ -870,11 +904,13 @@ package body Prj.Env is -- Start of processing for Create_Config_Pragmas_File begin - if not Projects.Table (For_Project).Config_Checked then + if not + In_Tree.Projects.Table (For_Project).Config_Checked + then -- Remove any memory of processed naming schemes, if any - Namings.Set_Last (Default_Naming); + Naming_Table.Set_Last (In_Tree.Private_Part.Namings, Default_Naming); -- Check the naming schemes @@ -882,10 +918,12 @@ package body Prj.Env is -- Visit all the units and process those that need an SFN pragma - while Current_Unit <= Units.Last loop + while + Current_Unit <= Unit_Table.Last (In_Tree.Units) + loop declare Unit : constant Unit_Data := - Units.Table (Current_Unit); + In_Tree.Units.Table (Current_Unit); begin if Unit.File_Names (Specification).Needs_Pragma then @@ -938,10 +976,13 @@ package body Prj.Env is Write_Line (""""); end if; - Projects.Table (For_Project).Config_File_Name := File_Name; - Projects.Table (For_Project).Config_File_Temp := True; + In_Tree.Projects.Table (For_Project).Config_File_Name := + File_Name; + In_Tree.Projects.Table (For_Project).Config_File_Temp := + True; - Projects.Table (For_Project).Config_Checked := True; + In_Tree.Projects.Table (For_Project).Config_Checked := + True; end if; end Create_Config_Pragmas_File; @@ -951,6 +992,7 @@ package body Prj.Env is procedure Create_Mapping_File (Project : Project_Id; + In_Tree : Project_Tree_Ref; Name : out Name_Id) is File : File_Descriptor := Invalid_FD; @@ -960,7 +1002,8 @@ package body Prj.Env is Status : Boolean; -- For call to Close - Present : Project_Flags (No_Project .. Projects.Last) := + Present : Project_Flags + (No_Project .. Project_Table.Last (In_Tree.Projects)) := (others => False); -- For each project in the closure of Project, the corresponding flag -- will be set to True; @@ -1045,19 +1088,22 @@ package body Prj.Env is -- Flag the current project Present (Prj) := True; - Imported := Projects.Table (Prj).Imported_Projects; + Imported := + In_Tree.Projects.Table (Prj).Imported_Projects; -- Call itself for each project directly imported while Imported /= Empty_Project_List loop - Proj := Project_Lists.Table (Imported).Project; - Imported := Project_Lists.Table (Imported).Next; + Proj := + In_Tree.Project_Lists.Table (Imported).Project; + Imported := + In_Tree.Project_Lists.Table (Imported).Next; Recursive_Flag (Proj); end loop; -- Call itself for an eventual project being extended - Recursive_Flag (Projects.Table (Prj).Extends); + Recursive_Flag (In_Tree.Projects.Table (Prj).Extends); end Recursive_Flag; -- Start of processing for Create_Mapping_File @@ -1081,10 +1127,11 @@ package body Prj.Env is end if; if Fill_Mapping_File then + -- For all units in table Units - for Unit in 1 .. Units.Last loop - The_Unit_Data := Units.Table (Unit); + for Unit in 1 .. Unit_Table.Last (In_Tree.Units) loop + The_Unit_Data := In_Tree.Units.Table (Unit); -- If the unit has a valid name @@ -1123,7 +1170,8 @@ package body Prj.Env is -------------------------- procedure Create_New_Path_File - (Path_FD : out File_Descriptor; + (In_Tree : Project_Tree_Ref; + Path_FD : out File_Descriptor; Path_Name : out Name_Id) is begin @@ -1134,8 +1182,10 @@ package body Prj.Env is -- Record the name, so that the temp path file will be deleted -- at the end of the program. - Path_Files.Increment_Last; - Path_Files.Table (Path_Files.Last) := Path_Name; + Path_File_Table.Increment_Last (In_Tree.Private_Part.Path_Files); + In_Tree.Private_Part.Path_Files.Table + (Path_File_Table.Last (In_Tree.Private_Part.Path_Files)) := + Path_Name; end if; end Create_New_Path_File; @@ -1143,14 +1193,18 @@ package body Prj.Env is -- Delete_All_Path_Files -- --------------------------- - procedure Delete_All_Path_Files is + procedure Delete_All_Path_Files (In_Tree : Project_Tree_Ref) is Disregard : Boolean := True; begin - for Index in 1 .. Path_Files.Last loop - if Path_Files.Table (Index) /= No_Name then + for Index in Path_File_Table.First .. + Path_File_Table.Last (In_Tree.Private_Part.Path_Files) + loop + if In_Tree.Private_Part.Path_Files.Table (Index) /= No_Name then Delete_File - (Get_Name_String (Path_Files.Table (Index)), Disregard); + (Get_Name_String + (In_Tree.Private_Part.Path_Files.Table (Index)), + Disregard); end if; end loop; @@ -1177,11 +1231,13 @@ package body Prj.Env is function File_Name_Of_Library_Unit_Body (Name : String; Project : Project_Id; + In_Tree : Project_Tree_Ref; Main_Project_Only : Boolean := True; Full_Path : Boolean := False) return String is The_Project : Project_Id := Project; - Data : Project_Data := Projects.Table (Project); + Data : Project_Data := + In_Tree.Projects.Table (Project); Original_Name : String := Name; Extended_Spec_Name : String := @@ -1236,8 +1292,10 @@ package body Prj.Env is -- Loop through units -- Should have comment explaining reverse ??? - for Current in reverse Units.First .. Units.Last loop - Unit := Units.Table (Current); + for Current in reverse Unit_Table.First .. + Unit_Table.Last (In_Tree.Units) + loop + Unit := In_Tree.Units.Table (Current); -- Check for body @@ -1370,7 +1428,7 @@ package body Prj.Env is -- Otherwise, look in the project we are extending The_Project := Data.Extends; - Data := Projects.Table (The_Project); + Data := In_Tree.Projects.Table (The_Project); end loop; -- We don't know this file name, return an empty string @@ -1382,7 +1440,10 @@ package body Prj.Env is -- For_All_Object_Dirs -- ------------------------- - procedure For_All_Object_Dirs (Project : Project_Id) is + procedure For_All_Object_Dirs + (Project : Project_Id; + In_Tree : Project_Tree_Ref) + is Seen : Project_List := Empty_Project_List; procedure Add (Project : Project_Id); @@ -1395,7 +1456,8 @@ package body Prj.Env is --------- procedure Add (Project : Project_Id) is - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); List : Project_List := Data.Imported_Projects; begin @@ -1403,9 +1465,11 @@ package body Prj.Env is -- for sure we never visited this project. if Seen = Empty_Project_List then - Project_Lists.Increment_Last; - Seen := Project_Lists.Last; - Project_Lists.Table (Seen) := + Project_List_Table.Increment_Last + (In_Tree.Project_Lists); + Seen := + Project_List_Table.Last (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table (Seen) := (Project => Project, Next => Empty_Project_List); else @@ -1418,21 +1482,29 @@ package body Prj.Env is loop -- If it is, then there is nothing else to do - if Project_Lists.Table (Current).Project = Project then + if In_Tree.Project_Lists.Table + (Current).Project = Project + then return; end if; - exit when Project_Lists.Table (Current).Next = - Empty_Project_List; - Current := Project_Lists.Table (Current).Next; + exit when + In_Tree.Project_Lists.Table (Current).Next = + Empty_Project_List; + Current := + In_Tree.Project_Lists.Table (Current).Next; end loop; -- This project has never been visited, add it -- to the list. - Project_Lists.Increment_Last; - Project_Lists.Table (Current).Next := Project_Lists.Last; - Project_Lists.Table (Project_Lists.Last) := + Project_List_Table.Increment_Last + (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table (Current).Next := + Project_List_Table.Last (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table + (Project_List_Table.Last + (In_Tree.Project_Lists)) := (Project => Project, Next => Empty_Project_List); end; end if; @@ -1454,8 +1526,8 @@ package body Prj.Env is -- And visit all imported projects while List /= Empty_Project_List loop - Add (Project_Lists.Table (List).Project); - List := Project_Lists.Table (List).Next; + Add (In_Tree.Project_Lists.Table (List).Project); + List := In_Tree.Project_Lists.Table (List).Next; end loop; end Add; @@ -1472,7 +1544,10 @@ package body Prj.Env is -- For_All_Source_Dirs -- ------------------------- - procedure For_All_Source_Dirs (Project : Project_Id) is + procedure For_All_Source_Dirs + (Project : Project_Id; + In_Tree : Project_Tree_Ref) + is Seen : Project_List := Empty_Project_List; procedure Add (Project : Project_Id); @@ -1485,7 +1560,8 @@ package body Prj.Env is --------- procedure Add (Project : Project_Id) is - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); List : Project_List := Data.Imported_Projects; begin @@ -1493,9 +1569,11 @@ package body Prj.Env is -- for sure we never visited this project. if Seen = Empty_Project_List then - Project_Lists.Increment_Last; - Seen := Project_Lists.Last; - Project_Lists.Table (Seen) := + Project_List_Table.Increment_Last + (In_Tree.Project_Lists); + Seen := Project_List_Table.Last + (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table (Seen) := (Project => Project, Next => Empty_Project_List); else @@ -1508,21 +1586,29 @@ package body Prj.Env is loop -- If it is, then there is nothing else to do - if Project_Lists.Table (Current).Project = Project then + if In_Tree.Project_Lists.Table + (Current).Project = Project + then return; end if; - exit when Project_Lists.Table (Current).Next = - Empty_Project_List; - Current := Project_Lists.Table (Current).Next; + exit when + In_Tree.Project_Lists.Table (Current).Next = + Empty_Project_List; + Current := + In_Tree.Project_Lists.Table (Current).Next; end loop; -- This project has never been visited, add it -- to the list. - Project_Lists.Increment_Last; - Project_Lists.Table (Current).Next := Project_Lists.Last; - Project_Lists.Table (Project_Lists.Last) := + Project_List_Table.Increment_Last + (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table (Current).Next := + Project_List_Table.Last (In_Tree.Project_Lists); + In_Tree.Project_Lists.Table + (Project_List_Table.Last + (In_Tree.Project_Lists)) := (Project => Project, Next => Empty_Project_List); end; end if; @@ -1535,9 +1621,12 @@ package body Prj.Env is -- If there are Ada sources, call action with the name of every -- source directory. - if Projects.Table (Project).Ada_Sources_Present then + if + In_Tree.Projects.Table (Project).Ada_Sources_Present + then while Current /= Nil_String loop - The_String := String_Elements.Table (Current); + The_String := + In_Tree.String_Elements.Table (Current); Action (Get_Name_String (The_String.Value)); Current := The_String.Next; end loop; @@ -1553,8 +1642,8 @@ package body Prj.Env is -- And visit all imported projects while List /= Empty_Project_List loop - Add (Project_Lists.Table (List).Project); - List := Project_Lists.Table (List).Next; + Add (In_Tree.Project_Lists.Table (List).Project); + List := In_Tree.Project_Lists.Table (List).Next; end loop; end Add; @@ -1572,6 +1661,7 @@ package body Prj.Env is procedure Get_Reference (Source_File_Name : String; + In_Tree : Project_Tree_Ref; Project : out Project_Id; Path : out Name_Id) is @@ -1591,8 +1681,10 @@ package body Prj.Env is begin Canonical_Case_File_Name (Original_Name); - for Id in Units.First .. Units.Last loop - Unit := Units.Table (Id); + for Id in Unit_Table.First .. + Unit_Table.Last (In_Tree.Units) + loop + Unit := In_Tree.Units.Table (Id); if (Unit.File_Names (Specification).Name /= No_Name and then @@ -1605,7 +1697,8 @@ package body Prj.Env is Original_Name) then Project := Ultimate_Extension_Of - (Unit.File_Names (Specification).Project); + (Project => Unit.File_Names (Specification).Project, + In_Tree => In_Tree); Path := Unit.File_Names (Specification).Display_Path; if Current_Verbosity > Default then @@ -1625,7 +1718,8 @@ package body Prj.Env is Original_Name) then Project := Ultimate_Extension_Of - (Unit.File_Names (Body_Part).Project); + (Project => Unit.File_Names (Body_Part).Project, + In_Tree => In_Tree); Path := Unit.File_Names (Body_Part).Display_Path; if Current_Verbosity > Default then @@ -1651,12 +1745,9 @@ package body Prj.Env is -- Initialize -- ---------------- - -- This is a place holder for possible required initialization in - -- the future. In the current version no initialization is required. - procedure Initialize is begin - null; + Fill_Mapping_File := True; end Initialize; ------------------------------------ @@ -1667,9 +1758,11 @@ package body Prj.Env is function Path_Name_Of_Library_Unit_Body (Name : String; - Project : Project_Id) return String + Project : Project_Id; + In_Tree : Project_Tree_Ref) return String is - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); Original_Name : String := Name; Extended_Spec_Name : String := @@ -1679,7 +1772,7 @@ package body Prj.Env is Name & Namet.Get_Name_String (Data.Naming.Ada_Body_Suffix); - First : Unit_Id := Units.First; + First : Unit_Id := Unit_Table.First; Current : Unit_Id; Unit : Unit_Data; @@ -1703,15 +1796,16 @@ package body Prj.Env is Write_Eol; end if; - while First <= Units.Last - and then Units.Table (First).File_Names (Body_Part).Project /= Project + while First <= Unit_Table.Last (In_Tree.Units) + and then In_Tree.Units.Table + (First).File_Names (Body_Part).Project /= Project loop First := First + 1; end loop; Current := First; - while Current <= Units.Last loop - Unit := Units.Table (Current); + while Current <= Unit_Table.Last (In_Tree.Units) loop + Unit := In_Tree.Units.Table (Current); if Unit.File_Names (Body_Part).Project = Project and then Unit.File_Names (Body_Part).Name /= No_Name @@ -1732,14 +1826,14 @@ package body Prj.Env is Write_Line (" OK"); end if; - return Body_Path_Name_Of (Current); + return Body_Path_Name_Of (Current, In_Tree); elsif Current_Name = Extended_Body_Name then if Current_Verbosity = High then Write_Line (" OK"); end if; - return Body_Path_Name_Of (Current); + return Body_Path_Name_Of (Current, In_Tree); else if Current_Verbosity = High then @@ -1767,14 +1861,14 @@ package body Prj.Env is Write_Line (" OK"); end if; - return Spec_Path_Name_Of (Current); + return Spec_Path_Name_Of (Current, In_Tree); elsif Current_Name = Extended_Spec_Name then if Current_Verbosity = High then Write_Line (" OK"); end if; - return Spec_Path_Name_Of (Current); + return Spec_Path_Name_Of (Current, In_Tree); else if Current_Verbosity = High then @@ -1795,14 +1889,16 @@ package body Prj.Env is -- Could use some comments in this body ??? - procedure Print_Sources is + procedure Print_Sources (In_Tree : Project_Tree_Ref) is Unit : Unit_Data; begin Write_Line ("List of Sources:"); - for Id in Units.First .. Units.Last loop - Unit := Units.Table (Id); + for Id in Unit_Table.First .. + Unit_Table.Last (In_Tree.Units) + loop + Unit := In_Tree.Units.Table (Id); Write_Str (" "); Write_Line (Namet.Get_Name_String (Unit.Name)); @@ -1813,7 +1909,7 @@ package body Prj.Env is else Write_Str (" Project: "); Get_Name_String - (Projects.Table + (In_Tree.Projects.Table (Unit.File_Names (Specification).Project).Path_Name); Write_Line (Name_Buffer (1 .. Name_Len)); end if; @@ -1831,7 +1927,7 @@ package body Prj.Env is else Write_Str (" Project: "); Get_Name_String - (Projects.Table + (In_Tree.Projects.Table (Unit.File_Names (Body_Part).Project).Path_Name); Write_Line (Name_Buffer (1 .. Name_Len)); end if; @@ -1852,13 +1948,15 @@ package body Prj.Env is function Project_Of (Name : String; - Main_Project : Project_Id) return Project_Id + Main_Project : Project_Id; + In_Tree : Project_Tree_Ref) return Project_Id is Result : Project_Id := No_Project; Original_Name : String := Name; - Data : constant Project_Data := Projects.Table (Main_Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Main_Project); Extended_Spec_Name : String := Name & Namet.Get_Name_String @@ -1891,8 +1989,10 @@ package body Prj.Env is Name_Buffer (1 .. Name_Len) := Extended_Body_Name; The_Body_Name := Name_Find; - for Current in reverse Units.First .. Units.Last loop - Unit := Units.Table (Current); + for Current in reverse Unit_Table.First .. + Unit_Table.Last (In_Tree.Units) + loop + Unit := In_Tree.Units.Table (Current); -- Check for body @@ -1936,8 +2036,10 @@ package body Prj.Env is -- Get the ultimate extending project if Result /= No_Project then - while Projects.Table (Result).Extended_By /= No_Project loop - Result := Projects.Table (Result).Extended_By; + while In_Tree.Projects.Table (Result).Extended_By /= + No_Project + loop + Result := In_Tree.Projects.Table (Result).Extended_By; end loop; end if; @@ -1950,6 +2052,7 @@ package body Prj.Env is procedure Set_Ada_Paths (Project : Project_Id; + In_Tree : Project_Tree_Ref; Including_Libraries : Boolean) is Source_FD : File_Descriptor := Invalid_FD; @@ -1986,11 +2089,12 @@ package body Prj.Env is begin -- If Seen is False, then the project has not yet been visited - if not Projects.Table (Project).Seen then - Projects.Table (Project).Seen := True; + if not In_Tree.Projects.Table (Project).Seen then + In_Tree.Projects.Table (Project).Seen := True; declare - Data : constant Project_Data := Projects.Table (Project); + Data : constant Project_Data := + In_Tree.Projects.Table (Project); List : Project_List := Data.Imported_Projects; begin @@ -1999,8 +2103,10 @@ package body Prj.Env is -- Add to path all source directories of this project -- if there are Ada sources. - if Projects.Table (Project).Ada_Sources_Present then - Add_To_Source_Path (Data.Source_Dirs); + if In_Tree.Projects.Table + (Project).Ada_Sources_Present + then + Add_To_Source_Path (Data.Source_Dirs, In_Tree); end if; end if; @@ -2025,16 +2131,18 @@ package body Prj.Env is if Data.Object_Directory = No_Name or else Contains_ALI_Files (Data.Library_Dir) then - Add_To_Object_Path (Data.Library_Dir); + Add_To_Object_Path (Data.Library_Dir, In_Tree); else - Add_To_Object_Path (Data.Object_Directory); + Add_To_Object_Path + (Data.Object_Directory, In_Tree); end if; -- For a non-library project, add the object -- directory, if it is not a virtual project. elsif not Data.Virtual then - Add_To_Object_Path (Data.Object_Directory); + Add_To_Object_Path + (Data.Object_Directory, In_Tree); end if; end if; end if; @@ -2048,19 +2156,24 @@ package body Prj.Env is -- Call Add for each imported project, if any while List /= Empty_Project_List loop - Recursive_Add (Project_Lists.Table (List).Project); - List := Project_Lists.Table (List).Next; + Recursive_Add + (In_Tree.Project_Lists.Table + (List).Project); + List := + In_Tree.Project_Lists.Table (List).Next; end loop; end; end if; end Recursive_Add; begin - Source_Paths.Set_Last (0); - Object_Paths.Set_Last (0); + Source_Path_Table.Set_Last (In_Tree.Private_Part.Source_Paths, 0); + Object_Path_Table.Set_Last (In_Tree.Private_Part.Object_Paths, 0); - for Index in 1 .. Projects.Last loop - Projects.Table (Index).Seen := False; + for Index in Project_Table.First .. + Project_Table.Last (In_Tree.Projects) + loop + In_Tree.Projects.Table (Index).Seen := False; end loop; Recursive_Add (Proj); @@ -2072,30 +2185,35 @@ package body Prj.Env is -- If it is the first time we call this procedure for -- this project, compute the source path and/or the object path. - if Projects.Table (Project).Include_Path_File = No_Name then + if In_Tree.Projects.Table (Project).Include_Path_File = + No_Name + then Process_Source_Dirs := True; Create_New_Path_File - (Source_FD, Projects.Table (Project).Include_Path_File); + (In_Tree, Source_FD, + In_Tree.Projects.Table (Project).Include_Path_File); end if; -- For the object path, we make a distinction depending on -- Including_Libraries. if Including_Libraries then - if Projects.Table (Project).Objects_Path_File_With_Libs = No_Name then + if In_Tree.Projects.Table + (Project).Objects_Path_File_With_Libs = No_Name + then Process_Object_Dirs := True; Create_New_Path_File - (Object_FD, Projects.Table (Project). + (In_Tree, Object_FD, In_Tree.Projects.Table (Project). Objects_Path_File_With_Libs); end if; else - if - Projects.Table (Project).Objects_Path_File_Without_Libs = No_Name + if In_Tree.Projects.Table + (Project).Objects_Path_File_Without_Libs = No_Name then Process_Object_Dirs := True; Create_New_Path_File - (Object_FD, Projects.Table (Project). + (In_Tree, Object_FD, In_Tree.Projects.Table (Project). Objects_Path_File_Without_Libs); end if; end if; @@ -2110,8 +2228,11 @@ package body Prj.Env is -- Write and close any file that has been created. if Source_FD /= Invalid_FD then - for Index in 1 .. Source_Paths.Last loop - Get_Name_String (Source_Paths.Table (Index)); + for Index in Source_Path_Table.First .. + Source_Path_Table.Last + (In_Tree.Private_Part.Source_Paths) + loop + Get_Name_String (In_Tree.Private_Part.Source_Paths.Table (Index)); Name_Len := Name_Len + 1; Name_Buffer (Name_Len) := ASCII.LF; Len := Write (Source_FD, Name_Buffer (1)'Address, Name_Len); @@ -2129,8 +2250,11 @@ package body Prj.Env is end if; if Object_FD /= Invalid_FD then - for Index in 1 .. Object_Paths.Last loop - Get_Name_String (Object_Paths.Table (Index)); + for Index in Object_Path_Table.First .. + Object_Path_Table.Last + (In_Tree.Private_Part.Object_Paths) + loop + Get_Name_String (In_Tree.Private_Part.Object_Paths.Table (Index)); Name_Len := Name_Len + 1; Name_Buffer (Name_Len) := ASCII.LF; Len := Write (Object_FD, Name_Buffer (1)'Address, Name_Len); @@ -2151,10 +2275,10 @@ package body Prj.Env is -- corresponding flags. if Current_Source_Path_File /= - Projects.Table (Project).Include_Path_File + In_Tree.Projects.Table (Project).Include_Path_File then Current_Source_Path_File := - Projects.Table (Project).Include_Path_File; + In_Tree.Projects.Table (Project).Include_Path_File; Set_Path_File_Var (Project_Include_Path_File, Get_Name_String (Current_Source_Path_File)); @@ -2163,10 +2287,12 @@ package body Prj.Env is if Including_Libraries then if Current_Object_Path_File - /= Projects.Table (Project).Objects_Path_File_With_Libs + /= In_Tree.Projects.Table + (Project).Objects_Path_File_With_Libs then Current_Object_Path_File := - Projects.Table (Project).Objects_Path_File_With_Libs; + In_Tree.Projects.Table + (Project).Objects_Path_File_With_Libs; Set_Path_File_Var (Project_Objects_Path_File, Get_Name_String (Current_Object_Path_File)); @@ -2174,11 +2300,13 @@ package body Prj.Env is end if; else - if Current_Object_Path_File - /= Projects.Table (Project).Objects_Path_File_Without_Libs + if Current_Object_Path_File /= + In_Tree.Projects.Table + (Project).Objects_Path_File_Without_Libs then Current_Object_Path_File := - Projects.Table (Project).Objects_Path_File_Without_Libs; + In_Tree.Projects.Table + (Project).Objects_Path_File_Without_Libs; Set_Path_File_Var (Project_Objects_Path_File, Get_Name_String (Current_Object_Path_File)); @@ -2217,14 +2345,17 @@ package body Prj.Env is -- Spec_Path_Name_Of -- ----------------------- - function Spec_Path_Name_Of (Unit : Unit_Id) return String is - Data : Unit_Data := Units.Table (Unit); + function Spec_Path_Name_Of + (Unit : Unit_Id; In_Tree : Project_Tree_Ref) return String + is + Data : Unit_Data := In_Tree.Units.Table (Unit); begin if Data.File_Names (Specification).Path = No_Name then declare Current_Source : String_List_Id := - Projects.Table (Data.File_Names (Specification).Project).Sources; + In_Tree.Projects.Table + (Data.File_Names (Specification).Project).Sources; Path : GNAT.OS_Lib.String_Access; begin @@ -2236,7 +2367,8 @@ package body Prj.Env is (Namet.Get_Name_String (Data.File_Names (Specification).Name), Namet.Get_Name_String - (String_Elements.Table (Current_Source).Value)); + (In_Tree.String_Elements.Table + (Current_Source).Value)); if Path /= null then Name_Len := Path'Length; @@ -2245,11 +2377,12 @@ package body Prj.Env is exit; else Current_Source := - String_Elements.Table (Current_Source).Next; + In_Tree.String_Elements.Table + (Current_Source).Next; end if; end loop; - Units.Table (Unit) := Data; + In_Tree.Units.Table (Unit) := Data; end; end if; @@ -2260,21 +2393,19 @@ package body Prj.Env is -- Ultimate_Extension_Of -- --------------------------- - function Ultimate_Extension_Of (Project : in Project_Id) return Project_Id + function Ultimate_Extension_Of + (Project : Project_Id; In_Tree : Project_Tree_Ref) return Project_Id is Result : Project_Id := Project; begin - while Projects.Table (Result).Extended_By /= No_Project loop - Result := Projects.Table (Result).Extended_By; + while In_Tree.Projects.Table (Result).Extended_By /= + No_Project + loop + Result := In_Tree.Projects.Table (Result).Extended_By; end loop; return Result; end Ultimate_Extension_Of; --- Package initialization --- What is relationshiop to procedure Initialize - -begin - Path_Files.Set_Last (0); end Prj.Env; |