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 Unchecked_Free (Proj);
1007 -------------------------------
1008 -- Is_Followed_By_Empty_Line --
1009 -------------------------------
1011 function Is_Followed_By_Empty_Line
1012 (Node : Project_Node_Id;
1013 In_Tree : Project_Node_Tree_Ref) return Boolean
1019 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
1020 return In_Tree.Project_Nodes.Table (Node).Flag2;
1021 end Is_Followed_By_Empty_Line;
1023 ----------------------
1024 -- Is_Extending_All --
1025 ----------------------
1027 function Is_Extending_All
1028 (Node : Project_Node_Id;
1029 In_Tree : Project_Node_Tree_Ref) return Boolean is
1034 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
1036 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1037 return In_Tree.Project_Nodes.Table (Node).Flag2;
1038 end Is_Extending_All;
1040 -------------------------
1041 -- Is_Not_Last_In_List --
1042 -------------------------
1044 function Is_Not_Last_In_List
1045 (Node : Project_Node_Id;
1046 In_Tree : Project_Node_Tree_Ref) return Boolean is
1051 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
1052 return In_Tree.Project_Nodes.Table (Node).Flag1;
1053 end Is_Not_Last_In_List;
1055 -------------------------------------
1056 -- Imported_Or_Extended_Project_Of --
1057 -------------------------------------
1059 function Imported_Or_Extended_Project_Of
1060 (Project : Project_Node_Id;
1061 In_Tree : Project_Node_Tree_Ref;
1062 With_Name : Name_Id) return Project_Node_Id
1064 With_Clause : Project_Node_Id :=
1065 First_With_Clause_Of (Project, In_Tree);
1066 Result : Project_Node_Id := Empty_Node;
1069 -- First check all the imported projects
1071 while Present (With_Clause) loop
1073 -- Only non limited imported project may be used as prefix
1074 -- of variable or attributes.
1076 Result := Non_Limited_Project_Node_Of (With_Clause, In_Tree);
1077 exit when Present (Result)
1078 and then Name_Of (Result, In_Tree) = With_Name;
1079 With_Clause := Next_With_Clause_Of (With_Clause, In_Tree);
1082 -- If it is not an imported project, it might be an extended project
1084 if No (With_Clause) then
1089 (Project_Declaration_Of (Result, In_Tree), In_Tree);
1091 exit when No (Result)
1092 or else Name_Of (Result, In_Tree) = With_Name;
1097 end Imported_Or_Extended_Project_Of;
1104 (Node : Project_Node_Id;
1105 In_Tree : Project_Node_Tree_Ref) return Project_Node_Kind is
1107 pragma Assert (Present (Node));
1108 return In_Tree.Project_Nodes.Table (Node).Kind;
1115 function Location_Of
1116 (Node : Project_Node_Id;
1117 In_Tree : Project_Node_Tree_Ref) return Source_Ptr is
1119 pragma Assert (Present (Node));
1120 return In_Tree.Project_Nodes.Table (Node).Location;
1128 (Node : Project_Node_Id;
1129 In_Tree : Project_Node_Tree_Ref) return Name_Id is
1131 pragma Assert (Present (Node));
1132 return In_Tree.Project_Nodes.Table (Node).Name;
1135 --------------------
1136 -- Next_Case_Item --
1137 --------------------
1139 function Next_Case_Item
1140 (Node : Project_Node_Id;
1141 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1147 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1148 return In_Tree.Project_Nodes.Table (Node).Field3;
1155 function Next_Comment
1156 (Node : Project_Node_Id;
1157 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id is
1162 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
1163 return In_Tree.Project_Nodes.Table (Node).Comments;
1166 ---------------------------
1167 -- Next_Declarative_Item --
1168 ---------------------------
1170 function Next_Declarative_Item
1171 (Node : Project_Node_Id;
1172 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1178 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
1179 return In_Tree.Project_Nodes.Table (Node).Field2;
1180 end Next_Declarative_Item;
1182 -----------------------------
1183 -- Next_Expression_In_List --
1184 -----------------------------
1186 function Next_Expression_In_List
1187 (Node : Project_Node_Id;
1188 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1194 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
1195 return In_Tree.Project_Nodes.Table (Node).Field2;
1196 end Next_Expression_In_List;
1198 -------------------------
1199 -- Next_Literal_String --
1200 -------------------------
1202 function Next_Literal_String
1203 (Node : Project_Node_Id;
1204 In_Tree : Project_Node_Tree_Ref)
1205 return Project_Node_Id
1211 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
1212 return In_Tree.Project_Nodes.Table (Node).Field1;
1213 end Next_Literal_String;
1215 -----------------------------
1216 -- Next_Package_In_Project --
1217 -----------------------------
1219 function Next_Package_In_Project
1220 (Node : Project_Node_Id;
1221 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1227 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1228 return In_Tree.Project_Nodes.Table (Node).Field3;
1229 end Next_Package_In_Project;
1231 ----------------------
1232 -- Next_String_Type --
1233 ----------------------
1235 function Next_String_Type
1236 (Node : Project_Node_Id;
1237 In_Tree : Project_Node_Tree_Ref)
1238 return Project_Node_Id
1244 In_Tree.Project_Nodes.Table (Node).Kind =
1245 N_String_Type_Declaration);
1246 return In_Tree.Project_Nodes.Table (Node).Field2;
1247 end Next_String_Type;
1254 (Node : Project_Node_Id;
1255 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1261 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
1262 return In_Tree.Project_Nodes.Table (Node).Field2;
1269 function Next_Variable
1270 (Node : Project_Node_Id;
1271 In_Tree : Project_Node_Tree_Ref)
1272 return Project_Node_Id
1278 (In_Tree.Project_Nodes.Table (Node).Kind =
1279 N_Typed_Variable_Declaration
1281 In_Tree.Project_Nodes.Table (Node).Kind =
1282 N_Variable_Declaration));
1284 return In_Tree.Project_Nodes.Table (Node).Field3;
1287 -------------------------
1288 -- Next_With_Clause_Of --
1289 -------------------------
1291 function Next_With_Clause_Of
1292 (Node : Project_Node_Id;
1293 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1299 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
1300 return In_Tree.Project_Nodes.Table (Node).Field2;
1301 end Next_With_Clause_Of;
1307 function No (Node : Project_Node_Id) return Boolean is
1309 return Node = Empty_Node;
1312 ---------------------------------
1313 -- Non_Limited_Project_Node_Of --
1314 ---------------------------------
1316 function Non_Limited_Project_Node_Of
1317 (Node : Project_Node_Id;
1318 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1324 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1325 return In_Tree.Project_Nodes.Table (Node).Field3;
1326 end Non_Limited_Project_Node_Of;
1332 function Package_Id_Of
1333 (Node : Project_Node_Id;
1334 In_Tree : Project_Node_Tree_Ref) return Package_Node_Id
1340 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1341 return In_Tree.Project_Nodes.Table (Node).Pkg_Id;
1344 ---------------------
1345 -- Package_Node_Of --
1346 ---------------------
1348 function Package_Node_Of
1349 (Node : Project_Node_Id;
1350 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1356 (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1358 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1359 return In_Tree.Project_Nodes.Table (Node).Field2;
1360 end Package_Node_Of;
1366 function Path_Name_Of
1367 (Node : Project_Node_Id;
1368 In_Tree : Project_Node_Tree_Ref) return Path_Name_Type
1374 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
1376 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1377 return In_Tree.Project_Nodes.Table (Node).Path_Name;
1384 function Present (Node : Project_Node_Id) return Boolean is
1386 return Node /= Empty_Node;
1389 ----------------------------
1390 -- Project_Declaration_Of --
1391 ----------------------------
1393 function Project_Declaration_Of
1394 (Node : Project_Node_Id;
1395 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1401 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1402 return In_Tree.Project_Nodes.Table (Node).Field2;
1403 end Project_Declaration_Of;
1405 --------------------------
1406 -- Project_Qualifier_Of --
1407 --------------------------
1409 function Project_Qualifier_Of
1410 (Node : Project_Node_Id;
1411 In_Tree : Project_Node_Tree_Ref) return Project_Qualifier
1417 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1418 return In_Tree.Project_Nodes.Table (Node).Qualifier;
1419 end Project_Qualifier_Of;
1421 -----------------------
1422 -- Parent_Project_Of --
1423 -----------------------
1425 function Parent_Project_Of
1426 (Node : Project_Node_Id;
1427 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1433 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1434 return In_Tree.Project_Nodes.Table (Node).Field4;
1435 end Parent_Project_Of;
1437 -------------------------------------------
1438 -- Project_File_Includes_Unkept_Comments --
1439 -------------------------------------------
1441 function Project_File_Includes_Unkept_Comments
1442 (Node : Project_Node_Id;
1443 In_Tree : Project_Node_Tree_Ref) return Boolean
1445 Declaration : constant Project_Node_Id :=
1446 Project_Declaration_Of (Node, In_Tree);
1448 return In_Tree.Project_Nodes.Table (Declaration).Flag1;
1449 end Project_File_Includes_Unkept_Comments;
1451 ---------------------
1452 -- Project_Node_Of --
1453 ---------------------
1455 function Project_Node_Of
1456 (Node : Project_Node_Id;
1457 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1463 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
1465 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1467 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1468 return In_Tree.Project_Nodes.Table (Node).Field1;
1469 end Project_Node_Of;
1471 -----------------------------------
1472 -- Project_Of_Renamed_Package_Of --
1473 -----------------------------------
1475 function Project_Of_Renamed_Package_Of
1476 (Node : Project_Node_Id;
1477 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1483 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1484 return In_Tree.Project_Nodes.Table (Node).Field1;
1485 end Project_Of_Renamed_Package_Of;
1487 --------------------------
1488 -- Remove_Next_End_Node --
1489 --------------------------
1491 procedure Remove_Next_End_Node is
1493 Next_End_Nodes.Decrement_Last;
1494 end Remove_Next_End_Node;
1500 procedure Reset_State is
1502 End_Of_Line_Node := Empty_Node;
1503 Previous_Line_Node := Empty_Node;
1504 Previous_End_Node := Empty_Node;
1505 Unkept_Comments := False;
1506 Comments.Set_Last (0);
1509 ----------------------
1510 -- Restore_And_Free --
1511 ----------------------
1513 procedure Restore_And_Free (S : in out Comment_State) is
1514 procedure Unchecked_Free is new
1515 Ada.Unchecked_Deallocation (Comment_Array, Comments_Ptr);
1518 End_Of_Line_Node := S.End_Of_Line_Node;
1519 Previous_Line_Node := S.Previous_Line_Node;
1520 Previous_End_Node := S.Previous_End_Node;
1521 Next_End_Nodes.Set_Last (0);
1522 Unkept_Comments := S.Unkept_Comments;
1524 Comments.Set_Last (0);
1526 for J in S.Comments'Range loop
1527 Comments.Increment_Last;
1528 Comments.Table (Comments.Last) := S.Comments (J);
1531 Unchecked_Free (S.Comments);
1532 end Restore_And_Free;
1538 procedure Save (S : out Comment_State) is
1539 Cmts : constant Comments_Ptr := new Comment_Array (1 .. Comments.Last);
1542 for J in 1 .. Comments.Last loop
1543 Cmts (J) := Comments.Table (J);
1547 (End_Of_Line_Node => End_Of_Line_Node,
1548 Previous_Line_Node => Previous_Line_Node,
1549 Previous_End_Node => Previous_End_Node,
1550 Unkept_Comments => Unkept_Comments,
1558 procedure Scan (In_Tree : Project_Node_Tree_Ref) is
1559 Empty_Line : Boolean := False;
1562 -- If there are comments, then they will not be kept. Set the flag and
1563 -- clear the comments.
1565 if Comments.Last > 0 then
1566 Unkept_Comments := True;
1567 Comments.Set_Last (0);
1570 -- Loop until a token other that End_Of_Line or Comment is found
1573 Prj.Err.Scanner.Scan;
1576 when Tok_End_Of_Line =>
1577 if Prev_Token = Tok_End_Of_Line then
1580 if Comments.Last > 0 then
1581 Comments.Table (Comments.Last).Is_Followed_By_Empty_Line
1587 -- If this is a line comment, add it to the comment table
1589 if Prev_Token = Tok_End_Of_Line
1590 or else Prev_Token = No_Token
1592 Comments.Increment_Last;
1593 Comments.Table (Comments.Last) :=
1594 (Value => Comment_Id,
1595 Follows_Empty_Line => Empty_Line,
1596 Is_Followed_By_Empty_Line => False);
1598 -- Otherwise, it is an end of line comment. If there is
1599 -- an end of line node specified, associate the comment with
1602 elsif Present (End_Of_Line_Node) then
1604 Zones : constant Project_Node_Id :=
1605 Comment_Zones_Of (End_Of_Line_Node, In_Tree);
1607 In_Tree.Project_Nodes.Table (Zones).Value := Comment_Id;
1610 -- Otherwise, this end of line node cannot be kept
1613 Unkept_Comments := True;
1614 Comments.Set_Last (0);
1617 Empty_Line := False;
1620 -- If there are comments, where the first comment is not
1621 -- following an empty line, put the initial uninterrupted
1622 -- comment zone with the node of the preceding line (either
1623 -- a Previous_Line or a Previous_End node), if any.
1625 if Comments.Last > 0 and then
1626 not Comments.Table (1).Follows_Empty_Line then
1627 if Present (Previous_Line_Node) then
1629 (To => Previous_Line_Node,
1631 In_Tree => In_Tree);
1633 elsif Present (Previous_End_Node) then
1635 (To => Previous_End_Node,
1637 In_Tree => In_Tree);
1641 -- If there are still comments and the token is "end", then
1642 -- put these comments with the Next_End node, if any;
1643 -- otherwise, these comments cannot be kept. Always clear
1646 if Comments.Last > 0 and then Token = Tok_End then
1647 if Next_End_Nodes.Last > 0 then
1649 (To => Next_End_Nodes.Table (Next_End_Nodes.Last),
1650 Where => Before_End,
1651 In_Tree => In_Tree);
1654 Unkept_Comments := True;
1657 Comments.Set_Last (0);
1660 -- Reset the End_Of_Line, Previous_Line and Previous_End nodes
1661 -- so that they are not used again.
1663 End_Of_Line_Node := Empty_Node;
1664 Previous_Line_Node := Empty_Node;
1665 Previous_End_Node := Empty_Node;
1674 ------------------------------------
1675 -- Set_Associative_Array_Index_Of --
1676 ------------------------------------
1678 procedure Set_Associative_Array_Index_Of
1679 (Node : Project_Node_Id;
1680 In_Tree : Project_Node_Tree_Ref;
1687 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1689 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1690 In_Tree.Project_Nodes.Table (Node).Value := To;
1691 end Set_Associative_Array_Index_Of;
1693 --------------------------------
1694 -- Set_Associative_Package_Of --
1695 --------------------------------
1697 procedure Set_Associative_Package_Of
1698 (Node : Project_Node_Id;
1699 In_Tree : Project_Node_Tree_Ref;
1700 To : Project_Node_Id)
1706 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration);
1707 In_Tree.Project_Nodes.Table (Node).Field3 := To;
1708 end Set_Associative_Package_Of;
1710 --------------------------------
1711 -- Set_Associative_Project_Of --
1712 --------------------------------
1714 procedure Set_Associative_Project_Of
1715 (Node : Project_Node_Id;
1716 In_Tree : Project_Node_Tree_Ref;
1717 To : Project_Node_Id)
1723 (In_Tree.Project_Nodes.Table (Node).Kind =
1724 N_Attribute_Declaration));
1725 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1726 end Set_Associative_Project_Of;
1728 --------------------------
1729 -- Set_Case_Insensitive --
1730 --------------------------
1732 procedure Set_Case_Insensitive
1733 (Node : Project_Node_Id;
1734 In_Tree : Project_Node_Tree_Ref;
1741 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1743 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1744 In_Tree.Project_Nodes.Table (Node).Flag1 := To;
1745 end Set_Case_Insensitive;
1747 ------------------------------------
1748 -- Set_Case_Variable_Reference_Of --
1749 ------------------------------------
1751 procedure Set_Case_Variable_Reference_Of
1752 (Node : Project_Node_Id;
1753 In_Tree : Project_Node_Tree_Ref;
1754 To : Project_Node_Id)
1760 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
1761 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1762 end Set_Case_Variable_Reference_Of;
1764 ---------------------------
1765 -- Set_Current_Item_Node --
1766 ---------------------------
1768 procedure Set_Current_Item_Node
1769 (Node : Project_Node_Id;
1770 In_Tree : Project_Node_Tree_Ref;
1771 To : Project_Node_Id)
1777 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
1778 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1779 end Set_Current_Item_Node;
1781 ----------------------
1782 -- Set_Current_Term --
1783 ----------------------
1785 procedure Set_Current_Term
1786 (Node : Project_Node_Id;
1787 In_Tree : Project_Node_Tree_Ref;
1788 To : Project_Node_Id)
1794 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
1795 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1796 end Set_Current_Term;
1798 ----------------------
1799 -- Set_Directory_Of --
1800 ----------------------
1802 procedure Set_Directory_Of
1803 (Node : Project_Node_Id;
1804 In_Tree : Project_Node_Tree_Ref;
1805 To : Path_Name_Type)
1811 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1812 In_Tree.Project_Nodes.Table (Node).Directory := To;
1813 end Set_Directory_Of;
1815 ---------------------
1816 -- Set_End_Of_Line --
1817 ---------------------
1819 procedure Set_End_Of_Line (To : Project_Node_Id) is
1821 End_Of_Line_Node := To;
1822 end Set_End_Of_Line;
1824 ----------------------------
1825 -- Set_Expression_Kind_Of --
1826 ----------------------------
1828 procedure Set_Expression_Kind_Of
1829 (Node : Project_Node_Id;
1830 In_Tree : Project_Node_Tree_Ref;
1837 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
1839 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1841 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
1843 In_Tree.Project_Nodes.Table (Node).Kind =
1844 N_Typed_Variable_Declaration
1846 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
1848 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
1850 In_Tree.Project_Nodes.Table (Node).Kind = N_Term
1852 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1854 In_Tree.Project_Nodes.Table (Node).Kind =
1855 N_Attribute_Reference));
1856 In_Tree.Project_Nodes.Table (Node).Expr_Kind := To;
1857 end Set_Expression_Kind_Of;
1859 -----------------------
1860 -- Set_Expression_Of --
1861 -----------------------
1863 procedure Set_Expression_Of
1864 (Node : Project_Node_Id;
1865 In_Tree : Project_Node_Tree_Ref;
1866 To : Project_Node_Id)
1872 (In_Tree.Project_Nodes.Table (Node).Kind =
1873 N_Attribute_Declaration
1875 In_Tree.Project_Nodes.Table (Node).Kind =
1876 N_Typed_Variable_Declaration
1878 In_Tree.Project_Nodes.Table (Node).Kind =
1879 N_Variable_Declaration));
1880 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1881 end Set_Expression_Of;
1883 -------------------------------
1884 -- Set_External_Reference_Of --
1885 -------------------------------
1887 procedure Set_External_Reference_Of
1888 (Node : Project_Node_Id;
1889 In_Tree : Project_Node_Tree_Ref;
1890 To : Project_Node_Id)
1896 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
1897 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1898 end Set_External_Reference_Of;
1900 -----------------------------
1901 -- Set_External_Default_Of --
1902 -----------------------------
1904 procedure Set_External_Default_Of
1905 (Node : Project_Node_Id;
1906 In_Tree : Project_Node_Tree_Ref;
1907 To : Project_Node_Id)
1913 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
1914 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1915 end Set_External_Default_Of;
1917 ----------------------------
1918 -- Set_First_Case_Item_Of --
1919 ----------------------------
1921 procedure Set_First_Case_Item_Of
1922 (Node : Project_Node_Id;
1923 In_Tree : Project_Node_Tree_Ref;
1924 To : Project_Node_Id)
1930 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
1931 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1932 end Set_First_Case_Item_Of;
1934 -------------------------
1935 -- Set_First_Choice_Of --
1936 -------------------------
1938 procedure Set_First_Choice_Of
1939 (Node : Project_Node_Id;
1940 In_Tree : Project_Node_Tree_Ref;
1941 To : Project_Node_Id)
1947 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1948 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1949 end Set_First_Choice_Of;
1951 -----------------------------
1952 -- Set_First_Comment_After --
1953 -----------------------------
1955 procedure Set_First_Comment_After
1956 (Node : Project_Node_Id;
1957 In_Tree : Project_Node_Tree_Ref;
1958 To : Project_Node_Id)
1960 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1962 In_Tree.Project_Nodes.Table (Zone).Field2 := To;
1963 end Set_First_Comment_After;
1965 ---------------------------------
1966 -- Set_First_Comment_After_End --
1967 ---------------------------------
1969 procedure Set_First_Comment_After_End
1970 (Node : Project_Node_Id;
1971 In_Tree : Project_Node_Tree_Ref;
1972 To : Project_Node_Id)
1974 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1976 In_Tree.Project_Nodes.Table (Zone).Comments := To;
1977 end Set_First_Comment_After_End;
1979 ------------------------------
1980 -- Set_First_Comment_Before --
1981 ------------------------------
1983 procedure Set_First_Comment_Before
1984 (Node : Project_Node_Id;
1985 In_Tree : Project_Node_Tree_Ref;
1986 To : Project_Node_Id)
1989 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1991 In_Tree.Project_Nodes.Table (Zone).Field1 := To;
1992 end Set_First_Comment_Before;
1994 ----------------------------------
1995 -- Set_First_Comment_Before_End --
1996 ----------------------------------
1998 procedure Set_First_Comment_Before_End
1999 (Node : Project_Node_Id;
2000 In_Tree : Project_Node_Tree_Ref;
2001 To : Project_Node_Id)
2003 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
2005 In_Tree.Project_Nodes.Table (Zone).Field2 := To;
2006 end Set_First_Comment_Before_End;
2008 ------------------------
2009 -- Set_Next_Case_Item --
2010 ------------------------
2012 procedure Set_Next_Case_Item
2013 (Node : Project_Node_Id;
2014 In_Tree : Project_Node_Tree_Ref;
2015 To : Project_Node_Id)
2021 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
2022 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2023 end Set_Next_Case_Item;
2025 ----------------------
2026 -- Set_Next_Comment --
2027 ----------------------
2029 procedure Set_Next_Comment
2030 (Node : Project_Node_Id;
2031 In_Tree : Project_Node_Tree_Ref;
2032 To : Project_Node_Id)
2038 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
2039 In_Tree.Project_Nodes.Table (Node).Comments := To;
2040 end Set_Next_Comment;
2042 -----------------------------------
2043 -- Set_First_Declarative_Item_Of --
2044 -----------------------------------
2046 procedure Set_First_Declarative_Item_Of
2047 (Node : Project_Node_Id;
2048 In_Tree : Project_Node_Tree_Ref;
2049 To : Project_Node_Id)
2055 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
2057 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
2059 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
2061 if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
2062 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2064 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2066 end Set_First_Declarative_Item_Of;
2068 ----------------------------------
2069 -- Set_First_Expression_In_List --
2070 ----------------------------------
2072 procedure Set_First_Expression_In_List
2073 (Node : Project_Node_Id;
2074 In_Tree : Project_Node_Tree_Ref;
2075 To : Project_Node_Id)
2081 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
2082 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2083 end Set_First_Expression_In_List;
2085 ------------------------------
2086 -- Set_First_Literal_String --
2087 ------------------------------
2089 procedure Set_First_Literal_String
2090 (Node : Project_Node_Id;
2091 In_Tree : Project_Node_Tree_Ref;
2092 To : Project_Node_Id)
2098 In_Tree.Project_Nodes.Table (Node).Kind =
2099 N_String_Type_Declaration);
2100 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2101 end Set_First_Literal_String;
2103 --------------------------
2104 -- Set_First_Package_Of --
2105 --------------------------
2107 procedure Set_First_Package_Of
2108 (Node : Project_Node_Id;
2109 In_Tree : Project_Node_Tree_Ref;
2110 To : Package_Declaration_Id)
2116 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2117 In_Tree.Project_Nodes.Table (Node).Packages := To;
2118 end Set_First_Package_Of;
2120 ------------------------------
2121 -- Set_First_String_Type_Of --
2122 ------------------------------
2124 procedure Set_First_String_Type_Of
2125 (Node : Project_Node_Id;
2126 In_Tree : Project_Node_Tree_Ref;
2127 To : Project_Node_Id)
2133 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2134 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2135 end Set_First_String_Type_Of;
2137 --------------------
2138 -- Set_First_Term --
2139 --------------------
2141 procedure Set_First_Term
2142 (Node : Project_Node_Id;
2143 In_Tree : Project_Node_Tree_Ref;
2144 To : Project_Node_Id)
2150 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
2151 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2154 ---------------------------
2155 -- Set_First_Variable_Of --
2156 ---------------------------
2158 procedure Set_First_Variable_Of
2159 (Node : Project_Node_Id;
2160 In_Tree : Project_Node_Tree_Ref;
2161 To : Variable_Node_Id)
2167 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2169 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
2170 In_Tree.Project_Nodes.Table (Node).Variables := To;
2171 end Set_First_Variable_Of;
2173 ------------------------------
2174 -- Set_First_With_Clause_Of --
2175 ------------------------------
2177 procedure Set_First_With_Clause_Of
2178 (Node : Project_Node_Id;
2179 In_Tree : Project_Node_Tree_Ref;
2180 To : Project_Node_Id)
2186 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2187 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2188 end Set_First_With_Clause_Of;
2190 --------------------------
2191 -- Set_Is_Extending_All --
2192 --------------------------
2194 procedure Set_Is_Extending_All
2195 (Node : Project_Node_Id;
2196 In_Tree : Project_Node_Tree_Ref)
2202 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2204 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
2205 In_Tree.Project_Nodes.Table (Node).Flag2 := True;
2206 end Set_Is_Extending_All;
2208 -----------------------------
2209 -- Set_Is_Not_Last_In_List --
2210 -----------------------------
2212 procedure Set_Is_Not_Last_In_List
2213 (Node : Project_Node_Id;
2214 In_Tree : Project_Node_Tree_Ref)
2220 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
2221 In_Tree.Project_Nodes.Table (Node).Flag1 := True;
2222 end Set_Is_Not_Last_In_List;
2228 procedure Set_Kind_Of
2229 (Node : Project_Node_Id;
2230 In_Tree : Project_Node_Tree_Ref;
2231 To : Project_Node_Kind)
2234 pragma Assert (Present (Node));
2235 In_Tree.Project_Nodes.Table (Node).Kind := To;
2238 ---------------------
2239 -- Set_Location_Of --
2240 ---------------------
2242 procedure Set_Location_Of
2243 (Node : Project_Node_Id;
2244 In_Tree : Project_Node_Tree_Ref;
2248 pragma Assert (Present (Node));
2249 In_Tree.Project_Nodes.Table (Node).Location := To;
2250 end Set_Location_Of;
2252 -----------------------------
2253 -- Set_Extended_Project_Of --
2254 -----------------------------
2256 procedure Set_Extended_Project_Of
2257 (Node : Project_Node_Id;
2258 In_Tree : Project_Node_Tree_Ref;
2259 To : Project_Node_Id)
2265 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
2266 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2267 end Set_Extended_Project_Of;
2269 ----------------------------------
2270 -- Set_Extended_Project_Path_Of --
2271 ----------------------------------
2273 procedure Set_Extended_Project_Path_Of
2274 (Node : Project_Node_Id;
2275 In_Tree : Project_Node_Tree_Ref;
2276 To : Path_Name_Type)
2282 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2283 In_Tree.Project_Nodes.Table (Node).Value := Name_Id (To);
2284 end Set_Extended_Project_Path_Of;
2286 ------------------------------
2287 -- Set_Extending_Project_Of --
2288 ------------------------------
2290 procedure Set_Extending_Project_Of
2291 (Node : Project_Node_Id;
2292 In_Tree : Project_Node_Tree_Ref;
2293 To : Project_Node_Id)
2299 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
2300 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2301 end Set_Extending_Project_Of;
2307 procedure Set_Name_Of
2308 (Node : Project_Node_Id;
2309 In_Tree : Project_Node_Tree_Ref;
2313 pragma Assert (Present (Node));
2314 In_Tree.Project_Nodes.Table (Node).Name := To;
2317 -------------------------------
2318 -- Set_Next_Declarative_Item --
2319 -------------------------------
2321 procedure Set_Next_Declarative_Item
2322 (Node : Project_Node_Id;
2323 In_Tree : Project_Node_Tree_Ref;
2324 To : Project_Node_Id)
2330 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
2331 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2332 end Set_Next_Declarative_Item;
2334 -----------------------
2335 -- Set_Next_End_Node --
2336 -----------------------
2338 procedure Set_Next_End_Node (To : Project_Node_Id) is
2340 Next_End_Nodes.Increment_Last;
2341 Next_End_Nodes.Table (Next_End_Nodes.Last) := To;
2342 end Set_Next_End_Node;
2344 ---------------------------------
2345 -- Set_Next_Expression_In_List --
2346 ---------------------------------
2348 procedure Set_Next_Expression_In_List
2349 (Node : Project_Node_Id;
2350 In_Tree : Project_Node_Tree_Ref;
2351 To : Project_Node_Id)
2357 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
2358 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2359 end Set_Next_Expression_In_List;
2361 -----------------------------
2362 -- Set_Next_Literal_String --
2363 -----------------------------
2365 procedure Set_Next_Literal_String
2366 (Node : Project_Node_Id;
2367 In_Tree : Project_Node_Tree_Ref;
2368 To : Project_Node_Id)
2374 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
2375 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2376 end Set_Next_Literal_String;
2378 ---------------------------------
2379 -- Set_Next_Package_In_Project --
2380 ---------------------------------
2382 procedure Set_Next_Package_In_Project
2383 (Node : Project_Node_Id;
2384 In_Tree : Project_Node_Tree_Ref;
2385 To : Project_Node_Id)
2391 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2392 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2393 end Set_Next_Package_In_Project;
2395 --------------------------
2396 -- Set_Next_String_Type --
2397 --------------------------
2399 procedure Set_Next_String_Type
2400 (Node : Project_Node_Id;
2401 In_Tree : Project_Node_Tree_Ref;
2402 To : Project_Node_Id)
2408 In_Tree.Project_Nodes.Table (Node).Kind =
2409 N_String_Type_Declaration);
2410 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2411 end Set_Next_String_Type;
2417 procedure Set_Next_Term
2418 (Node : Project_Node_Id;
2419 In_Tree : Project_Node_Tree_Ref;
2420 To : Project_Node_Id)
2426 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
2427 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2430 -----------------------
2431 -- Set_Next_Variable --
2432 -----------------------
2434 procedure Set_Next_Variable
2435 (Node : Project_Node_Id;
2436 In_Tree : Project_Node_Tree_Ref;
2437 To : Project_Node_Id)
2443 (In_Tree.Project_Nodes.Table (Node).Kind =
2444 N_Typed_Variable_Declaration
2446 In_Tree.Project_Nodes.Table (Node).Kind =
2447 N_Variable_Declaration));
2448 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2449 end Set_Next_Variable;
2451 -----------------------------
2452 -- Set_Next_With_Clause_Of --
2453 -----------------------------
2455 procedure Set_Next_With_Clause_Of
2456 (Node : Project_Node_Id;
2457 In_Tree : Project_Node_Tree_Ref;
2458 To : Project_Node_Id)
2464 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
2465 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2466 end Set_Next_With_Clause_Of;
2468 -----------------------
2469 -- Set_Package_Id_Of --
2470 -----------------------
2472 procedure Set_Package_Id_Of
2473 (Node : Project_Node_Id;
2474 In_Tree : Project_Node_Tree_Ref;
2475 To : Package_Node_Id)
2481 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2482 In_Tree.Project_Nodes.Table (Node).Pkg_Id := To;
2483 end Set_Package_Id_Of;
2485 -------------------------
2486 -- Set_Package_Node_Of --
2487 -------------------------
2489 procedure Set_Package_Node_Of
2490 (Node : Project_Node_Id;
2491 In_Tree : Project_Node_Tree_Ref;
2492 To : Project_Node_Id)
2498 (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
2500 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
2501 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2502 end Set_Package_Node_Of;
2504 ----------------------
2505 -- Set_Path_Name_Of --
2506 ----------------------
2508 procedure Set_Path_Name_Of
2509 (Node : Project_Node_Id;
2510 In_Tree : Project_Node_Tree_Ref;
2511 To : Path_Name_Type)
2517 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2519 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
2520 In_Tree.Project_Nodes.Table (Node).Path_Name := To;
2521 end Set_Path_Name_Of;
2523 ---------------------------
2524 -- Set_Previous_End_Node --
2525 ---------------------------
2526 procedure Set_Previous_End_Node (To : Project_Node_Id) is
2528 Previous_End_Node := To;
2529 end Set_Previous_End_Node;
2531 ----------------------------
2532 -- Set_Previous_Line_Node --
2533 ----------------------------
2535 procedure Set_Previous_Line_Node (To : Project_Node_Id) is
2537 Previous_Line_Node := To;
2538 end Set_Previous_Line_Node;
2540 --------------------------------
2541 -- Set_Project_Declaration_Of --
2542 --------------------------------
2544 procedure Set_Project_Declaration_Of
2545 (Node : Project_Node_Id;
2546 In_Tree : Project_Node_Tree_Ref;
2547 To : Project_Node_Id)
2553 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2554 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2555 end Set_Project_Declaration_Of;
2557 ------------------------------
2558 -- Set_Project_Qualifier_Of --
2559 ------------------------------
2561 procedure Set_Project_Qualifier_Of
2562 (Node : Project_Node_Id;
2563 In_Tree : Project_Node_Tree_Ref;
2564 To : Project_Qualifier)
2569 and then In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2570 In_Tree.Project_Nodes.Table (Node).Qualifier := To;
2571 end Set_Project_Qualifier_Of;
2573 ---------------------------
2574 -- Set_Parent_Project_Of --
2575 ---------------------------
2577 procedure Set_Parent_Project_Of
2578 (Node : Project_Node_Id;
2579 In_Tree : Project_Node_Tree_Ref;
2580 To : Project_Node_Id)
2585 and then In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2586 In_Tree.Project_Nodes.Table (Node).Field4 := To;
2587 end Set_Parent_Project_Of;
2589 -----------------------------------------------
2590 -- Set_Project_File_Includes_Unkept_Comments --
2591 -----------------------------------------------
2593 procedure Set_Project_File_Includes_Unkept_Comments
2594 (Node : Project_Node_Id;
2595 In_Tree : Project_Node_Tree_Ref;
2598 Declaration : constant Project_Node_Id :=
2599 Project_Declaration_Of (Node, In_Tree);
2601 In_Tree.Project_Nodes.Table (Declaration).Flag1 := To;
2602 end Set_Project_File_Includes_Unkept_Comments;
2604 -------------------------
2605 -- Set_Project_Node_Of --
2606 -------------------------
2608 procedure Set_Project_Node_Of
2609 (Node : Project_Node_Id;
2610 In_Tree : Project_Node_Tree_Ref;
2611 To : Project_Node_Id;
2612 Limited_With : Boolean := False)
2618 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2620 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
2622 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
2623 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2625 if In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2626 and then not Limited_With
2628 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2630 end Set_Project_Node_Of;
2632 ---------------------------------------
2633 -- Set_Project_Of_Renamed_Package_Of --
2634 ---------------------------------------
2636 procedure Set_Project_Of_Renamed_Package_Of
2637 (Node : Project_Node_Id;
2638 In_Tree : Project_Node_Tree_Ref;
2639 To : Project_Node_Id)
2645 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2646 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2647 end Set_Project_Of_Renamed_Package_Of;
2649 -------------------------
2650 -- Set_Source_Index_Of --
2651 -------------------------
2653 procedure Set_Source_Index_Of
2654 (Node : Project_Node_Id;
2655 In_Tree : Project_Node_Tree_Ref;
2662 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
2664 In_Tree.Project_Nodes.Table (Node).Kind =
2665 N_Attribute_Declaration));
2666 In_Tree.Project_Nodes.Table (Node).Src_Index := To;
2667 end Set_Source_Index_Of;
2669 ------------------------
2670 -- Set_String_Type_Of --
2671 ------------------------
2673 procedure Set_String_Type_Of
2674 (Node : Project_Node_Id;
2675 In_Tree : Project_Node_Tree_Ref;
2676 To : Project_Node_Id)
2682 (In_Tree.Project_Nodes.Table (Node).Kind =
2683 N_Variable_Reference
2685 In_Tree.Project_Nodes.Table (Node).Kind =
2686 N_Typed_Variable_Declaration)
2688 In_Tree.Project_Nodes.Table (To).Kind = N_String_Type_Declaration);
2690 if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
2691 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2693 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2695 end Set_String_Type_Of;
2697 -------------------------
2698 -- Set_String_Value_Of --
2699 -------------------------
2701 procedure Set_String_Value_Of
2702 (Node : Project_Node_Id;
2703 In_Tree : Project_Node_Tree_Ref;
2710 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2712 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
2714 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
2715 In_Tree.Project_Nodes.Table (Node).Value := To;
2716 end Set_String_Value_Of;
2718 ---------------------
2719 -- Source_Index_Of --
2720 ---------------------
2722 function Source_Index_Of
2723 (Node : Project_Node_Id;
2724 In_Tree : Project_Node_Tree_Ref) return Int
2730 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
2732 In_Tree.Project_Nodes.Table (Node).Kind =
2733 N_Attribute_Declaration));
2734 return In_Tree.Project_Nodes.Table (Node).Src_Index;
2735 end Source_Index_Of;
2737 --------------------
2738 -- String_Type_Of --
2739 --------------------
2741 function String_Type_Of
2742 (Node : Project_Node_Id;
2743 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
2749 (In_Tree.Project_Nodes.Table (Node).Kind =
2750 N_Variable_Reference
2752 In_Tree.Project_Nodes.Table (Node).Kind =
2753 N_Typed_Variable_Declaration));
2755 if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
2756 return In_Tree.Project_Nodes.Table (Node).Field3;
2758 return In_Tree.Project_Nodes.Table (Node).Field2;
2762 ---------------------
2763 -- String_Value_Of --
2764 ---------------------
2766 function String_Value_Of
2767 (Node : Project_Node_Id;
2768 In_Tree : Project_Node_Tree_Ref) return Name_Id
2774 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2776 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
2778 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
2779 return In_Tree.Project_Nodes.Table (Node).Value;
2780 end String_Value_Of;
2782 --------------------
2783 -- Value_Is_Valid --
2784 --------------------
2786 function Value_Is_Valid
2787 (For_Typed_Variable : Project_Node_Id;
2788 In_Tree : Project_Node_Tree_Ref;
2789 Value : Name_Id) return Boolean
2793 (Present (For_Typed_Variable)
2795 (In_Tree.Project_Nodes.Table (For_Typed_Variable).Kind =
2796 N_Typed_Variable_Declaration));
2799 Current_String : Project_Node_Id :=
2800 First_Literal_String
2801 (String_Type_Of (For_Typed_Variable, In_Tree),
2805 while Present (Current_String)
2807 String_Value_Of (Current_String, In_Tree) /= Value
2810 Next_Literal_String (Current_String, In_Tree);
2813 return Present (Current_String);
2818 -------------------------------
2819 -- There_Are_Unkept_Comments --
2820 -------------------------------
2822 function There_Are_Unkept_Comments return Boolean is
2824 return Unkept_Comments;
2825 end There_Are_Unkept_Comments;
2827 --------------------
2828 -- Create_Project --
2829 --------------------
2831 function Create_Project
2832 (In_Tree : Project_Node_Tree_Ref;
2834 Full_Path : Path_Name_Type;
2835 Is_Config_File : Boolean := False) return Project_Node_Id
2837 Project : Project_Node_Id;
2838 Qualifier : Project_Qualifier := Unspecified;
2840 Project := Default_Project_Node (In_Tree, N_Project);
2841 Set_Name_Of (Project, In_Tree, Name);
2844 Path_Name_Type (Get_Directory (File_Name_Type (Full_Path))));
2845 Set_Path_Name_Of (Project, In_Tree, Full_Path);
2847 Set_Project_Declaration_Of
2849 Default_Project_Node (In_Tree, N_Project_Declaration));
2851 if Is_Config_File then
2852 Qualifier := Configuration;
2855 if not Is_Config_File then
2856 Prj.Tree.Tree_Private_Part.Projects_Htable.Set
2857 (In_Tree.Projects_HT,
2859 Prj.Tree.Tree_Private_Part.Project_Name_And_Node'
2861 Display_Name => Name,
2862 Canonical_Path => No_Path,
2865 Proj_Qualifier => Qualifier));
2875 procedure Add_At_End
2876 (Tree : Project_Node_Tree_Ref;
2877 Parent : Project_Node_Id;
2878 Expr : Project_Node_Id;
2879 Add_Before_First_Pkg : Boolean := False;
2880 Add_Before_First_Case : Boolean := False)
2882 Real_Parent : Project_Node_Id;
2883 New_Decl, Decl, Next : Project_Node_Id;
2884 Last, L : Project_Node_Id;
2887 if Kind_Of (Expr, Tree) /= N_Declarative_Item then
2888 New_Decl := Default_Project_Node (Tree, N_Declarative_Item);
2889 Set_Current_Item_Node (New_Decl, Tree, Expr);
2894 if Kind_Of (Parent, Tree) = N_Project then
2895 Real_Parent := Project_Declaration_Of (Parent, Tree);
2897 Real_Parent := Parent;
2900 Decl := First_Declarative_Item_Of (Real_Parent, Tree);
2902 if Decl = Empty_Node then
2903 Set_First_Declarative_Item_Of (Real_Parent, Tree, New_Decl);
2906 Next := Next_Declarative_Item (Decl, Tree);
2907 exit when Next = Empty_Node
2909 (Add_Before_First_Pkg
2910 and then Kind_Of (Current_Item_Node (Next, Tree), Tree) =
2911 N_Package_Declaration)
2913 (Add_Before_First_Case
2914 and then Kind_Of (Current_Item_Node (Next, Tree), Tree) =
2915 N_Case_Construction);
2919 -- In case Expr is in fact a range of declarative items
2923 L := Next_Declarative_Item (Last, Tree);
2924 exit when L = Empty_Node;
2928 -- In case Expr is in fact a range of declarative items
2932 L := Next_Declarative_Item (Last, Tree);
2933 exit when L = Empty_Node;
2937 Set_Next_Declarative_Item (Last, Tree, Next);
2938 Set_Next_Declarative_Item (Decl, Tree, New_Decl);
2942 ---------------------------
2943 -- Create_Literal_String --
2944 ---------------------------
2946 function Create_Literal_String
2947 (Str : Namet.Name_Id;
2948 Tree : Project_Node_Tree_Ref) return Project_Node_Id
2950 Node : Project_Node_Id;
2952 Node := Default_Project_Node (Tree, N_Literal_String, Prj.Single);
2953 Set_Next_Literal_String (Node, Tree, Empty_Node);
2954 Set_String_Value_Of (Node, Tree, Str);
2956 end Create_Literal_String;
2958 ---------------------------
2959 -- Enclose_In_Expression --
2960 ---------------------------
2962 function Enclose_In_Expression
2963 (Node : Project_Node_Id;
2964 Tree : Project_Node_Tree_Ref) return Project_Node_Id
2966 Expr : constant Project_Node_Id :=
2967 Default_Project_Node (Tree, N_Expression, Single);
2969 Set_First_Term (Expr, Tree, Default_Project_Node (Tree, N_Term, Single));
2970 Set_Current_Term (First_Term (Expr, Tree), Tree, Node);
2972 end Enclose_In_Expression;
2974 --------------------
2975 -- Create_Package --
2976 --------------------
2978 function Create_Package
2979 (Tree : Project_Node_Tree_Ref;
2980 Project : Project_Node_Id;
2981 Pkg : String) return Project_Node_Id
2983 Pack : Project_Node_Id;
2987 Name_Len := Pkg'Length;
2988 Name_Buffer (1 .. Name_Len) := Pkg;
2991 -- Check if the package already exists
2993 Pack := First_Package_Of (Project, Tree);
2994 while Pack /= Empty_Node loop
2995 if Prj.Tree.Name_Of (Pack, Tree) = N then
2999 Pack := Next_Package_In_Project (Pack, Tree);
3002 -- Create the package and add it to the declarative item
3004 Pack := Default_Project_Node (Tree, N_Package_Declaration);
3005 Set_Name_Of (Pack, Tree, N);
3007 -- Find the correct package id to use
3009 Set_Package_Id_Of (Pack, Tree, Package_Node_Id_Of (N));
3011 -- Add it to the list of packages
3013 Set_Next_Package_In_Project
3014 (Pack, Tree, First_Package_Of (Project, Tree));
3015 Set_First_Package_Of (Project, Tree, Pack);
3017 Add_At_End (Tree, Project_Declaration_Of (Project, Tree), Pack);
3023 -- Create_Attribute --
3024 ----------------------
3026 function Create_Attribute
3027 (Tree : Project_Node_Tree_Ref;
3028 Prj_Or_Pkg : Project_Node_Id;
3030 Index_Name : Name_Id := No_Name;
3031 Kind : Variable_Kind := List;
3032 At_Index : Integer := 0) return Project_Node_Id
3034 Node : constant Project_Node_Id :=
3035 Default_Project_Node (Tree, N_Attribute_Declaration, Kind);
3037 Case_Insensitive : Boolean;
3039 Pkg : Package_Node_Id;
3040 Start_At : Attribute_Node_Id;
3043 Set_Name_Of (Node, Tree, Name);
3045 if At_Index /= 0 then
3046 Set_Source_Index_Of (Node, Tree, To => Int (At_Index));
3049 if Index_Name /= No_Name then
3050 Set_Associative_Array_Index_Of (Node, Tree, Index_Name);
3053 if Prj_Or_Pkg /= Empty_Node then
3054 Add_At_End (Tree, Prj_Or_Pkg, Node);
3057 -- Find out the case sensitivity of the attribute
3059 if Prj_Or_Pkg /= Empty_Node
3060 and then Kind_Of (Prj_Or_Pkg, Tree) = N_Package_Declaration
3062 Pkg := Prj.Attr.Package_Node_Id_Of (Name_Of (Prj_Or_Pkg, Tree));
3063 Start_At := First_Attribute_Of (Pkg);
3065 Start_At := Attribute_First;
3068 Start_At := Attribute_Node_Id_Of (Name, Start_At);
3070 Attribute_Kind_Of (Start_At) = Case_Insensitive_Associative_Array;
3071 Tree.Project_Nodes.Table (Node).Flag1 := Case_Insensitive;
3074 end Create_Attribute;