1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2009, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Ada.Unchecked_Deallocation;
27 with Osint; use Osint;
30 package body Prj.Tree is
32 Node_With_Comments : constant array (Project_Node_Kind) of Boolean :=
34 N_With_Clause => True,
35 N_Project_Declaration => False,
36 N_Declarative_Item => False,
37 N_Package_Declaration => True,
38 N_String_Type_Declaration => True,
39 N_Literal_String => False,
40 N_Attribute_Declaration => True,
41 N_Typed_Variable_Declaration => True,
42 N_Variable_Declaration => True,
43 N_Expression => False,
45 N_Literal_String_List => False,
46 N_Variable_Reference => False,
47 N_External_Value => False,
48 N_Attribute_Reference => False,
49 N_Case_Construction => True,
51 N_Comment_Zones => True,
53 -- Indicates the kinds of node that may have associated comments
55 package Next_End_Nodes is new Table.Table
56 (Table_Component_Type => Project_Node_Id,
57 Table_Index_Type => Natural,
60 Table_Increment => 100,
61 Table_Name => "Next_End_Nodes");
62 -- A stack of nodes to indicates to what node the next "end" is associated
64 use Tree_Private_Part;
66 End_Of_Line_Node : Project_Node_Id := Empty_Node;
67 -- The node an end of line comment may be associated with
69 Previous_Line_Node : Project_Node_Id := Empty_Node;
70 -- The node an immediately following comment may be associated with
72 Previous_End_Node : Project_Node_Id := Empty_Node;
73 -- The node comments immediately following an "end" line may be
76 Unkept_Comments : Boolean := False;
77 -- Set to True when some comments may not be associated with any node
79 function Comment_Zones_Of
80 (Node : Project_Node_Id;
81 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
82 -- Returns the ID of the N_Comment_Zones node associated with node Node.
83 -- If there is not already an N_Comment_Zones node, create one and
84 -- associate it with node Node.
90 procedure Add_Comments
91 (To : Project_Node_Id;
92 In_Tree : Project_Node_Tree_Ref;
93 Where : Comment_Location) is
94 Zone : Project_Node_Id := Empty_Node;
95 Previous : Project_Node_Id := Empty_Node;
100 and then In_Tree.Project_Nodes.Table (To).Kind /= N_Comment);
102 Zone := In_Tree.Project_Nodes.Table (To).Comments;
106 -- Create new N_Comment_Zones node
108 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
109 In_Tree.Project_Nodes.Table
110 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
111 (Kind => N_Comment_Zones,
112 Qualifier => Unspecified,
113 Expr_Kind => Undefined,
114 Location => No_Location,
115 Directory => No_Path,
116 Variables => Empty_Node,
117 Packages => Empty_Node,
118 Pkg_Id => Empty_Package,
121 Path_Name => No_Path,
123 Field1 => Empty_Node,
124 Field2 => Empty_Node,
125 Field3 => Empty_Node,
126 Field4 => Empty_Node,
129 Comments => Empty_Node);
131 Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
132 In_Tree.Project_Nodes.Table (To).Comments := Zone;
135 if Where = End_Of_Line then
136 In_Tree.Project_Nodes.Table (Zone).Value := Comments.Table (1).Value;
139 -- Get each comments in the Comments table and link them to node To
141 for J in 1 .. Comments.Last loop
143 -- Create new N_Comment node
145 if (Where = After or else Where = After_End) and then
146 Token /= Tok_EOF and then
147 Comments.Table (J).Follows_Empty_Line
149 Comments.Table (1 .. Comments.Last - J + 1) :=
150 Comments.Table (J .. Comments.Last);
151 Comments.Set_Last (Comments.Last - J + 1);
155 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
156 In_Tree.Project_Nodes.Table
157 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
159 Qualifier => Unspecified,
160 Expr_Kind => Undefined,
161 Flag1 => Comments.Table (J).Follows_Empty_Line,
163 Comments.Table (J).Is_Followed_By_Empty_Line,
164 Location => No_Location,
165 Directory => No_Path,
166 Variables => Empty_Node,
167 Packages => Empty_Node,
168 Pkg_Id => Empty_Package,
171 Path_Name => No_Path,
172 Value => Comments.Table (J).Value,
173 Field1 => Empty_Node,
174 Field2 => Empty_Node,
175 Field3 => Empty_Node,
176 Field4 => Empty_Node,
177 Comments => Empty_Node);
179 -- If this is the first comment, put it in the right field of
182 if No (Previous) then
185 In_Tree.Project_Nodes.Table (Zone).Field1 :=
186 Project_Node_Table.Last (In_Tree.Project_Nodes);
189 In_Tree.Project_Nodes.Table (Zone).Field2 :=
190 Project_Node_Table.Last (In_Tree.Project_Nodes);
193 In_Tree.Project_Nodes.Table (Zone).Field3 :=
194 Project_Node_Table.Last (In_Tree.Project_Nodes);
197 In_Tree.Project_Nodes.Table (Zone).Comments :=
198 Project_Node_Table.Last (In_Tree.Project_Nodes);
205 -- When it is not the first, link it to the previous one
207 In_Tree.Project_Nodes.Table (Previous).Comments :=
208 Project_Node_Table.Last (In_Tree.Project_Nodes);
211 -- This node becomes the previous one for the next comment, if
214 Previous := Project_Node_Table.Last (In_Tree.Project_Nodes);
218 -- Empty the Comments table, so that there is no risk to link the same
219 -- comments to another node.
221 Comments.Set_Last (0);
224 --------------------------------
225 -- Associative_Array_Index_Of --
226 --------------------------------
228 function Associative_Array_Index_Of
229 (Node : Project_Node_Id;
230 In_Tree : Project_Node_Tree_Ref) return Name_Id
236 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
238 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
239 return In_Tree.Project_Nodes.Table (Node).Value;
240 end Associative_Array_Index_Of;
242 ----------------------------
243 -- Associative_Package_Of --
244 ----------------------------
246 function Associative_Package_Of
247 (Node : Project_Node_Id;
248 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
254 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
255 return In_Tree.Project_Nodes.Table (Node).Field3;
256 end Associative_Package_Of;
258 ----------------------------
259 -- Associative_Project_Of --
260 ----------------------------
262 function Associative_Project_Of
263 (Node : Project_Node_Id;
264 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
270 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
271 return In_Tree.Project_Nodes.Table (Node).Field2;
272 end Associative_Project_Of;
274 ----------------------
275 -- Case_Insensitive --
276 ----------------------
278 function Case_Insensitive
279 (Node : Project_Node_Id;
280 In_Tree : Project_Node_Tree_Ref) return Boolean is
285 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
287 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
288 return In_Tree.Project_Nodes.Table (Node).Flag1;
289 end Case_Insensitive;
291 --------------------------------
292 -- Case_Variable_Reference_Of --
293 --------------------------------
295 function Case_Variable_Reference_Of
296 (Node : Project_Node_Id;
297 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
303 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
304 return In_Tree.Project_Nodes.Table (Node).Field1;
305 end Case_Variable_Reference_Of;
307 ----------------------
308 -- Comment_Zones_Of --
309 ----------------------
311 function Comment_Zones_Of
312 (Node : Project_Node_Id;
313 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
315 Zone : Project_Node_Id;
318 pragma Assert (Present (Node));
319 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
321 -- If there is not already an N_Comment_Zones associated, create a new
322 -- one and associate it with node Node.
325 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
326 Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
327 In_Tree.Project_Nodes.Table (Zone) :=
328 (Kind => N_Comment_Zones,
329 Qualifier => Unspecified,
330 Location => No_Location,
331 Directory => No_Path,
332 Expr_Kind => Undefined,
333 Variables => Empty_Node,
334 Packages => Empty_Node,
335 Pkg_Id => Empty_Package,
338 Path_Name => No_Path,
340 Field1 => Empty_Node,
341 Field2 => Empty_Node,
342 Field3 => Empty_Node,
343 Field4 => Empty_Node,
346 Comments => Empty_Node);
347 In_Tree.Project_Nodes.Table (Node).Comments := Zone;
351 end Comment_Zones_Of;
353 -----------------------
354 -- Current_Item_Node --
355 -----------------------
357 function Current_Item_Node
358 (Node : Project_Node_Id;
359 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
365 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
366 return In_Tree.Project_Nodes.Table (Node).Field1;
367 end Current_Item_Node;
373 function Current_Term
374 (Node : Project_Node_Id;
375 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
381 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
382 return In_Tree.Project_Nodes.Table (Node).Field1;
385 --------------------------
386 -- Default_Project_Node --
387 --------------------------
389 function Default_Project_Node
390 (In_Tree : Project_Node_Tree_Ref;
391 Of_Kind : Project_Node_Kind;
392 And_Expr_Kind : Variable_Kind := Undefined) return Project_Node_Id
394 Result : Project_Node_Id;
395 Zone : Project_Node_Id;
396 Previous : Project_Node_Id;
399 -- Create new node with specified kind and expression kind
401 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
402 In_Tree.Project_Nodes.Table
403 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
405 Qualifier => Unspecified,
406 Location => No_Location,
407 Directory => No_Path,
408 Expr_Kind => And_Expr_Kind,
409 Variables => Empty_Node,
410 Packages => Empty_Node,
411 Pkg_Id => Empty_Package,
414 Path_Name => No_Path,
416 Field1 => Empty_Node,
417 Field2 => Empty_Node,
418 Field3 => Empty_Node,
419 Field4 => Empty_Node,
422 Comments => Empty_Node);
424 -- Save the new node for the returned value
426 Result := Project_Node_Table.Last (In_Tree.Project_Nodes);
428 if Comments.Last > 0 then
430 -- If this is not a node with comments, then set the flag
432 if not Node_With_Comments (Of_Kind) then
433 Unkept_Comments := True;
435 elsif Of_Kind /= N_Comment and then Of_Kind /= N_Comment_Zones then
437 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
438 In_Tree.Project_Nodes.Table
439 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
440 (Kind => N_Comment_Zones,
441 Qualifier => Unspecified,
442 Expr_Kind => Undefined,
443 Location => No_Location,
444 Directory => No_Path,
445 Variables => Empty_Node,
446 Packages => Empty_Node,
447 Pkg_Id => Empty_Package,
450 Path_Name => No_Path,
452 Field1 => Empty_Node,
453 Field2 => Empty_Node,
454 Field3 => Empty_Node,
455 Field4 => Empty_Node,
458 Comments => Empty_Node);
460 Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
461 In_Tree.Project_Nodes.Table (Result).Comments := Zone;
462 Previous := Empty_Node;
464 for J in 1 .. Comments.Last loop
466 -- Create a new N_Comment node
468 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
469 In_Tree.Project_Nodes.Table
470 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
472 Qualifier => Unspecified,
473 Expr_Kind => Undefined,
474 Flag1 => Comments.Table (J).Follows_Empty_Line,
476 Comments.Table (J).Is_Followed_By_Empty_Line,
477 Location => No_Location,
478 Directory => No_Path,
479 Variables => Empty_Node,
480 Packages => Empty_Node,
481 Pkg_Id => Empty_Package,
484 Path_Name => No_Path,
485 Value => Comments.Table (J).Value,
486 Field1 => Empty_Node,
487 Field2 => Empty_Node,
488 Field3 => Empty_Node,
489 Field4 => Empty_Node,
490 Comments => Empty_Node);
492 -- Link it to the N_Comment_Zones node, if it is the first,
493 -- otherwise to the previous one.
495 if No (Previous) then
496 In_Tree.Project_Nodes.Table (Zone).Field1 :=
497 Project_Node_Table.Last (In_Tree.Project_Nodes);
500 In_Tree.Project_Nodes.Table (Previous).Comments :=
501 Project_Node_Table.Last (In_Tree.Project_Nodes);
504 -- This new node will be the previous one for the next
505 -- N_Comment node, if there is one.
507 Previous := Project_Node_Table.Last (In_Tree.Project_Nodes);
510 -- Empty the Comments table after all comments have been processed
512 Comments.Set_Last (0);
517 end Default_Project_Node;
523 function Directory_Of
524 (Node : Project_Node_Id;
525 In_Tree : Project_Node_Tree_Ref) return Path_Name_Type is
530 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
531 return In_Tree.Project_Nodes.Table (Node).Directory;
534 -------------------------
535 -- End_Of_Line_Comment --
536 -------------------------
538 function End_Of_Line_Comment
539 (Node : Project_Node_Id;
540 In_Tree : Project_Node_Tree_Ref) return Name_Id is
541 Zone : Project_Node_Id := Empty_Node;
544 pragma Assert (Present (Node));
545 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
550 return In_Tree.Project_Nodes.Table (Zone).Value;
552 end End_Of_Line_Comment;
554 ------------------------
555 -- Expression_Kind_Of --
556 ------------------------
558 function Expression_Kind_Of
559 (Node : Project_Node_Id;
560 In_Tree : Project_Node_Tree_Ref) return Variable_Kind is
565 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
567 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
569 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
571 In_Tree.Project_Nodes.Table (Node).Kind =
572 N_Typed_Variable_Declaration
574 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
576 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
578 In_Tree.Project_Nodes.Table (Node).Kind = N_Term
580 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
582 In_Tree.Project_Nodes.Table (Node).Kind =
583 N_Attribute_Reference));
585 return In_Tree.Project_Nodes.Table (Node).Expr_Kind;
586 end Expression_Kind_Of;
592 function Expression_Of
593 (Node : Project_Node_Id;
594 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
600 (In_Tree.Project_Nodes.Table (Node).Kind =
601 N_Attribute_Declaration
603 In_Tree.Project_Nodes.Table (Node).Kind =
604 N_Typed_Variable_Declaration
606 In_Tree.Project_Nodes.Table (Node).Kind =
607 N_Variable_Declaration));
609 return In_Tree.Project_Nodes.Table (Node).Field1;
612 -------------------------
613 -- Extended_Project_Of --
614 -------------------------
616 function Extended_Project_Of
617 (Node : Project_Node_Id;
618 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
624 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
625 return In_Tree.Project_Nodes.Table (Node).Field2;
626 end Extended_Project_Of;
628 ------------------------------
629 -- Extended_Project_Path_Of --
630 ------------------------------
632 function Extended_Project_Path_Of
633 (Node : Project_Node_Id;
634 In_Tree : Project_Node_Tree_Ref) return Path_Name_Type
640 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
641 return Path_Name_Type (In_Tree.Project_Nodes.Table (Node).Value);
642 end Extended_Project_Path_Of;
644 --------------------------
645 -- Extending_Project_Of --
646 --------------------------
647 function Extending_Project_Of
648 (Node : Project_Node_Id;
649 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
655 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
656 return In_Tree.Project_Nodes.Table (Node).Field3;
657 end Extending_Project_Of;
659 ---------------------------
660 -- External_Reference_Of --
661 ---------------------------
663 function External_Reference_Of
664 (Node : Project_Node_Id;
665 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
671 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
672 return In_Tree.Project_Nodes.Table (Node).Field1;
673 end External_Reference_Of;
675 -------------------------
676 -- External_Default_Of --
677 -------------------------
679 function External_Default_Of
680 (Node : Project_Node_Id;
681 In_Tree : Project_Node_Tree_Ref)
682 return Project_Node_Id
688 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
689 return In_Tree.Project_Nodes.Table (Node).Field2;
690 end External_Default_Of;
692 ------------------------
693 -- First_Case_Item_Of --
694 ------------------------
696 function First_Case_Item_Of
697 (Node : Project_Node_Id;
698 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
704 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
705 return In_Tree.Project_Nodes.Table (Node).Field2;
706 end First_Case_Item_Of;
708 ---------------------
709 -- First_Choice_Of --
710 ---------------------
712 function First_Choice_Of
713 (Node : Project_Node_Id;
714 In_Tree : Project_Node_Tree_Ref)
715 return Project_Node_Id
721 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
722 return In_Tree.Project_Nodes.Table (Node).Field1;
725 -------------------------
726 -- First_Comment_After --
727 -------------------------
729 function First_Comment_After
730 (Node : Project_Node_Id;
731 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
733 Zone : Project_Node_Id := Empty_Node;
735 pragma Assert (Present (Node));
736 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
742 return In_Tree.Project_Nodes.Table (Zone).Field2;
744 end First_Comment_After;
746 -----------------------------
747 -- First_Comment_After_End --
748 -----------------------------
750 function First_Comment_After_End
751 (Node : Project_Node_Id;
752 In_Tree : Project_Node_Tree_Ref)
753 return Project_Node_Id
755 Zone : Project_Node_Id := Empty_Node;
758 pragma Assert (Present (Node));
759 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
765 return In_Tree.Project_Nodes.Table (Zone).Comments;
767 end First_Comment_After_End;
769 --------------------------
770 -- First_Comment_Before --
771 --------------------------
773 function First_Comment_Before
774 (Node : Project_Node_Id;
775 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
777 Zone : Project_Node_Id := Empty_Node;
780 pragma Assert (Present (Node));
781 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
787 return In_Tree.Project_Nodes.Table (Zone).Field1;
789 end First_Comment_Before;
791 ------------------------------
792 -- First_Comment_Before_End --
793 ------------------------------
795 function First_Comment_Before_End
796 (Node : Project_Node_Id;
797 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
799 Zone : Project_Node_Id := Empty_Node;
802 pragma Assert (Present (Node));
803 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
809 return In_Tree.Project_Nodes.Table (Zone).Field3;
811 end First_Comment_Before_End;
813 -------------------------------
814 -- First_Declarative_Item_Of --
815 -------------------------------
817 function First_Declarative_Item_Of
818 (Node : Project_Node_Id;
819 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
825 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
827 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
829 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
831 if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
832 return In_Tree.Project_Nodes.Table (Node).Field1;
834 return In_Tree.Project_Nodes.Table (Node).Field2;
836 end First_Declarative_Item_Of;
838 ------------------------------
839 -- First_Expression_In_List --
840 ------------------------------
842 function First_Expression_In_List
843 (Node : Project_Node_Id;
844 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
850 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
851 return In_Tree.Project_Nodes.Table (Node).Field1;
852 end First_Expression_In_List;
854 --------------------------
855 -- First_Literal_String --
856 --------------------------
858 function First_Literal_String
859 (Node : Project_Node_Id;
860 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
866 In_Tree.Project_Nodes.Table (Node).Kind =
867 N_String_Type_Declaration);
868 return In_Tree.Project_Nodes.Table (Node).Field1;
869 end First_Literal_String;
871 ----------------------
872 -- First_Package_Of --
873 ----------------------
875 function First_Package_Of
876 (Node : Project_Node_Id;
877 In_Tree : Project_Node_Tree_Ref) return Package_Declaration_Id
883 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
884 return In_Tree.Project_Nodes.Table (Node).Packages;
885 end First_Package_Of;
887 --------------------------
888 -- First_String_Type_Of --
889 --------------------------
891 function First_String_Type_Of
892 (Node : Project_Node_Id;
893 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
899 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
900 return In_Tree.Project_Nodes.Table (Node).Field3;
901 end First_String_Type_Of;
908 (Node : Project_Node_Id;
909 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
915 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
916 return In_Tree.Project_Nodes.Table (Node).Field1;
919 -----------------------
920 -- First_Variable_Of --
921 -----------------------
923 function First_Variable_Of
924 (Node : Project_Node_Id;
925 In_Tree : Project_Node_Tree_Ref) return Variable_Node_Id
931 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
933 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
935 return In_Tree.Project_Nodes.Table (Node).Variables;
936 end First_Variable_Of;
938 --------------------------
939 -- First_With_Clause_Of --
940 --------------------------
942 function First_With_Clause_Of
943 (Node : Project_Node_Id;
944 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
950 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
951 return In_Tree.Project_Nodes.Table (Node).Field1;
952 end First_With_Clause_Of;
954 ------------------------
955 -- Follows_Empty_Line --
956 ------------------------
958 function Follows_Empty_Line
959 (Node : Project_Node_Id;
960 In_Tree : Project_Node_Tree_Ref) return Boolean is
965 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
966 return In_Tree.Project_Nodes.Table (Node).Flag1;
967 end Follows_Empty_Line;
973 function Hash (N : Project_Node_Id) return Header_Num is
975 return Header_Num (N mod Project_Node_Id (Header_Num'Last));
982 procedure Initialize (Tree : Project_Node_Tree_Ref) is
984 Project_Node_Table.Init (Tree.Project_Nodes);
985 Projects_Htable.Reset (Tree.Projects_HT);
987 -- Do not reset the external references, in case we are reloading a
988 -- project, since we want to preserve the current environment
989 -- Name_To_Name_HTable.Reset (Tree.External_References);
996 procedure Free (Proj : in out Project_Node_Tree_Ref) is
997 procedure Unchecked_Free is new Ada.Unchecked_Deallocation
998 (Project_Node_Tree_Data, Project_Node_Tree_Ref);
1000 if Proj /= null then
1001 Project_Node_Table.Free (Proj.Project_Nodes);
1002 Projects_Htable.Reset (Proj.Projects_HT);
1003 Free (Proj.Project_Path);
1004 Unchecked_Free (Proj);
1008 -------------------------------
1009 -- Is_Followed_By_Empty_Line --
1010 -------------------------------
1012 function Is_Followed_By_Empty_Line
1013 (Node : Project_Node_Id;
1014 In_Tree : Project_Node_Tree_Ref) return Boolean
1020 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
1021 return In_Tree.Project_Nodes.Table (Node).Flag2;
1022 end Is_Followed_By_Empty_Line;
1024 ----------------------
1025 -- Is_Extending_All --
1026 ----------------------
1028 function Is_Extending_All
1029 (Node : Project_Node_Id;
1030 In_Tree : Project_Node_Tree_Ref) return Boolean is
1035 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
1037 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1038 return In_Tree.Project_Nodes.Table (Node).Flag2;
1039 end Is_Extending_All;
1041 -------------------------
1042 -- Is_Not_Last_In_List --
1043 -------------------------
1045 function Is_Not_Last_In_List
1046 (Node : Project_Node_Id;
1047 In_Tree : Project_Node_Tree_Ref) return Boolean is
1052 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
1053 return In_Tree.Project_Nodes.Table (Node).Flag1;
1054 end Is_Not_Last_In_List;
1056 -------------------------------------
1057 -- Imported_Or_Extended_Project_Of --
1058 -------------------------------------
1060 function Imported_Or_Extended_Project_Of
1061 (Project : Project_Node_Id;
1062 In_Tree : Project_Node_Tree_Ref;
1063 With_Name : Name_Id) return Project_Node_Id
1065 With_Clause : Project_Node_Id :=
1066 First_With_Clause_Of (Project, In_Tree);
1067 Result : Project_Node_Id := Empty_Node;
1070 -- First check all the imported projects
1072 while Present (With_Clause) loop
1074 -- Only non limited imported project may be used as prefix
1075 -- of variable or attributes.
1077 Result := Non_Limited_Project_Node_Of (With_Clause, In_Tree);
1078 exit when Present (Result)
1079 and then Name_Of (Result, In_Tree) = With_Name;
1080 With_Clause := Next_With_Clause_Of (With_Clause, In_Tree);
1083 -- If it is not an imported project, it might be an extended project
1085 if No (With_Clause) then
1090 (Project_Declaration_Of (Result, In_Tree), In_Tree);
1092 exit when No (Result)
1093 or else Name_Of (Result, In_Tree) = With_Name;
1098 end Imported_Or_Extended_Project_Of;
1105 (Node : Project_Node_Id;
1106 In_Tree : Project_Node_Tree_Ref) return Project_Node_Kind is
1108 pragma Assert (Present (Node));
1109 return In_Tree.Project_Nodes.Table (Node).Kind;
1116 function Location_Of
1117 (Node : Project_Node_Id;
1118 In_Tree : Project_Node_Tree_Ref) return Source_Ptr is
1120 pragma Assert (Present (Node));
1121 return In_Tree.Project_Nodes.Table (Node).Location;
1129 (Node : Project_Node_Id;
1130 In_Tree : Project_Node_Tree_Ref) return Name_Id is
1132 pragma Assert (Present (Node));
1133 return In_Tree.Project_Nodes.Table (Node).Name;
1136 --------------------
1137 -- Next_Case_Item --
1138 --------------------
1140 function Next_Case_Item
1141 (Node : Project_Node_Id;
1142 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1148 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1149 return In_Tree.Project_Nodes.Table (Node).Field3;
1156 function Next_Comment
1157 (Node : Project_Node_Id;
1158 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id is
1163 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
1164 return In_Tree.Project_Nodes.Table (Node).Comments;
1167 ---------------------------
1168 -- Next_Declarative_Item --
1169 ---------------------------
1171 function Next_Declarative_Item
1172 (Node : Project_Node_Id;
1173 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1179 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
1180 return In_Tree.Project_Nodes.Table (Node).Field2;
1181 end Next_Declarative_Item;
1183 -----------------------------
1184 -- Next_Expression_In_List --
1185 -----------------------------
1187 function Next_Expression_In_List
1188 (Node : Project_Node_Id;
1189 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1195 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
1196 return In_Tree.Project_Nodes.Table (Node).Field2;
1197 end Next_Expression_In_List;
1199 -------------------------
1200 -- Next_Literal_String --
1201 -------------------------
1203 function Next_Literal_String
1204 (Node : Project_Node_Id;
1205 In_Tree : Project_Node_Tree_Ref)
1206 return Project_Node_Id
1212 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
1213 return In_Tree.Project_Nodes.Table (Node).Field1;
1214 end Next_Literal_String;
1216 -----------------------------
1217 -- Next_Package_In_Project --
1218 -----------------------------
1220 function Next_Package_In_Project
1221 (Node : Project_Node_Id;
1222 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1228 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1229 return In_Tree.Project_Nodes.Table (Node).Field3;
1230 end Next_Package_In_Project;
1232 ----------------------
1233 -- Next_String_Type --
1234 ----------------------
1236 function Next_String_Type
1237 (Node : Project_Node_Id;
1238 In_Tree : Project_Node_Tree_Ref)
1239 return Project_Node_Id
1245 In_Tree.Project_Nodes.Table (Node).Kind =
1246 N_String_Type_Declaration);
1247 return In_Tree.Project_Nodes.Table (Node).Field2;
1248 end Next_String_Type;
1255 (Node : Project_Node_Id;
1256 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1262 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
1263 return In_Tree.Project_Nodes.Table (Node).Field2;
1270 function Next_Variable
1271 (Node : Project_Node_Id;
1272 In_Tree : Project_Node_Tree_Ref)
1273 return Project_Node_Id
1279 (In_Tree.Project_Nodes.Table (Node).Kind =
1280 N_Typed_Variable_Declaration
1282 In_Tree.Project_Nodes.Table (Node).Kind =
1283 N_Variable_Declaration));
1285 return In_Tree.Project_Nodes.Table (Node).Field3;
1288 -------------------------
1289 -- Next_With_Clause_Of --
1290 -------------------------
1292 function Next_With_Clause_Of
1293 (Node : Project_Node_Id;
1294 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1300 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
1301 return In_Tree.Project_Nodes.Table (Node).Field2;
1302 end Next_With_Clause_Of;
1308 function No (Node : Project_Node_Id) return Boolean is
1310 return Node = Empty_Node;
1313 ---------------------------------
1314 -- Non_Limited_Project_Node_Of --
1315 ---------------------------------
1317 function Non_Limited_Project_Node_Of
1318 (Node : Project_Node_Id;
1319 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1325 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1326 return In_Tree.Project_Nodes.Table (Node).Field3;
1327 end Non_Limited_Project_Node_Of;
1333 function Package_Id_Of
1334 (Node : Project_Node_Id;
1335 In_Tree : Project_Node_Tree_Ref) return Package_Node_Id
1341 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1342 return In_Tree.Project_Nodes.Table (Node).Pkg_Id;
1345 ---------------------
1346 -- Package_Node_Of --
1347 ---------------------
1349 function Package_Node_Of
1350 (Node : Project_Node_Id;
1351 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1357 (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1359 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1360 return In_Tree.Project_Nodes.Table (Node).Field2;
1361 end Package_Node_Of;
1367 function Path_Name_Of
1368 (Node : Project_Node_Id;
1369 In_Tree : Project_Node_Tree_Ref) return Path_Name_Type
1375 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
1377 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1378 return In_Tree.Project_Nodes.Table (Node).Path_Name;
1385 function Present (Node : Project_Node_Id) return Boolean is
1387 return Node /= Empty_Node;
1390 ----------------------------
1391 -- Project_Declaration_Of --
1392 ----------------------------
1394 function Project_Declaration_Of
1395 (Node : Project_Node_Id;
1396 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1402 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1403 return In_Tree.Project_Nodes.Table (Node).Field2;
1404 end Project_Declaration_Of;
1406 --------------------------
1407 -- Project_Qualifier_Of --
1408 --------------------------
1410 function Project_Qualifier_Of
1411 (Node : Project_Node_Id;
1412 In_Tree : Project_Node_Tree_Ref) return Project_Qualifier
1418 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1419 return In_Tree.Project_Nodes.Table (Node).Qualifier;
1420 end Project_Qualifier_Of;
1422 -----------------------
1423 -- Parent_Project_Of --
1424 -----------------------
1426 function Parent_Project_Of
1427 (Node : Project_Node_Id;
1428 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1434 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1435 return In_Tree.Project_Nodes.Table (Node).Field4;
1436 end Parent_Project_Of;
1438 -------------------------------------------
1439 -- Project_File_Includes_Unkept_Comments --
1440 -------------------------------------------
1442 function Project_File_Includes_Unkept_Comments
1443 (Node : Project_Node_Id;
1444 In_Tree : Project_Node_Tree_Ref) return Boolean
1446 Declaration : constant Project_Node_Id :=
1447 Project_Declaration_Of (Node, In_Tree);
1449 return In_Tree.Project_Nodes.Table (Declaration).Flag1;
1450 end Project_File_Includes_Unkept_Comments;
1452 ---------------------
1453 -- Project_Node_Of --
1454 ---------------------
1456 function Project_Node_Of
1457 (Node : Project_Node_Id;
1458 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1464 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
1466 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1468 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1469 return In_Tree.Project_Nodes.Table (Node).Field1;
1470 end Project_Node_Of;
1472 -----------------------------------
1473 -- Project_Of_Renamed_Package_Of --
1474 -----------------------------------
1476 function Project_Of_Renamed_Package_Of
1477 (Node : Project_Node_Id;
1478 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1484 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1485 return In_Tree.Project_Nodes.Table (Node).Field1;
1486 end Project_Of_Renamed_Package_Of;
1488 --------------------------
1489 -- Remove_Next_End_Node --
1490 --------------------------
1492 procedure Remove_Next_End_Node is
1494 Next_End_Nodes.Decrement_Last;
1495 end Remove_Next_End_Node;
1501 procedure Reset_State is
1503 End_Of_Line_Node := Empty_Node;
1504 Previous_Line_Node := Empty_Node;
1505 Previous_End_Node := Empty_Node;
1506 Unkept_Comments := False;
1507 Comments.Set_Last (0);
1510 ----------------------
1511 -- Restore_And_Free --
1512 ----------------------
1514 procedure Restore_And_Free (S : in out Comment_State) is
1515 procedure Unchecked_Free is new
1516 Ada.Unchecked_Deallocation (Comment_Array, Comments_Ptr);
1519 End_Of_Line_Node := S.End_Of_Line_Node;
1520 Previous_Line_Node := S.Previous_Line_Node;
1521 Previous_End_Node := S.Previous_End_Node;
1522 Next_End_Nodes.Set_Last (0);
1523 Unkept_Comments := S.Unkept_Comments;
1525 Comments.Set_Last (0);
1527 for J in S.Comments'Range loop
1528 Comments.Increment_Last;
1529 Comments.Table (Comments.Last) := S.Comments (J);
1532 Unchecked_Free (S.Comments);
1533 end Restore_And_Free;
1539 procedure Save (S : out Comment_State) is
1540 Cmts : constant Comments_Ptr := new Comment_Array (1 .. Comments.Last);
1543 for J in 1 .. Comments.Last loop
1544 Cmts (J) := Comments.Table (J);
1548 (End_Of_Line_Node => End_Of_Line_Node,
1549 Previous_Line_Node => Previous_Line_Node,
1550 Previous_End_Node => Previous_End_Node,
1551 Unkept_Comments => Unkept_Comments,
1559 procedure Scan (In_Tree : Project_Node_Tree_Ref) is
1560 Empty_Line : Boolean := False;
1563 -- If there are comments, then they will not be kept. Set the flag and
1564 -- clear the comments.
1566 if Comments.Last > 0 then
1567 Unkept_Comments := True;
1568 Comments.Set_Last (0);
1571 -- Loop until a token other that End_Of_Line or Comment is found
1574 Prj.Err.Scanner.Scan;
1577 when Tok_End_Of_Line =>
1578 if Prev_Token = Tok_End_Of_Line then
1581 if Comments.Last > 0 then
1582 Comments.Table (Comments.Last).Is_Followed_By_Empty_Line
1588 -- If this is a line comment, add it to the comment table
1590 if Prev_Token = Tok_End_Of_Line
1591 or else Prev_Token = No_Token
1593 Comments.Increment_Last;
1594 Comments.Table (Comments.Last) :=
1595 (Value => Comment_Id,
1596 Follows_Empty_Line => Empty_Line,
1597 Is_Followed_By_Empty_Line => False);
1599 -- Otherwise, it is an end of line comment. If there is
1600 -- an end of line node specified, associate the comment with
1603 elsif Present (End_Of_Line_Node) then
1605 Zones : constant Project_Node_Id :=
1606 Comment_Zones_Of (End_Of_Line_Node, In_Tree);
1608 In_Tree.Project_Nodes.Table (Zones).Value := Comment_Id;
1611 -- Otherwise, this end of line node cannot be kept
1614 Unkept_Comments := True;
1615 Comments.Set_Last (0);
1618 Empty_Line := False;
1621 -- If there are comments, where the first comment is not
1622 -- following an empty line, put the initial uninterrupted
1623 -- comment zone with the node of the preceding line (either
1624 -- a Previous_Line or a Previous_End node), if any.
1626 if Comments.Last > 0 and then
1627 not Comments.Table (1).Follows_Empty_Line then
1628 if Present (Previous_Line_Node) then
1630 (To => Previous_Line_Node,
1632 In_Tree => In_Tree);
1634 elsif Present (Previous_End_Node) then
1636 (To => Previous_End_Node,
1638 In_Tree => In_Tree);
1642 -- If there are still comments and the token is "end", then
1643 -- put these comments with the Next_End node, if any;
1644 -- otherwise, these comments cannot be kept. Always clear
1647 if Comments.Last > 0 and then Token = Tok_End then
1648 if Next_End_Nodes.Last > 0 then
1650 (To => Next_End_Nodes.Table (Next_End_Nodes.Last),
1651 Where => Before_End,
1652 In_Tree => In_Tree);
1655 Unkept_Comments := True;
1658 Comments.Set_Last (0);
1661 -- Reset the End_Of_Line, Previous_Line and Previous_End nodes
1662 -- so that they are not used again.
1664 End_Of_Line_Node := Empty_Node;
1665 Previous_Line_Node := Empty_Node;
1666 Previous_End_Node := Empty_Node;
1675 ------------------------------------
1676 -- Set_Associative_Array_Index_Of --
1677 ------------------------------------
1679 procedure Set_Associative_Array_Index_Of
1680 (Node : Project_Node_Id;
1681 In_Tree : Project_Node_Tree_Ref;
1688 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1690 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1691 In_Tree.Project_Nodes.Table (Node).Value := To;
1692 end Set_Associative_Array_Index_Of;
1694 --------------------------------
1695 -- Set_Associative_Package_Of --
1696 --------------------------------
1698 procedure Set_Associative_Package_Of
1699 (Node : Project_Node_Id;
1700 In_Tree : Project_Node_Tree_Ref;
1701 To : Project_Node_Id)
1707 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration);
1708 In_Tree.Project_Nodes.Table (Node).Field3 := To;
1709 end Set_Associative_Package_Of;
1711 --------------------------------
1712 -- Set_Associative_Project_Of --
1713 --------------------------------
1715 procedure Set_Associative_Project_Of
1716 (Node : Project_Node_Id;
1717 In_Tree : Project_Node_Tree_Ref;
1718 To : Project_Node_Id)
1724 (In_Tree.Project_Nodes.Table (Node).Kind =
1725 N_Attribute_Declaration));
1726 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1727 end Set_Associative_Project_Of;
1729 --------------------------
1730 -- Set_Case_Insensitive --
1731 --------------------------
1733 procedure Set_Case_Insensitive
1734 (Node : Project_Node_Id;
1735 In_Tree : Project_Node_Tree_Ref;
1742 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1744 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1745 In_Tree.Project_Nodes.Table (Node).Flag1 := To;
1746 end Set_Case_Insensitive;
1748 ------------------------------------
1749 -- Set_Case_Variable_Reference_Of --
1750 ------------------------------------
1752 procedure Set_Case_Variable_Reference_Of
1753 (Node : Project_Node_Id;
1754 In_Tree : Project_Node_Tree_Ref;
1755 To : Project_Node_Id)
1761 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
1762 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1763 end Set_Case_Variable_Reference_Of;
1765 ---------------------------
1766 -- Set_Current_Item_Node --
1767 ---------------------------
1769 procedure Set_Current_Item_Node
1770 (Node : Project_Node_Id;
1771 In_Tree : Project_Node_Tree_Ref;
1772 To : Project_Node_Id)
1778 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
1779 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1780 end Set_Current_Item_Node;
1782 ----------------------
1783 -- Set_Current_Term --
1784 ----------------------
1786 procedure Set_Current_Term
1787 (Node : Project_Node_Id;
1788 In_Tree : Project_Node_Tree_Ref;
1789 To : Project_Node_Id)
1795 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
1796 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1797 end Set_Current_Term;
1799 ----------------------
1800 -- Set_Directory_Of --
1801 ----------------------
1803 procedure Set_Directory_Of
1804 (Node : Project_Node_Id;
1805 In_Tree : Project_Node_Tree_Ref;
1806 To : Path_Name_Type)
1812 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1813 In_Tree.Project_Nodes.Table (Node).Directory := To;
1814 end Set_Directory_Of;
1816 ---------------------
1817 -- Set_End_Of_Line --
1818 ---------------------
1820 procedure Set_End_Of_Line (To : Project_Node_Id) is
1822 End_Of_Line_Node := To;
1823 end Set_End_Of_Line;
1825 ----------------------------
1826 -- Set_Expression_Kind_Of --
1827 ----------------------------
1829 procedure Set_Expression_Kind_Of
1830 (Node : Project_Node_Id;
1831 In_Tree : Project_Node_Tree_Ref;
1838 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
1840 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1842 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
1844 In_Tree.Project_Nodes.Table (Node).Kind =
1845 N_Typed_Variable_Declaration
1847 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
1849 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
1851 In_Tree.Project_Nodes.Table (Node).Kind = N_Term
1853 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1855 In_Tree.Project_Nodes.Table (Node).Kind =
1856 N_Attribute_Reference));
1857 In_Tree.Project_Nodes.Table (Node).Expr_Kind := To;
1858 end Set_Expression_Kind_Of;
1860 -----------------------
1861 -- Set_Expression_Of --
1862 -----------------------
1864 procedure Set_Expression_Of
1865 (Node : Project_Node_Id;
1866 In_Tree : Project_Node_Tree_Ref;
1867 To : Project_Node_Id)
1873 (In_Tree.Project_Nodes.Table (Node).Kind =
1874 N_Attribute_Declaration
1876 In_Tree.Project_Nodes.Table (Node).Kind =
1877 N_Typed_Variable_Declaration
1879 In_Tree.Project_Nodes.Table (Node).Kind =
1880 N_Variable_Declaration));
1881 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1882 end Set_Expression_Of;
1884 -------------------------------
1885 -- Set_External_Reference_Of --
1886 -------------------------------
1888 procedure Set_External_Reference_Of
1889 (Node : Project_Node_Id;
1890 In_Tree : Project_Node_Tree_Ref;
1891 To : Project_Node_Id)
1897 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
1898 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1899 end Set_External_Reference_Of;
1901 -----------------------------
1902 -- Set_External_Default_Of --
1903 -----------------------------
1905 procedure Set_External_Default_Of
1906 (Node : Project_Node_Id;
1907 In_Tree : Project_Node_Tree_Ref;
1908 To : Project_Node_Id)
1914 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
1915 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1916 end Set_External_Default_Of;
1918 ----------------------------
1919 -- Set_First_Case_Item_Of --
1920 ----------------------------
1922 procedure Set_First_Case_Item_Of
1923 (Node : Project_Node_Id;
1924 In_Tree : Project_Node_Tree_Ref;
1925 To : Project_Node_Id)
1931 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
1932 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1933 end Set_First_Case_Item_Of;
1935 -------------------------
1936 -- Set_First_Choice_Of --
1937 -------------------------
1939 procedure Set_First_Choice_Of
1940 (Node : Project_Node_Id;
1941 In_Tree : Project_Node_Tree_Ref;
1942 To : Project_Node_Id)
1948 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1949 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1950 end Set_First_Choice_Of;
1952 -----------------------------
1953 -- Set_First_Comment_After --
1954 -----------------------------
1956 procedure Set_First_Comment_After
1957 (Node : Project_Node_Id;
1958 In_Tree : Project_Node_Tree_Ref;
1959 To : Project_Node_Id)
1961 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1963 In_Tree.Project_Nodes.Table (Zone).Field2 := To;
1964 end Set_First_Comment_After;
1966 ---------------------------------
1967 -- Set_First_Comment_After_End --
1968 ---------------------------------
1970 procedure Set_First_Comment_After_End
1971 (Node : Project_Node_Id;
1972 In_Tree : Project_Node_Tree_Ref;
1973 To : Project_Node_Id)
1975 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1977 In_Tree.Project_Nodes.Table (Zone).Comments := To;
1978 end Set_First_Comment_After_End;
1980 ------------------------------
1981 -- Set_First_Comment_Before --
1982 ------------------------------
1984 procedure Set_First_Comment_Before
1985 (Node : Project_Node_Id;
1986 In_Tree : Project_Node_Tree_Ref;
1987 To : Project_Node_Id)
1990 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1992 In_Tree.Project_Nodes.Table (Zone).Field1 := To;
1993 end Set_First_Comment_Before;
1995 ----------------------------------
1996 -- Set_First_Comment_Before_End --
1997 ----------------------------------
1999 procedure Set_First_Comment_Before_End
2000 (Node : Project_Node_Id;
2001 In_Tree : Project_Node_Tree_Ref;
2002 To : Project_Node_Id)
2004 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
2006 In_Tree.Project_Nodes.Table (Zone).Field2 := To;
2007 end Set_First_Comment_Before_End;
2009 ------------------------
2010 -- Set_Next_Case_Item --
2011 ------------------------
2013 procedure Set_Next_Case_Item
2014 (Node : Project_Node_Id;
2015 In_Tree : Project_Node_Tree_Ref;
2016 To : Project_Node_Id)
2022 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
2023 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2024 end Set_Next_Case_Item;
2026 ----------------------
2027 -- Set_Next_Comment --
2028 ----------------------
2030 procedure Set_Next_Comment
2031 (Node : Project_Node_Id;
2032 In_Tree : Project_Node_Tree_Ref;
2033 To : Project_Node_Id)
2039 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
2040 In_Tree.Project_Nodes.Table (Node).Comments := To;
2041 end Set_Next_Comment;
2043 -----------------------------------
2044 -- Set_First_Declarative_Item_Of --
2045 -----------------------------------
2047 procedure Set_First_Declarative_Item_Of
2048 (Node : Project_Node_Id;
2049 In_Tree : Project_Node_Tree_Ref;
2050 To : Project_Node_Id)
2056 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
2058 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
2060 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
2062 if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
2063 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2065 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2067 end Set_First_Declarative_Item_Of;
2069 ----------------------------------
2070 -- Set_First_Expression_In_List --
2071 ----------------------------------
2073 procedure Set_First_Expression_In_List
2074 (Node : Project_Node_Id;
2075 In_Tree : Project_Node_Tree_Ref;
2076 To : Project_Node_Id)
2082 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
2083 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2084 end Set_First_Expression_In_List;
2086 ------------------------------
2087 -- Set_First_Literal_String --
2088 ------------------------------
2090 procedure Set_First_Literal_String
2091 (Node : Project_Node_Id;
2092 In_Tree : Project_Node_Tree_Ref;
2093 To : Project_Node_Id)
2099 In_Tree.Project_Nodes.Table (Node).Kind =
2100 N_String_Type_Declaration);
2101 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2102 end Set_First_Literal_String;
2104 --------------------------
2105 -- Set_First_Package_Of --
2106 --------------------------
2108 procedure Set_First_Package_Of
2109 (Node : Project_Node_Id;
2110 In_Tree : Project_Node_Tree_Ref;
2111 To : Package_Declaration_Id)
2117 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2118 In_Tree.Project_Nodes.Table (Node).Packages := To;
2119 end Set_First_Package_Of;
2121 ------------------------------
2122 -- Set_First_String_Type_Of --
2123 ------------------------------
2125 procedure Set_First_String_Type_Of
2126 (Node : Project_Node_Id;
2127 In_Tree : Project_Node_Tree_Ref;
2128 To : Project_Node_Id)
2134 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2135 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2136 end Set_First_String_Type_Of;
2138 --------------------
2139 -- Set_First_Term --
2140 --------------------
2142 procedure Set_First_Term
2143 (Node : Project_Node_Id;
2144 In_Tree : Project_Node_Tree_Ref;
2145 To : Project_Node_Id)
2151 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
2152 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2155 ---------------------------
2156 -- Set_First_Variable_Of --
2157 ---------------------------
2159 procedure Set_First_Variable_Of
2160 (Node : Project_Node_Id;
2161 In_Tree : Project_Node_Tree_Ref;
2162 To : Variable_Node_Id)
2168 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2170 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
2171 In_Tree.Project_Nodes.Table (Node).Variables := To;
2172 end Set_First_Variable_Of;
2174 ------------------------------
2175 -- Set_First_With_Clause_Of --
2176 ------------------------------
2178 procedure Set_First_With_Clause_Of
2179 (Node : Project_Node_Id;
2180 In_Tree : Project_Node_Tree_Ref;
2181 To : Project_Node_Id)
2187 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2188 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2189 end Set_First_With_Clause_Of;
2191 --------------------------
2192 -- Set_Is_Extending_All --
2193 --------------------------
2195 procedure Set_Is_Extending_All
2196 (Node : Project_Node_Id;
2197 In_Tree : Project_Node_Tree_Ref)
2203 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2205 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
2206 In_Tree.Project_Nodes.Table (Node).Flag2 := True;
2207 end Set_Is_Extending_All;
2209 -----------------------------
2210 -- Set_Is_Not_Last_In_List --
2211 -----------------------------
2213 procedure Set_Is_Not_Last_In_List
2214 (Node : Project_Node_Id;
2215 In_Tree : Project_Node_Tree_Ref)
2221 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
2222 In_Tree.Project_Nodes.Table (Node).Flag1 := True;
2223 end Set_Is_Not_Last_In_List;
2229 procedure Set_Kind_Of
2230 (Node : Project_Node_Id;
2231 In_Tree : Project_Node_Tree_Ref;
2232 To : Project_Node_Kind)
2235 pragma Assert (Present (Node));
2236 In_Tree.Project_Nodes.Table (Node).Kind := To;
2239 ---------------------
2240 -- Set_Location_Of --
2241 ---------------------
2243 procedure Set_Location_Of
2244 (Node : Project_Node_Id;
2245 In_Tree : Project_Node_Tree_Ref;
2249 pragma Assert (Present (Node));
2250 In_Tree.Project_Nodes.Table (Node).Location := To;
2251 end Set_Location_Of;
2253 -----------------------------
2254 -- Set_Extended_Project_Of --
2255 -----------------------------
2257 procedure Set_Extended_Project_Of
2258 (Node : Project_Node_Id;
2259 In_Tree : Project_Node_Tree_Ref;
2260 To : Project_Node_Id)
2266 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
2267 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2268 end Set_Extended_Project_Of;
2270 ----------------------------------
2271 -- Set_Extended_Project_Path_Of --
2272 ----------------------------------
2274 procedure Set_Extended_Project_Path_Of
2275 (Node : Project_Node_Id;
2276 In_Tree : Project_Node_Tree_Ref;
2277 To : Path_Name_Type)
2283 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2284 In_Tree.Project_Nodes.Table (Node).Value := Name_Id (To);
2285 end Set_Extended_Project_Path_Of;
2287 ------------------------------
2288 -- Set_Extending_Project_Of --
2289 ------------------------------
2291 procedure Set_Extending_Project_Of
2292 (Node : Project_Node_Id;
2293 In_Tree : Project_Node_Tree_Ref;
2294 To : Project_Node_Id)
2300 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
2301 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2302 end Set_Extending_Project_Of;
2308 procedure Set_Name_Of
2309 (Node : Project_Node_Id;
2310 In_Tree : Project_Node_Tree_Ref;
2314 pragma Assert (Present (Node));
2315 In_Tree.Project_Nodes.Table (Node).Name := To;
2318 -------------------------------
2319 -- Set_Next_Declarative_Item --
2320 -------------------------------
2322 procedure Set_Next_Declarative_Item
2323 (Node : Project_Node_Id;
2324 In_Tree : Project_Node_Tree_Ref;
2325 To : Project_Node_Id)
2331 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
2332 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2333 end Set_Next_Declarative_Item;
2335 -----------------------
2336 -- Set_Next_End_Node --
2337 -----------------------
2339 procedure Set_Next_End_Node (To : Project_Node_Id) is
2341 Next_End_Nodes.Increment_Last;
2342 Next_End_Nodes.Table (Next_End_Nodes.Last) := To;
2343 end Set_Next_End_Node;
2345 ---------------------------------
2346 -- Set_Next_Expression_In_List --
2347 ---------------------------------
2349 procedure Set_Next_Expression_In_List
2350 (Node : Project_Node_Id;
2351 In_Tree : Project_Node_Tree_Ref;
2352 To : Project_Node_Id)
2358 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
2359 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2360 end Set_Next_Expression_In_List;
2362 -----------------------------
2363 -- Set_Next_Literal_String --
2364 -----------------------------
2366 procedure Set_Next_Literal_String
2367 (Node : Project_Node_Id;
2368 In_Tree : Project_Node_Tree_Ref;
2369 To : Project_Node_Id)
2375 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
2376 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2377 end Set_Next_Literal_String;
2379 ---------------------------------
2380 -- Set_Next_Package_In_Project --
2381 ---------------------------------
2383 procedure Set_Next_Package_In_Project
2384 (Node : Project_Node_Id;
2385 In_Tree : Project_Node_Tree_Ref;
2386 To : Project_Node_Id)
2392 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2393 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2394 end Set_Next_Package_In_Project;
2396 --------------------------
2397 -- Set_Next_String_Type --
2398 --------------------------
2400 procedure Set_Next_String_Type
2401 (Node : Project_Node_Id;
2402 In_Tree : Project_Node_Tree_Ref;
2403 To : Project_Node_Id)
2409 In_Tree.Project_Nodes.Table (Node).Kind =
2410 N_String_Type_Declaration);
2411 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2412 end Set_Next_String_Type;
2418 procedure Set_Next_Term
2419 (Node : Project_Node_Id;
2420 In_Tree : Project_Node_Tree_Ref;
2421 To : Project_Node_Id)
2427 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
2428 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2431 -----------------------
2432 -- Set_Next_Variable --
2433 -----------------------
2435 procedure Set_Next_Variable
2436 (Node : Project_Node_Id;
2437 In_Tree : Project_Node_Tree_Ref;
2438 To : Project_Node_Id)
2444 (In_Tree.Project_Nodes.Table (Node).Kind =
2445 N_Typed_Variable_Declaration
2447 In_Tree.Project_Nodes.Table (Node).Kind =
2448 N_Variable_Declaration));
2449 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2450 end Set_Next_Variable;
2452 -----------------------------
2453 -- Set_Next_With_Clause_Of --
2454 -----------------------------
2456 procedure Set_Next_With_Clause_Of
2457 (Node : Project_Node_Id;
2458 In_Tree : Project_Node_Tree_Ref;
2459 To : Project_Node_Id)
2465 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
2466 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2467 end Set_Next_With_Clause_Of;
2469 -----------------------
2470 -- Set_Package_Id_Of --
2471 -----------------------
2473 procedure Set_Package_Id_Of
2474 (Node : Project_Node_Id;
2475 In_Tree : Project_Node_Tree_Ref;
2476 To : Package_Node_Id)
2482 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2483 In_Tree.Project_Nodes.Table (Node).Pkg_Id := To;
2484 end Set_Package_Id_Of;
2486 -------------------------
2487 -- Set_Package_Node_Of --
2488 -------------------------
2490 procedure Set_Package_Node_Of
2491 (Node : Project_Node_Id;
2492 In_Tree : Project_Node_Tree_Ref;
2493 To : Project_Node_Id)
2499 (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
2501 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
2502 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2503 end Set_Package_Node_Of;
2505 ----------------------
2506 -- Set_Path_Name_Of --
2507 ----------------------
2509 procedure Set_Path_Name_Of
2510 (Node : Project_Node_Id;
2511 In_Tree : Project_Node_Tree_Ref;
2512 To : Path_Name_Type)
2518 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2520 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
2521 In_Tree.Project_Nodes.Table (Node).Path_Name := To;
2522 end Set_Path_Name_Of;
2524 ---------------------------
2525 -- Set_Previous_End_Node --
2526 ---------------------------
2527 procedure Set_Previous_End_Node (To : Project_Node_Id) is
2529 Previous_End_Node := To;
2530 end Set_Previous_End_Node;
2532 ----------------------------
2533 -- Set_Previous_Line_Node --
2534 ----------------------------
2536 procedure Set_Previous_Line_Node (To : Project_Node_Id) is
2538 Previous_Line_Node := To;
2539 end Set_Previous_Line_Node;
2541 --------------------------------
2542 -- Set_Project_Declaration_Of --
2543 --------------------------------
2545 procedure Set_Project_Declaration_Of
2546 (Node : Project_Node_Id;
2547 In_Tree : Project_Node_Tree_Ref;
2548 To : Project_Node_Id)
2554 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2555 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2556 end Set_Project_Declaration_Of;
2558 ------------------------------
2559 -- Set_Project_Qualifier_Of --
2560 ------------------------------
2562 procedure Set_Project_Qualifier_Of
2563 (Node : Project_Node_Id;
2564 In_Tree : Project_Node_Tree_Ref;
2565 To : Project_Qualifier)
2570 and then In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2571 In_Tree.Project_Nodes.Table (Node).Qualifier := To;
2572 end Set_Project_Qualifier_Of;
2574 ---------------------------
2575 -- Set_Parent_Project_Of --
2576 ---------------------------
2578 procedure Set_Parent_Project_Of
2579 (Node : Project_Node_Id;
2580 In_Tree : Project_Node_Tree_Ref;
2581 To : Project_Node_Id)
2586 and then In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2587 In_Tree.Project_Nodes.Table (Node).Field4 := To;
2588 end Set_Parent_Project_Of;
2590 -----------------------------------------------
2591 -- Set_Project_File_Includes_Unkept_Comments --
2592 -----------------------------------------------
2594 procedure Set_Project_File_Includes_Unkept_Comments
2595 (Node : Project_Node_Id;
2596 In_Tree : Project_Node_Tree_Ref;
2599 Declaration : constant Project_Node_Id :=
2600 Project_Declaration_Of (Node, In_Tree);
2602 In_Tree.Project_Nodes.Table (Declaration).Flag1 := To;
2603 end Set_Project_File_Includes_Unkept_Comments;
2605 -------------------------
2606 -- Set_Project_Node_Of --
2607 -------------------------
2609 procedure Set_Project_Node_Of
2610 (Node : Project_Node_Id;
2611 In_Tree : Project_Node_Tree_Ref;
2612 To : Project_Node_Id;
2613 Limited_With : Boolean := False)
2619 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2621 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
2623 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
2624 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2626 if In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2627 and then not Limited_With
2629 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2631 end Set_Project_Node_Of;
2633 ---------------------------------------
2634 -- Set_Project_Of_Renamed_Package_Of --
2635 ---------------------------------------
2637 procedure Set_Project_Of_Renamed_Package_Of
2638 (Node : Project_Node_Id;
2639 In_Tree : Project_Node_Tree_Ref;
2640 To : Project_Node_Id)
2646 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2647 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2648 end Set_Project_Of_Renamed_Package_Of;
2650 -------------------------
2651 -- Set_Source_Index_Of --
2652 -------------------------
2654 procedure Set_Source_Index_Of
2655 (Node : Project_Node_Id;
2656 In_Tree : Project_Node_Tree_Ref;
2663 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
2665 In_Tree.Project_Nodes.Table (Node).Kind =
2666 N_Attribute_Declaration));
2667 In_Tree.Project_Nodes.Table (Node).Src_Index := To;
2668 end Set_Source_Index_Of;
2670 ------------------------
2671 -- Set_String_Type_Of --
2672 ------------------------
2674 procedure Set_String_Type_Of
2675 (Node : Project_Node_Id;
2676 In_Tree : Project_Node_Tree_Ref;
2677 To : Project_Node_Id)
2683 (In_Tree.Project_Nodes.Table (Node).Kind =
2684 N_Variable_Reference
2686 In_Tree.Project_Nodes.Table (Node).Kind =
2687 N_Typed_Variable_Declaration)
2689 In_Tree.Project_Nodes.Table (To).Kind = N_String_Type_Declaration);
2691 if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
2692 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2694 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2696 end Set_String_Type_Of;
2698 -------------------------
2699 -- Set_String_Value_Of --
2700 -------------------------
2702 procedure Set_String_Value_Of
2703 (Node : Project_Node_Id;
2704 In_Tree : Project_Node_Tree_Ref;
2711 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2713 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
2715 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
2716 In_Tree.Project_Nodes.Table (Node).Value := To;
2717 end Set_String_Value_Of;
2719 ---------------------
2720 -- Source_Index_Of --
2721 ---------------------
2723 function Source_Index_Of
2724 (Node : Project_Node_Id;
2725 In_Tree : Project_Node_Tree_Ref) return Int
2731 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
2733 In_Tree.Project_Nodes.Table (Node).Kind =
2734 N_Attribute_Declaration));
2735 return In_Tree.Project_Nodes.Table (Node).Src_Index;
2736 end Source_Index_Of;
2738 --------------------
2739 -- String_Type_Of --
2740 --------------------
2742 function String_Type_Of
2743 (Node : Project_Node_Id;
2744 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
2750 (In_Tree.Project_Nodes.Table (Node).Kind =
2751 N_Variable_Reference
2753 In_Tree.Project_Nodes.Table (Node).Kind =
2754 N_Typed_Variable_Declaration));
2756 if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
2757 return In_Tree.Project_Nodes.Table (Node).Field3;
2759 return In_Tree.Project_Nodes.Table (Node).Field2;
2763 ---------------------
2764 -- String_Value_Of --
2765 ---------------------
2767 function String_Value_Of
2768 (Node : Project_Node_Id;
2769 In_Tree : Project_Node_Tree_Ref) return Name_Id
2775 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2777 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
2779 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
2780 return In_Tree.Project_Nodes.Table (Node).Value;
2781 end String_Value_Of;
2783 --------------------
2784 -- Value_Is_Valid --
2785 --------------------
2787 function Value_Is_Valid
2788 (For_Typed_Variable : Project_Node_Id;
2789 In_Tree : Project_Node_Tree_Ref;
2790 Value : Name_Id) return Boolean
2794 (Present (For_Typed_Variable)
2796 (In_Tree.Project_Nodes.Table (For_Typed_Variable).Kind =
2797 N_Typed_Variable_Declaration));
2800 Current_String : Project_Node_Id :=
2801 First_Literal_String
2802 (String_Type_Of (For_Typed_Variable, In_Tree),
2806 while Present (Current_String)
2808 String_Value_Of (Current_String, In_Tree) /= Value
2811 Next_Literal_String (Current_String, In_Tree);
2814 return Present (Current_String);
2819 -------------------------------
2820 -- There_Are_Unkept_Comments --
2821 -------------------------------
2823 function There_Are_Unkept_Comments return Boolean is
2825 return Unkept_Comments;
2826 end There_Are_Unkept_Comments;
2828 --------------------
2829 -- Create_Project --
2830 --------------------
2832 function Create_Project
2833 (In_Tree : Project_Node_Tree_Ref;
2835 Full_Path : Path_Name_Type;
2836 Is_Config_File : Boolean := False) return Project_Node_Id
2838 Project : Project_Node_Id;
2839 Qualifier : Project_Qualifier := Unspecified;
2841 Project := Default_Project_Node (In_Tree, N_Project);
2842 Set_Name_Of (Project, In_Tree, Name);
2845 Path_Name_Type (Get_Directory (File_Name_Type (Full_Path))));
2846 Set_Path_Name_Of (Project, In_Tree, Full_Path);
2848 Set_Project_Declaration_Of
2850 Default_Project_Node (In_Tree, N_Project_Declaration));
2852 if Is_Config_File then
2853 Qualifier := Configuration;
2856 if not Is_Config_File then
2857 Prj.Tree.Tree_Private_Part.Projects_Htable.Set
2858 (In_Tree.Projects_HT,
2860 Prj.Tree.Tree_Private_Part.Project_Name_And_Node'
2862 Display_Name => Name,
2863 Canonical_Path => No_Path,
2866 Proj_Qualifier => Qualifier));
2876 procedure Add_At_End
2877 (Tree : Project_Node_Tree_Ref;
2878 Parent : Project_Node_Id;
2879 Expr : Project_Node_Id;
2880 Add_Before_First_Pkg : Boolean := False;
2881 Add_Before_First_Case : Boolean := False)
2883 Real_Parent : Project_Node_Id;
2884 New_Decl, Decl, Next : Project_Node_Id;
2885 Last, L : Project_Node_Id;
2888 if Kind_Of (Expr, Tree) /= N_Declarative_Item then
2889 New_Decl := Default_Project_Node (Tree, N_Declarative_Item);
2890 Set_Current_Item_Node (New_Decl, Tree, Expr);
2895 if Kind_Of (Parent, Tree) = N_Project then
2896 Real_Parent := Project_Declaration_Of (Parent, Tree);
2898 Real_Parent := Parent;
2901 Decl := First_Declarative_Item_Of (Real_Parent, Tree);
2903 if Decl = Empty_Node then
2904 Set_First_Declarative_Item_Of (Real_Parent, Tree, New_Decl);
2907 Next := Next_Declarative_Item (Decl, Tree);
2908 exit when Next = Empty_Node
2910 (Add_Before_First_Pkg
2911 and then Kind_Of (Current_Item_Node (Next, Tree), Tree) =
2912 N_Package_Declaration)
2914 (Add_Before_First_Case
2915 and then Kind_Of (Current_Item_Node (Next, Tree), Tree) =
2916 N_Case_Construction);
2920 -- In case Expr is in fact a range of declarative items
2924 L := Next_Declarative_Item (Last, Tree);
2925 exit when L = Empty_Node;
2929 -- In case Expr is in fact a range of declarative items
2933 L := Next_Declarative_Item (Last, Tree);
2934 exit when L = Empty_Node;
2938 Set_Next_Declarative_Item (Last, Tree, Next);
2939 Set_Next_Declarative_Item (Decl, Tree, New_Decl);
2943 ---------------------------
2944 -- Create_Literal_String --
2945 ---------------------------
2947 function Create_Literal_String
2948 (Str : Namet.Name_Id;
2949 Tree : Project_Node_Tree_Ref) return Project_Node_Id
2951 Node : Project_Node_Id;
2953 Node := Default_Project_Node (Tree, N_Literal_String, Prj.Single);
2954 Set_Next_Literal_String (Node, Tree, Empty_Node);
2955 Set_String_Value_Of (Node, Tree, Str);
2957 end Create_Literal_String;
2959 ---------------------------
2960 -- Enclose_In_Expression --
2961 ---------------------------
2963 function Enclose_In_Expression
2964 (Node : Project_Node_Id;
2965 Tree : Project_Node_Tree_Ref) return Project_Node_Id
2967 Expr : constant Project_Node_Id :=
2968 Default_Project_Node (Tree, N_Expression, Single);
2970 Set_First_Term (Expr, Tree, Default_Project_Node (Tree, N_Term, Single));
2971 Set_Current_Term (First_Term (Expr, Tree), Tree, Node);
2973 end Enclose_In_Expression;
2975 --------------------
2976 -- Create_Package --
2977 --------------------
2979 function Create_Package
2980 (Tree : Project_Node_Tree_Ref;
2981 Project : Project_Node_Id;
2982 Pkg : String) return Project_Node_Id
2984 Pack : Project_Node_Id;
2988 Name_Len := Pkg'Length;
2989 Name_Buffer (1 .. Name_Len) := Pkg;
2992 -- Check if the package already exists
2994 Pack := First_Package_Of (Project, Tree);
2995 while Pack /= Empty_Node loop
2996 if Prj.Tree.Name_Of (Pack, Tree) = N then
3000 Pack := Next_Package_In_Project (Pack, Tree);
3003 -- Create the package and add it to the declarative item
3005 Pack := Default_Project_Node (Tree, N_Package_Declaration);
3006 Set_Name_Of (Pack, Tree, N);
3008 -- Find the correct package id to use
3010 Set_Package_Id_Of (Pack, Tree, Package_Node_Id_Of (N));
3012 -- Add it to the list of packages
3014 Set_Next_Package_In_Project
3015 (Pack, Tree, First_Package_Of (Project, Tree));
3016 Set_First_Package_Of (Project, Tree, Pack);
3018 Add_At_End (Tree, Project_Declaration_Of (Project, Tree), Pack);
3024 -- Create_Attribute --
3025 ----------------------
3027 function Create_Attribute
3028 (Tree : Project_Node_Tree_Ref;
3029 Prj_Or_Pkg : Project_Node_Id;
3031 Index_Name : Name_Id := No_Name;
3032 Kind : Variable_Kind := List;
3033 At_Index : Integer := 0) return Project_Node_Id
3035 Node : constant Project_Node_Id :=
3036 Default_Project_Node (Tree, N_Attribute_Declaration, Kind);
3038 Case_Insensitive : Boolean;
3040 Pkg : Package_Node_Id;
3041 Start_At : Attribute_Node_Id;
3044 Set_Name_Of (Node, Tree, Name);
3046 if At_Index /= 0 then
3047 Set_Source_Index_Of (Node, Tree, To => Int (At_Index));
3050 if Index_Name /= No_Name then
3051 Set_Associative_Array_Index_Of (Node, Tree, Index_Name);
3054 if Prj_Or_Pkg /= Empty_Node then
3055 Add_At_End (Tree, Prj_Or_Pkg, Node);
3058 -- Find out the case sensitivity of the attribute
3060 if Prj_Or_Pkg /= Empty_Node
3061 and then Kind_Of (Prj_Or_Pkg, Tree) = N_Package_Declaration
3063 Pkg := Prj.Attr.Package_Node_Id_Of (Name_Of (Prj_Or_Pkg, Tree));
3064 Start_At := First_Attribute_Of (Pkg);
3066 Start_At := Attribute_First;
3069 Start_At := Attribute_Node_Id_Of (Name, Start_At);
3071 Attribute_Kind_Of (Start_At) = Case_Insensitive_Associative_Array;
3072 Tree.Project_Nodes.Table (Node).Flag1 := Case_Insensitive;
3075 end Create_Attribute;