DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - downloadIndex: ┃ B T ┃
Length: 42997 (0xa7f5) Types: TextFile Names: »B«
└─⟦a7d1ea751⟧ Bits:30000550 8mm tape, Rational 1000, !users!projects 94_04_11 └─ ⟦129cab021⟧ »DATA« └─⟦this⟧ └─⟦2f6cfab89⟧ Bits:30000547 8mm tape, Rational 1000, !projects 94-01-04 └─ ⟦d65440be7⟧ »DATA« └─⟦this⟧
with Diana; with Directory; with Object_Subclass; with String_Utilities; with Semantic_Attributes; with Activity_Implementation; package body Object_Sets is -- function "=" (This_Class : in Directory_Tools.Object.Class_Enumeration; That_Class : in Directory_Tools.Object.Class_Enumeration) return Boolean renames Directory_Tools.Object."="; -- function "=" (This_Kind : in Directory_Tools.Ada_Object.Compilation_Kind; That_Kind : in Directory_Tools.Ada_Object.Compilation_Kind) return Boolean renames Directory_Tools.Ada_Object."="; -- function "=" (This_Kind : in Directory_Tools.Ada_Object.Unit_Kind; That_Kind : in Directory_Tools.Ada_Object.Unit_Kind) return Boolean renames Directory_Tools.Ada_Object."="; -- function "+" (This_Set : in Object_Set; That_Set : in Object_Set) return Object_Set renames Union; -- function Empty_Set return Object_Set is begin return (Directory_Tools.Object.Create); end Empty_Set; -- function Is_Empty (This_Set : in Object_Set) return Boolean is begin return (Number_In (This_Set) = 0); end Is_Empty; -- function Number_In (This_Set : in Object_Set) return Natural is -- Working_Set : Object_Set := This_Set; Count : Natural := 0; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop Count := Count + 1; Directory_Tools.Object.Next (Working_Set); end loop; return (Count); end Number_In; -- function Are_Equal (This_Set : in Object_Set; That_Set : in Object_Set) return Boolean is -- Working_Set : Object_Set := This_Set; Result : Boolean := True; -- begin if (Number_In (This_Set) /= Number_In (That_Set)) then Result := False; else Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop if (not Is_Member (That_Set, Directory_Tools.Object.Value (Working_Set))) then -- Found object in one set which isn't in other set. Result := False; exit; end if; Directory_Tools.Object.Next (Working_Set); end loop; end if; return (Result); end Are_Equal; -- function Copy_Of (This_Set : in Object_Set) return Object_Set is -- Working_Set : Object_Set := This_Set; Copy_Set : Object_Set := Empty_Set; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop Add (Directory_Tools.Object.Value (Working_Set), Copy_Set); Directory_Tools.Object.Next (Working_Set); end loop; return (Copy_Set); end Copy_Of; -- function Is_Member (This_Set : in Object_Set; This_Object : in Object) return Boolean is begin return (Directory_Tools.Object.Has (This_Set, This_Object)); end Is_Member; -- procedure Add (This_Object : in Object; This_Set : in out Object_Set) is -- Dummy : Boolean; -- begin if ((not Directory_Tools.Object.Is_Bad (This_Object)) and (not Is_Member (This_Set, This_Object))) then Directory_Tools.Object.Add (This_Set, This_Object, Dummy); end if; end Add; -- procedure Remove (This_Object : in Object; This_Set : in out Object_Set) is -- Dummy : Boolean; -- begin Directory_Tools.Object.Remove (This_Set, This_Object, Dummy); end Remove; -- procedure Sort (This_Set : in out Object_Set) is -- type Sorted_Array is array (1 .. Number_In (This_Set)) of Boolean; -- Already_Sorted : Sorted_Array := (others => False); Remaining : Natural := Number_In (This_Set); Sorted_Set : Object_Set := Empty_Set; Smallest_This_Pass : Object; Index_Of_Smallest : Natural; Current_Index : Natural; -- begin while (Remaining > 0) loop Current_Index := 1; Directory_Tools.Object.Reset (This_Set); Smallest_This_Pass := Directory_Tools.Object.Value (This_Set); while (not Directory_Tools.Object.Done (This_Set)) loop if (not Already_Sorted (Current_Index)) then -- Current element hasn't already been put in -- the sorted array, so test it. if (Directory_Tools.Object.Value (This_Set) < Smallest_This_Pass) then -- Current element is smaller than the smallest -- element found so far on this pass, so make -- it the new smallest. Smallest_This_Pass := Directory_Tools.Object.Value (This_Set); Index_Of_Smallest := Current_Index; end if; end if; Directory_Tools.Object.Next (This_Set); Current_Index := Current_Index + 1; end loop; Add (Smallest_This_Pass, Sorted_Set); Already_Sorted (Index_Of_Smallest) := True; Remaining := Remaining - 1; end loop; This_Set := Sorted_Set; end Sort; -- procedure Filter (This_Set : in out Object_Set) is -- New_Set : Object_Set := Empty_Set; -- begin Directory_Tools.Object.Reset (This_Set); while (not Directory_Tools.Object.Done (This_Set)) loop if (not Dont_Want (Directory_Tools.Object.Value (This_Set))) then -- Want current object, so add it. Add (Directory_Tools.Object.Value (This_Set), New_Set); end if; Directory_Tools.Object.Next (This_Set); end loop; This_Set := New_Set; end Filter; -- procedure Process_Objects (This_Set : in out Object_Set) is begin Directory_Tools.Object.Reset (This_Set); while (not Directory_Tools.Object.Done (This_Set)) loop declare Current_Object : Object := Directory_Tools.Object.Value (This_Set); begin Process (Current_Object); end; Directory_Tools.Object.Next (This_Set); end loop; end Process_Objects; -- procedure Process_Objects_With_State (This_Set : in out Object_Set; This_State : in out Process_State) is begin Initialize (This_State); Directory_Tools.Object.Reset (This_Set); while (not Directory_Tools.Object.Done (This_Set)) loop declare Current_Object : Object := Directory_Tools.Object.Value (This_Set); begin Process (Current_Object, This_State); end; Directory_Tools.Object.Next (This_Set); end loop; Finalize (This_State); end Process_Objects_With_State; -- function Union (This_Set : in Object_Set; That_Set : in Object_Set) return Object_Set is -- Union_Set : Object_Set := Empty_Set; -- procedure Union_Copy (This_Set : in Object_Set; New_Set : in out Object_Set) is -- Working_Set : Object_Set := This_Set; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop Add (Directory_Tools.Object.Value (Working_Set), New_Set); Directory_Tools.Object.Next (Working_Set); end loop; end Union_Copy; -- begin Union_Copy (This_Set, Union_Set); Union_Copy (That_Set, Union_Set); return (Union_Set); end Union; -- function Intersection (This_Set : in Object_Set; That_Set : in Object_Set) return Object_Set is -- Working_Set : Object_Set := This_Set; Intersection_Set : Object_Set := Empty_Set; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop if (Is_Member (That_Set, Directory_Tools.Object.Value (Working_Set))) then -- Found an object in the one set which is also in the -- other set, so add it to the intersection set. Add (Directory_Tools.Object.Value (Working_Set), Intersection_Set); end if; Directory_Tools.Object.Next (Working_Set); end loop; return (Intersection_Set); end Intersection; -- function Exclusive_Or (This_Set : in Object_Set; That_Set : in Object_Set) return Object_Set is -- Xor_Set : Object_Set := Empty_Set; -- procedure Xor_Copy (This_Set : in Object_Set; Except_For : in Object_Set; Into : in out Object_Set) is -- Working_Set : Object_Set := This_Set; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop if (not Is_Member (Except_For, Directory_Tools.Object.Value (Working_Set))) then -- Found an object in the one set which is not also -- in the other set, so add it to the new set. Add (Directory_Tools.Object.Value (Working_Set), Into); end if; Directory_Tools.Object.Next (Working_Set); end loop; end Xor_Copy; -- begin Xor_Copy (This_Set, That_Set, Xor_Set); Xor_Copy (That_Set, This_Set, Xor_Set); return (Xor_Set); end Exclusive_Or; -- function Subtraction (This_Set : in Object_Set; Except_For : in Object_Set) return Object_Set is -- Working_Set : Object_Set := This_Set; Subtraction_Set : Object_Set := Empty_Set; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop if (not Is_Member (Except_For, Directory_Tools.Object.Value (Working_Set))) then -- Found an object in the one set which is not also -- in the other set, so add it to the subtraction set. Add (Directory_Tools.Object.Value (Working_Set), Subtraction_Set); end if; Directory_Tools.Object.Next (Working_Set); end loop; return (Subtraction_Set); end Subtraction; -- function Subset (This_Set : in Object_Set; Contains : in Object_Set) return Boolean is -- Working_Set : Object_Set := Contains; Result : Boolean := True; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop if (not Is_Member (This_Set, Directory_Tools.Object.Value (Working_Set))) then -- Found an object in "Contains" which is not in the -- other set, so is not a subset of the other set. Result := False; exit; end if; Directory_Tools.Object.Next (Working_Set); end loop; return (Result); end Subset; -- function Proper_Subset (This_Set : in Object_Set; Contains : in Object_Set) return Boolean is begin return (Subset (This_Set, Contains) and (Number_In (This_Set) > Number_In (Contains))); end Proper_Subset; -- function Is_Universe_Mirror (This_Unit : in Object) return Boolean is -- -- Diana hacking because no predicate is available. -- The_Root : Directory.Ada.Root; The_Status : Directory.Error_Status; Object_Id : Diana.Tree; Pragmas : Diana.Sequence; -- Is_Subsystem_Interface : Boolean := False; Has_Module_Name : Boolean := False; -- begin -- Find the root of the object. Directory_Tools.Object.Low_Level.Get_Root (This_Unit, The_Root, The_Status); -- Get the id for the object. Object_Id := Diana.Id_Utilities.Comp_Unit_Id (The_Root); -- See if is a subsystem interface. Is_Subsystem_Interface := Semantic_Attributes.Has_Sm_Subsystem_Interface (Object_Id); if (Is_Subsystem_Interface) then -- Since is subsystem interface, see if has a pragma -- for Module_Name in it: if so, it is a universe mirror. Pragmas := Semantic_Attributes.Sm_Applied_Pragmas (Object_Id); while (not Diana.Is_Empty (Pragmas)) loop if (String_Utilities.Upper_Case (Diana.Image (Diana.Id (Diana.As_Id (Diana.Head (Pragmas))))) = "MODULE_NAME") then Has_Module_Name := True; exit; end if; Pragmas := Diana.Tail (Pragmas); end loop; end if; return (Is_Subsystem_Interface and Has_Module_Name); end Is_Universe_Mirror; -- function Is_Spec (This_Object : in Object) return Boolean is begin return (Directory_Tools.Ada_Object.Is_Visible_Part (This_Object)); end Is_Spec; -- procedure Screen (These_Units : in out Object_Set; Exclude : in Object_Set; Specs_Only : in Boolean; Include_Universe_Mirrors : in Boolean) is -- Screened : Object_Set := Empty_Set; -- Current : Object; -- begin Directory_Tools.Object.Reset (These_Units); while (not Directory_Tools.Object.Done (These_Units)) loop Current := Directory_Tools.Object.Value (These_Units); if (Directory_Tools.Object.Is_Bad (Current)) then -- Current unit is bad, so don't add it. null; elsif (Directory_Tools.Object.Has (Exclude, Current)) then -- Already have the current unit, so don't add it. null; elsif ((Specs_Only) and then (not Is_Spec (Current))) then -- Client wants specs only, and current unit is not a spec, -- so don't add it. null; elsif ((not Include_Universe_Mirrors) and then (Is_Universe_Mirror (Current))) then -- Client doesn't want universe mirrors, and current unit is -- a universe mirror, so don't add it. null; else -- Current unit met all criteria, so add it. Add (Current, Screened); end if; Directory_Tools.Object.Next (These_Units); end loop; These_Units := Screened; end Screen; -- generic with function Immediate_Dependencies (This_Object : in Object; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Object_Set; function Single_Unit_Dependency_Closure (Unit : in Object; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set; function Single_Unit_Dependency_Closure (Unit : in Object; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is -- Closure : Object_Set := Empty_Set; New_Units : Object_Set := Empty_Set; -- procedure Get_Next_Units (These_Units : in out Object_Set) is -- New_Units : Object_Set := Empty_Set; -- begin Directory_Tools.Object.Reset (These_Units); while (not Directory_Tools.Object.Done (These_Units)) loop New_Units := New_Units + Immediate_Dependencies (Directory_Tools.Object.Value (These_Units), Code_Share_Generics, This_Activity); Directory_Tools.Object.Next (These_Units); end loop; These_Units := New_Units; end Get_Next_Units; -- begin New_Units := Immediate_Dependencies (Unit, Code_Share_Generics, This_Activity); loop Screen (New_Units, Closure, Specs_Only, Include_Universe_Mirrors); Closure := Closure + New_Units; if (not Transitive) then -- Only needed to calculate first level. exit; elsif (Is_Empty (New_Units)) then -- There were no new units, so closure is complete. exit; else -- There are more units requiring processing. Get_Next_Units (New_Units); end if; end loop; return (Closure); end Single_Unit_Dependency_Closure; -- generic with function Single_Unit_Dependency_Closure_Instantiation (Unit : in Object; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set; function Multiple_Unit_Dependency_Closure (Units : in Object_Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set; function Multiple_Unit_Dependency_Closure (Units : in Object_Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is -- Working_Set : Object_Set := Units; Closure : Object_Set := Empty_Set; -- begin Directory_Tools.Object.Reset (Working_Set); while (not Directory_Tools.Object.Done (Working_Set)) loop Closure := Closure + Single_Unit_Dependency_Closure_Instantiation (Directory_Tools.Object.Value (Working_Set), Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity); Directory_Tools.Object.Next (Working_Set); end loop; return (Closure); end Multiple_Unit_Dependency_Closure; -- -- ***** UNTIL NEXT MARK LIKE THIS, CAN BE REPLACED BY OBJECT_INFO. -- function Subclasses_Equal (This_Object : in Object; This_Subclass : in Directory.Subclass) return Boolean is -- function "=" (This_Subclass : in Directory.Subclass; That_Subclass : in Directory.Subclass) return Boolean renames Directory."="; -- function "=" (This_Error_Status : in Directory.Error_Status; That_Error_Status : in Directory.Error_Status) return Boolean renames Directory."="; -- The_Object : Directory.Object; The_Subclass : Directory.Subclass; The_Status : Directory.Error_Status; -- begin Directory_Tools.Object.Low_Level.Get_Object (This_Object, The_Object, The_Status); The_Subclass := Directory.Get_Subclass (The_Object); return ((The_Status = Directory.Successful) and (The_Subclass = This_Subclass)); end Subclasses_Equal; -- function Is_Spec_View (This_Object : in Directory_Tools.Object.Handle) return Boolean is begin return (Subclasses_Equal (This_Object, Object_Subclass.Spec_View_Subclass)); end Is_Spec_View; -- function Is_Load_View (This_Object : in Directory_Tools.Object.Handle) return Boolean is begin return (Subclasses_Equal (This_Object, Object_Subclass.Load_View_Subclass)); end Is_Load_View; -- generic with function Is_Correct_Kind (This_Library : in Directory_Tools.Object.Handle) return Boolean; function Is_Enclosed (This_Object : in Object) return Boolean; -- function Is_Enclosed (This_Object : in Object) return Boolean is -- -- This function finds successive enclosing libraries of the original -- object and tests each one to determine if it is the correct kind -- or not. -- Current_Library : Object; -- Result : Boolean := False; -- begin if (Directory_Tools.Naming.Full_Name (This_Object) = "!") then -- Cannot be contained by anything, because already at root. Result := False; else Current_Library := Directory_Tools.Traversal. Enclosing_Library (This_Object); loop if (Is_Correct_Kind (Current_Library)) then -- Found an enclosing library of the correct kind. Result := True; exit; elsif (Directory_Tools.Naming. Full_Name (Current_Library) = "!") then -- Worked our way all the way up to the root without finding -- an enclosing object of the correct kind. exit; else -- Keep looking. Current_Library := Directory_Tools.Traversal. Enclosing_Library (Current_Library); end if; end loop; end if; return (Result); end Is_Enclosed; -- function Is_Enclosed_By_Spec_View is new Is_Enclosed (Is_Spec_View); function Is_Contained_By_Spec_View (This_Object : in Directory_Tools.Object.Handle) return Boolean is begin return (Is_Enclosed_By_Spec_View (This_Object)); end Is_Contained_By_Spec_View; -- function Is_Enclosed_By_Load_View is new Is_Enclosed (Is_Load_View); -- function Is_Contained_By_Load_View (This_Object : in Directory_Tools.Object.Handle) return Boolean is begin return (Is_Enclosed_By_Load_View (This_Object)); end Is_Contained_By_Load_View; -- -- ****** END OF STUFF THAT CAN BE REPLACED BY OBJECT_INFO. -- ****** SOME OF THE STUFF BELOW SHOULD BE ADDED TO OBJECT_INFO. -- function Is_Spec_In_Spec_View (This_Object : in Object) return Boolean is -- -- Returns True if the specified object is a spec in a view. -- begin return ((Is_Spec (This_Object)) and then (Is_Contained_By_Spec_View (This_Object))); end Is_Spec_In_Spec_View; -- function Is_Spec_In_Load_View (This_Object : in Object) return Boolean is -- -- Returns True if the specified object is a spec in a view. -- begin return ((Is_Spec (This_Object)) and then (Is_Contained_By_Load_View (This_Object))); end Is_Spec_In_Load_View; -- function Is_Subsystem (This_Object : in Object) return Boolean is begin return ((Subclasses_Equal (This_Object, Object_Subclass.Subsystem_Subclass)) or (Subclasses_Equal (This_Object, Object_Subclass. Spec_Load_Subsystem_Subclass)) or (Subclasses_Equal (This_Object, Object_Subclass. Combined_Subsystem_Subclass))); end Is_Subsystem; -- function Is_Root (This_Object : in Object) return Boolean is begin return (Directory_Tools.Naming.Full_Name (This_Object) = "!"); end Is_Root; -- function Bogus_Object return Object is begin return (Directory_Tools.Naming.Resolution ("%*$&")); end Bogus_Object; -- function Subsystem_Containing (This_Object : in Object) return Object is -- Current_Library : Object := This_Object; -- begin loop if (Is_Root (Current_Library)) then Current_Library := Bogus_Object; exit; else Current_Library := Directory_Tools.Traversal.Enclosing_Library (Current_Library); if (Is_Subsystem (Current_Library)) then -- Found the enclosing subsystem. exit; end if; end if; end loop; return (Current_Library); end Subsystem_Containing; -- function Spec_In_Other_View (This_Object : in Object; This_Activity : in Activity.Activity_Name) return Object is -- -- If the specified object is a spec in a view, returns the spec -- associated with it in the other view, as specified by the -- activity. If no such spec exists, returns a bogus object. -- Subsystem_Id : Activity_Implementation.Subsystem_Id; Activity_Id : Activity_Implementation.Activity_Id; Activity_Handle : Activity_Implementation.Activity_Handle; Name_Status : Directory.Naming.Name_Status; Error_Status : Directory.Error_Status; Current_View : Directory.Object; Other_View : Directory.Object; Other_Spec : Object := Bogus_Object; -- function Spec_Matching (Current_Spec : in Object; View_Containing_Current_Spec : in Directory.Object; View_Containing_Other_Spec : in Directory.Object) return Object is -- Name_Of_View_Containing_Current_Spec : constant String := Directory.Naming.Get_Full_Name (View_Containing_Current_Spec); Name_Of_View_Containing_Other_Spec : constant String := Directory.Naming.Get_Full_Name (View_Containing_Other_Spec); Name_Of_Current_Spec : constant String := Directory_Tools.Naming.Full_Name (Current_Spec); Name_Of_Other_Spec : constant String := Name_Of_View_Containing_Other_Spec & Name_Of_Current_Spec ((Name_Of_Current_Spec'First + Name_Of_View_Containing_Current_Spec'Length) .. Name_Of_Current_Spec'Last); -- begin return (Directory_Tools.Naming.Resolution (Name_Of_Other_Spec)); end Spec_Matching; -- begin Directory.Naming.Resolve (Name => Directory_Tools.Naming.Full_Name (Subsystem_Containing (This_Object)), The_Object => Subsystem_Id, Status => Name_Status); Directory.Naming.Resolve (Name => This_Activity, The_Object => Activity_Id, Status => Name_Status); Activity_Implementation.Open (Activity_Id, Activity_Handle, Error_Status); if (Is_Spec_In_Spec_View (This_Object)) then Current_View := Activity_Implementation.Get_Spec_View (Subsystem_Id, Activity_Handle); Other_View := Activity_Implementation.Get_Load_View (Subsystem_Id, Activity_Handle); Other_Spec := Spec_Matching (This_Object, Current_View, Other_View); elsif (Is_Spec_In_Load_View (This_Object)) then Current_View := Activity_Implementation.Get_Load_View (Subsystem_Id, Activity_Handle); Other_View := Activity_Implementation.Get_Spec_View (Subsystem_Id, Activity_Handle); Other_Spec := Spec_Matching (This_Object, Current_View, Other_View); end if; Activity_Implementation.Close (Activity_Handle, Error_Status); return (Other_Spec); -- exception when others => return (Other_Spec); -- end Spec_In_Other_View; -- function Spec_For (This_Object : in Object) return Object is -- -- For a subunit or body, returns the spec associated with -- the subunit or body. For a spec, returns the spec itself. -- Current_Object : Object := This_Object; -- begin -- First, find parents transitively until get to body. while (Directory_Tools.Ada_Object.Is_Subunit (Current_Object)) loop Current_Object := Directory_Tools.Traversal.Parent (Current_Object); end loop; if (not Is_Spec (Current_Object)) then -- Find spec associated with body. Current_Object := Directory_Tools.Ada_Object.Other_Part (Current_Object); end if; return (Current_Object); end Spec_For; -- function Is_Body (This_Object : in Object) return Boolean is -- -- Returns True if the specified object is a body. -- Unit_Kind : Directory_Tools.Ada_Object.Unit_Kind := Directory_Tools.Ada_Object.Kind (This_Object); -- begin return ((Unit_Kind = Directory_Tools.Ada_Object.Package_Body) or (Unit_Kind = Directory_Tools.Ada_Object.Procedure_Body) or (Unit_Kind = Directory_Tools.Ada_Object.Function_Body)); end Is_Body; -- function Is_Subunit (This_Object : in Object) return Boolean is -- -- Returns True if the specified object is a subunit. -- Compilation_Kind : Directory_Tools.Ada_Object.Compilation_Kind := Directory_Tools.Ada_Object.Kind (This_Object); -- begin return (Compilation_Kind = Directory_Tools.Ada_Object.Subunit); end Is_Subunit; -- function Is_Body_Or_Subunit (This_Object : in Object) return Boolean is -- -- Returns True if the specified object is a body or subunit. -- begin return ((Is_Body (This_Object)) or (Is_Subunit (This_Object))); end Is_Body_Or_Subunit; -- function Is_Generic_Spec (This_Object : in Object) return Boolean is -- -- Returns True if the spec specified object is a generic spec. -- Object_Kind : Directory_Tools.Ada_Object.Unit_Kind := Directory_Tools.Ada_Object.Kind (This_Object); -- begin return ((Is_Spec (This_Object)) and then ((Object_Kind = Directory_Tools.Ada_Object. Generic_Package) or (Object_Kind = Directory_Tools.Ada_Object.Generic_Procedure) or (Object_Kind = Directory_Tools.Ada_Object.Generic_Function))); end Is_Generic_Spec; -- function Spec_Is_Generic_For (This_Object : in Object) return Boolean is -- -- Returns True if the spec associated with the specified object -- is a generic spec. -- begin return (Is_Generic_Spec (Spec_For (This_Object))); end Spec_Is_Generic_For; -- function Immediate_Dependencies_On (This_Object : in Object; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Object_Set is -- Dependencies : Object_Set := Directory_Tools.Ada_Object.Depends_On (This_Object); -- begin -- Deal with question of code sharing. if ((not Code_Share_Generics) and then (Is_Body_Or_Subunit (This_Object)) and then (Spec_Is_Generic_For (This_Object))) then -- Current object is body or subunit associated with -- a generic spec, and generic bodies are not code-shared. -- Therefore, the current object will be macro- -- inline expanded, and dependencies on the current -- object include dependencies on its spec. Dependencies := Dependencies + Directory_Tools.Ada_Object.Depends_On (Spec_For (This_Object)); end if; -- Perform spec look-through. if (Is_Spec_In_Load_View (This_Object)) then -- The object is a spec in a load view, so it has an associated spec -- in a spec view. Anything that depends on the spec in the spec view -- in actuality depends on the current object, so add the spec view -- spec to the dependencies (so that the next pass will get the -- dependencies on it). Add (Spec_In_Other_View (This_Object, This_Activity), Dependencies); end if; return (Dependencies); end Immediate_Dependencies_On; -- function Dependencies_On_Single_Unit is new Single_Unit_Dependency_Closure (Immediate_Dependencies_On); -- function Dependencies_On (Unit : in Object; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is begin return (Dependencies_On_Single_Unit (Unit, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity)); end Dependencies_On; -- function Dependencies_On_Multiple_Units is new Multiple_Unit_Dependency_Closure (Dependencies_On); -- function Dependencies_On (Units : in Object_Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is begin return (Dependencies_On_Multiple_Units (Units, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity)); end Dependencies_On; -- function Immediate_Dependencies_By (This_Object : in Object; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Object_Set is -- Dependencies : Object_Set := Withed_Objects (This_Object); -- Families_Of_Generic_Specs : Object_Set := Empty_Set; -- Specs_In_Load_Views : Object_Set := Empty_Set; -- begin -- Deal with bodies and subunits. if (Is_Subunit (This_Object)) then Add (Directory_Tools.Traversal.Parent (This_Object), Dependencies); elsif (Is_Body (This_Object)) then Add (Directory_Tools.Ada_Object.Other_Part (This_Object), Dependencies); end if; -- Deal with question of code sharing. if (not Code_Share_Generics) then Directory_Tools.Object.Reset (Dependencies); while (not Directory_Tools.Object.Done (Dependencies)) loop if (Is_Generic_Spec (Directory_Tools.Object.Value (Dependencies))) then -- The object depends on a generic spec. Since the body and -- subunits of the generic spec are not code-shared, they -- will be macro-inline expanded. Therefore, the object -- depends on the entire family of the generic spec. Families_Of_Generic_Specs := Families_Of_Generic_Specs + Family (Directory_Tools.Object.Value (Dependencies)); end if; Directory_Tools.Object.Next (Dependencies); end loop; end if; Dependencies := Dependencies + Families_Of_Generic_Specs; -- Perform spec look-through. Directory_Tools.Object.Reset (Dependencies); while (not Directory_Tools.Object.Done (Dependencies)) loop if (Is_Spec_In_Spec_View (Directory_Tools.Object.Value (Dependencies))) then -- The object depends on a spec in a spec view. So add -- the associated spec in the load view to the dependencies. Add (Spec_In_Other_View (Directory_Tools.Object.Value (Dependencies), This_Activity), Specs_In_Load_Views); end if; Directory_Tools.Object.Next (Dependencies); end loop; Dependencies := Dependencies + Specs_In_Load_Views; return (Dependencies); end Immediate_Dependencies_By; -- function Dependencies_By_Single_Unit is new Single_Unit_Dependency_Closure (Immediate_Dependencies_By); -- function Dependencies_By (Unit : in Object; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is begin return (Dependencies_By_Single_Unit (Unit, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity)); end Dependencies_By; -- function Dependencies_By_Multiple_Units is new Multiple_Unit_Dependency_Closure (Dependencies_By); -- function Dependencies_By (Units : in Object_Set; Specs_Only : in Boolean := False; Transitive : in Boolean := True; Include_Universe_Mirrors : in Boolean := False; Code_Share_Generics : in Boolean := True; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is begin return (Dependencies_By_Multiple_Units (Units, Specs_Only, Transitive, Include_Universe_Mirrors, Code_Share_Generics, This_Activity)); end Dependencies_By; -- function Withed_Objects (Unit : in Object) return Object_Set is begin return (Directory_Tools.Ada_Object.List_Of_Withs (Unit)); end Withed_Objects; -- function Immediate_Family_Dependencies_On (This_Object : in Object; Code_Share_Generics : in Boolean; This_Activity : in Activity.Activity_Name) return Object_Set is -- Dependencies : Object_Set := Directory_Tools.Ada_Object.Subunits (This_Object, Declared => False); -- begin if (Is_Spec (This_Object)) then -- Add body. Add (Directory_Tools.Ada_Object.Other_Part (This_Object), Dependencies); -- Add subunits. Dependencies := Dependencies + Directory_Tools.Ada_Object.Subunits (Directory_Tools.Ada_Object.Other_Part (This_Object)); -- Perform spec look-through. if (Is_Spec_In_Spec_View (This_Object)) then Add (Spec_In_Other_View (This_Object, This_Activity), Dependencies); end if; elsif (Is_Body_Or_Subunit (This_Object)) then -- Add subunits. Dependencies := Dependencies + Directory_Tools.Ada_Object.Subunits (This_Object); end if; return (Dependencies); end Immediate_Family_Dependencies_On; -- function Family_Dependencies_On is new Single_Unit_Dependency_Closure (Immediate_Family_Dependencies_On); -- function Family (Unit : in Object; This_Activity : in Activity.Activity_Name := Activity.Nil) return Object_Set is -- Family_Dependencies : Object_Set := Family_Dependencies_On (Unit, Specs_Only => False, Transitive => True, Include_Universe_Mirrors => True, Code_Share_Generics => True, This_Activity => This_Activity); -- begin Add (Unit, Family_Dependencies); return (Family_Dependencies); end Family; -- end Object_Sets;