1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2005 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 2, 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 COPYING. If not, write --
19 -- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
20 -- MA 02111-1307, USA. --
22 -- GNAT was originally developed by the GNAT team at New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc. --
25 ------------------------------------------------------------------------------
29 package body Prj.Tree is
31 Node_With_Comments : constant array (Project_Node_Kind) of Boolean :=
33 N_With_Clause => True,
34 N_Project_Declaration => False,
35 N_Declarative_Item => False,
36 N_Package_Declaration => True,
37 N_String_Type_Declaration => True,
38 N_Literal_String => False,
39 N_Attribute_Declaration => True,
40 N_Typed_Variable_Declaration => True,
41 N_Variable_Declaration => True,
42 N_Expression => False,
44 N_Literal_String_List => False,
45 N_Variable_Reference => False,
46 N_External_Value => False,
47 N_Attribute_Reference => False,
48 N_Case_Construction => True,
50 N_Comment_Zones => True,
52 -- Indicates the kinds of node that may have associated comments
54 package Next_End_Nodes is new Table.Table
55 (Table_Component_Type => Project_Node_Id,
56 Table_Index_Type => Natural,
59 Table_Increment => 100,
60 Table_Name => "Next_End_Nodes");
61 -- A stack of nodes to indicates to what node the next "end" is associated
63 use Tree_Private_Part;
65 End_Of_Line_Node : Project_Node_Id := Empty_Node;
66 -- The node an end of line comment may be associated with
68 Previous_Line_Node : Project_Node_Id := Empty_Node;
69 -- The node an immediately following comment may be associated with
71 Previous_End_Node : Project_Node_Id := Empty_Node;
72 -- The node comments immediately following an "end" line may be
75 Unkept_Comments : Boolean := False;
76 -- Set to True when some comments may not be associated with any node
78 function Comment_Zones_Of
79 (Node : Project_Node_Id;
80 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
81 -- Returns the ID of the N_Comment_Zones node associated with node Node.
82 -- If there is not already an N_Comment_Zones node, create one and
83 -- associate it with node Node.
89 procedure Add_Comments
90 (To : Project_Node_Id;
91 In_Tree : Project_Node_Tree_Ref;
92 Where : Comment_Location) is
93 Zone : Project_Node_Id := Empty_Node;
94 Previous : Project_Node_Id := Empty_Node;
100 In_Tree.Project_Nodes.Table (To).Kind /= N_Comment);
102 Zone := In_Tree.Project_Nodes.Table (To).Comments;
104 if Zone = Empty_Node then
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 Expr_Kind => Undefined,
113 Location => No_Location,
114 Directory => No_Name,
115 Variables => Empty_Node,
116 Packages => Empty_Node,
117 Pkg_Id => Empty_Package,
120 Path_Name => No_Name,
122 Field1 => Empty_Node,
123 Field2 => Empty_Node,
124 Field3 => Empty_Node,
127 Comments => Empty_Node);
129 Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
130 In_Tree.Project_Nodes.Table (To).Comments := Zone;
133 if Where = End_Of_Line then
134 In_Tree.Project_Nodes.Table (Zone).Value := Comments.Table (1).Value;
137 -- Get each comments in the Comments table and link them to node To
139 for J in 1 .. Comments.Last loop
141 -- Create new N_Comment node
143 if (Where = After or else Where = After_End) and then
144 Token /= Tok_EOF and then
145 Comments.Table (J).Follows_Empty_Line
147 Comments.Table (1 .. Comments.Last - J + 1) :=
148 Comments.Table (J .. Comments.Last);
149 Comments.Set_Last (Comments.Last - J + 1);
153 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
154 In_Tree.Project_Nodes.Table
155 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
157 Expr_Kind => Undefined,
158 Flag1 => Comments.Table (J).Follows_Empty_Line,
160 Comments.Table (J).Is_Followed_By_Empty_Line,
161 Location => No_Location,
162 Directory => No_Name,
163 Variables => Empty_Node,
164 Packages => Empty_Node,
165 Pkg_Id => Empty_Package,
168 Path_Name => No_Name,
169 Value => Comments.Table (J).Value,
170 Field1 => Empty_Node,
171 Field2 => Empty_Node,
172 Field3 => Empty_Node,
173 Comments => Empty_Node);
175 -- If this is the first comment, put it in the right field of
178 if Previous = Empty_Node then
181 In_Tree.Project_Nodes.Table (Zone).Field1 :=
182 Project_Node_Table.Last (In_Tree.Project_Nodes);
185 In_Tree.Project_Nodes.Table (Zone).Field2 :=
186 Project_Node_Table.Last (In_Tree.Project_Nodes);
189 In_Tree.Project_Nodes.Table (Zone).Field3 :=
190 Project_Node_Table.Last (In_Tree.Project_Nodes);
193 In_Tree.Project_Nodes.Table (Zone).Comments :=
194 Project_Node_Table.Last (In_Tree.Project_Nodes);
201 -- When it is not the first, link it to the previous one
203 In_Tree.Project_Nodes.Table (Previous).Comments :=
204 Project_Node_Table.Last (In_Tree.Project_Nodes);
207 -- This node becomes the previous one for the next comment, if
210 Previous := Project_Node_Table.Last (In_Tree.Project_Nodes);
214 -- Empty the Comments table, so that there is no risk to link the same
215 -- comments to another node.
217 Comments.Set_Last (0);
220 --------------------------------
221 -- Associative_Array_Index_Of --
222 --------------------------------
224 function Associative_Array_Index_Of
225 (Node : Project_Node_Id;
226 In_Tree : Project_Node_Tree_Ref) return Name_Id
232 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
234 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
235 return In_Tree.Project_Nodes.Table (Node).Value;
236 end Associative_Array_Index_Of;
238 ----------------------------
239 -- Associative_Package_Of --
240 ----------------------------
242 function Associative_Package_Of
243 (Node : Project_Node_Id;
244 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
250 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
251 return In_Tree.Project_Nodes.Table (Node).Field3;
252 end Associative_Package_Of;
254 ----------------------------
255 -- Associative_Project_Of --
256 ----------------------------
258 function Associative_Project_Of
259 (Node : Project_Node_Id;
260 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
266 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
267 return In_Tree.Project_Nodes.Table (Node).Field2;
268 end Associative_Project_Of;
270 ----------------------
271 -- Case_Insensitive --
272 ----------------------
274 function Case_Insensitive
275 (Node : Project_Node_Id;
276 In_Tree : Project_Node_Tree_Ref) return Boolean is
281 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
283 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
284 return In_Tree.Project_Nodes.Table (Node).Flag1;
285 end Case_Insensitive;
287 --------------------------------
288 -- Case_Variable_Reference_Of --
289 --------------------------------
291 function Case_Variable_Reference_Of
292 (Node : Project_Node_Id;
293 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
299 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
300 return In_Tree.Project_Nodes.Table (Node).Field1;
301 end Case_Variable_Reference_Of;
303 ----------------------
304 -- Comment_Zones_Of --
305 ----------------------
307 function Comment_Zones_Of
308 (Node : Project_Node_Id;
309 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
311 Zone : Project_Node_Id;
314 pragma Assert (Node /= Empty_Node);
315 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
317 -- If there is not already an N_Comment_Zones associated, create a new
318 -- one and associate it with node Node.
320 if Zone = Empty_Node then
321 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
322 Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
323 In_Tree.Project_Nodes.Table (Zone) :=
324 (Kind => N_Comment_Zones,
325 Location => No_Location,
326 Directory => No_Name,
327 Expr_Kind => Undefined,
328 Variables => Empty_Node,
329 Packages => Empty_Node,
330 Pkg_Id => Empty_Package,
333 Path_Name => No_Name,
335 Field1 => Empty_Node,
336 Field2 => Empty_Node,
337 Field3 => Empty_Node,
340 Comments => Empty_Node);
341 In_Tree.Project_Nodes.Table (Node).Comments := Zone;
345 end Comment_Zones_Of;
347 -----------------------
348 -- Current_Item_Node --
349 -----------------------
351 function Current_Item_Node
352 (Node : Project_Node_Id;
353 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
359 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
360 return In_Tree.Project_Nodes.Table (Node).Field1;
361 end Current_Item_Node;
367 function Current_Term
368 (Node : Project_Node_Id;
369 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
375 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
376 return In_Tree.Project_Nodes.Table (Node).Field1;
379 --------------------------
380 -- Default_Project_Node --
381 --------------------------
383 function Default_Project_Node
384 (In_Tree : Project_Node_Tree_Ref;
385 Of_Kind : Project_Node_Kind;
386 And_Expr_Kind : Variable_Kind := Undefined) return Project_Node_Id
388 Result : Project_Node_Id;
389 Zone : Project_Node_Id;
390 Previous : Project_Node_Id;
393 -- Create new node with specified kind and expression kind
395 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
396 In_Tree.Project_Nodes.Table
397 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
399 Location => No_Location,
400 Directory => No_Name,
401 Expr_Kind => And_Expr_Kind,
402 Variables => Empty_Node,
403 Packages => Empty_Node,
404 Pkg_Id => Empty_Package,
407 Path_Name => No_Name,
409 Field1 => Empty_Node,
410 Field2 => Empty_Node,
411 Field3 => Empty_Node,
414 Comments => Empty_Node);
416 -- Save the new node for the returned value
418 Result := Project_Node_Table.Last (In_Tree.Project_Nodes);
420 if Comments.Last > 0 then
422 -- If this is not a node with comments, then set the flag
424 if not Node_With_Comments (Of_Kind) then
425 Unkept_Comments := True;
427 elsif Of_Kind /= N_Comment and then Of_Kind /= N_Comment_Zones then
429 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
430 In_Tree.Project_Nodes.Table
431 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
432 (Kind => N_Comment_Zones,
433 Expr_Kind => Undefined,
434 Location => No_Location,
435 Directory => No_Name,
436 Variables => Empty_Node,
437 Packages => Empty_Node,
438 Pkg_Id => Empty_Package,
441 Path_Name => No_Name,
443 Field1 => Empty_Node,
444 Field2 => Empty_Node,
445 Field3 => Empty_Node,
448 Comments => Empty_Node);
450 Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
451 In_Tree.Project_Nodes.Table (Result).Comments := Zone;
452 Previous := Empty_Node;
454 for J in 1 .. Comments.Last loop
456 -- Create a new N_Comment node
458 Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
459 In_Tree.Project_Nodes.Table
460 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
462 Expr_Kind => Undefined,
463 Flag1 => Comments.Table (J).Follows_Empty_Line,
465 Comments.Table (J).Is_Followed_By_Empty_Line,
466 Location => No_Location,
467 Directory => No_Name,
468 Variables => Empty_Node,
469 Packages => Empty_Node,
470 Pkg_Id => Empty_Package,
473 Path_Name => No_Name,
474 Value => Comments.Table (J).Value,
475 Field1 => Empty_Node,
476 Field2 => Empty_Node,
477 Field3 => Empty_Node,
478 Comments => Empty_Node);
480 -- Link it to the N_Comment_Zones node, if it is the first,
481 -- otherwise to the previous one.
483 if Previous = Empty_Node then
484 In_Tree.Project_Nodes.Table (Zone).Field1 :=
485 Project_Node_Table.Last (In_Tree.Project_Nodes);
488 In_Tree.Project_Nodes.Table (Previous).Comments :=
489 Project_Node_Table.Last (In_Tree.Project_Nodes);
492 -- This new node will be the previous one for the next
493 -- N_Comment node, if there is one.
495 Previous := Project_Node_Table.Last (In_Tree.Project_Nodes);
498 -- Empty the Comments table after all comments have been processed
500 Comments.Set_Last (0);
505 end Default_Project_Node;
511 function Directory_Of
512 (Node : Project_Node_Id;
513 In_Tree : Project_Node_Tree_Ref) return Name_Id is
518 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
519 return In_Tree.Project_Nodes.Table (Node).Directory;
522 -------------------------
523 -- End_Of_Line_Comment --
524 -------------------------
526 function End_Of_Line_Comment
527 (Node : Project_Node_Id;
528 In_Tree : Project_Node_Tree_Ref) return Name_Id is
529 Zone : Project_Node_Id := Empty_Node;
532 pragma Assert (Node /= Empty_Node);
533 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
535 if Zone = Empty_Node then
538 return In_Tree.Project_Nodes.Table (Zone).Value;
540 end End_Of_Line_Comment;
542 ------------------------
543 -- Expression_Kind_Of --
544 ------------------------
546 function Expression_Kind_Of
547 (Node : Project_Node_Id;
548 In_Tree : Project_Node_Tree_Ref) return Variable_Kind is
553 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
555 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
557 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
559 In_Tree.Project_Nodes.Table (Node).Kind =
560 N_Typed_Variable_Declaration
562 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
564 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
566 In_Tree.Project_Nodes.Table (Node).Kind = N_Term
568 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
570 In_Tree.Project_Nodes.Table (Node).Kind =
571 N_Attribute_Reference));
573 return In_Tree.Project_Nodes.Table (Node).Expr_Kind;
574 end Expression_Kind_Of;
580 function Expression_Of
581 (Node : Project_Node_Id;
582 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
588 (In_Tree.Project_Nodes.Table (Node).Kind =
589 N_Attribute_Declaration
591 In_Tree.Project_Nodes.Table (Node).Kind =
592 N_Typed_Variable_Declaration
594 In_Tree.Project_Nodes.Table (Node).Kind =
595 N_Variable_Declaration));
597 return In_Tree.Project_Nodes.Table (Node).Field1;
600 -------------------------
601 -- Extended_Project_Of --
602 -------------------------
604 function Extended_Project_Of
605 (Node : Project_Node_Id;
606 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
612 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
613 return In_Tree.Project_Nodes.Table (Node).Field2;
614 end Extended_Project_Of;
616 ------------------------------
617 -- Extended_Project_Path_Of --
618 ------------------------------
620 function Extended_Project_Path_Of
621 (Node : Project_Node_Id;
622 In_Tree : Project_Node_Tree_Ref) return Name_Id
628 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
629 return In_Tree.Project_Nodes.Table (Node).Value;
630 end Extended_Project_Path_Of;
632 --------------------------
633 -- Extending_Project_Of --
634 --------------------------
635 function Extending_Project_Of
636 (Node : Project_Node_Id;
637 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
643 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
644 return In_Tree.Project_Nodes.Table (Node).Field3;
645 end Extending_Project_Of;
647 ---------------------------
648 -- External_Reference_Of --
649 ---------------------------
651 function External_Reference_Of
652 (Node : Project_Node_Id;
653 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
659 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
660 return In_Tree.Project_Nodes.Table (Node).Field1;
661 end External_Reference_Of;
663 -------------------------
664 -- External_Default_Of --
665 -------------------------
667 function External_Default_Of
668 (Node : Project_Node_Id;
669 In_Tree : Project_Node_Tree_Ref)
670 return Project_Node_Id
676 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
677 return In_Tree.Project_Nodes.Table (Node).Field2;
678 end External_Default_Of;
680 ------------------------
681 -- First_Case_Item_Of --
682 ------------------------
684 function First_Case_Item_Of
685 (Node : Project_Node_Id;
686 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
692 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
693 return In_Tree.Project_Nodes.Table (Node).Field2;
694 end First_Case_Item_Of;
696 ---------------------
697 -- First_Choice_Of --
698 ---------------------
700 function First_Choice_Of
701 (Node : Project_Node_Id;
702 In_Tree : Project_Node_Tree_Ref)
703 return Project_Node_Id
709 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
710 return In_Tree.Project_Nodes.Table (Node).Field1;
713 -------------------------
714 -- First_Comment_After --
715 -------------------------
717 function First_Comment_After
718 (Node : Project_Node_Id;
719 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
721 Zone : Project_Node_Id := Empty_Node;
723 pragma Assert (Node /= Empty_Node);
724 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
726 if Zone = Empty_Node then
730 return In_Tree.Project_Nodes.Table (Zone).Field2;
732 end First_Comment_After;
734 -----------------------------
735 -- First_Comment_After_End --
736 -----------------------------
738 function First_Comment_After_End
739 (Node : Project_Node_Id;
740 In_Tree : Project_Node_Tree_Ref)
741 return Project_Node_Id
743 Zone : Project_Node_Id := Empty_Node;
746 pragma Assert (Node /= Empty_Node);
747 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
749 if Zone = Empty_Node then
753 return In_Tree.Project_Nodes.Table (Zone).Comments;
755 end First_Comment_After_End;
757 --------------------------
758 -- First_Comment_Before --
759 --------------------------
761 function First_Comment_Before
762 (Node : Project_Node_Id;
763 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
765 Zone : Project_Node_Id := Empty_Node;
768 pragma Assert (Node /= Empty_Node);
769 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
771 if Zone = Empty_Node then
775 return In_Tree.Project_Nodes.Table (Zone).Field1;
777 end First_Comment_Before;
779 ------------------------------
780 -- First_Comment_Before_End --
781 ------------------------------
783 function First_Comment_Before_End
784 (Node : Project_Node_Id;
785 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
787 Zone : Project_Node_Id := Empty_Node;
790 pragma Assert (Node /= Empty_Node);
791 Zone := In_Tree.Project_Nodes.Table (Node).Comments;
793 if Zone = Empty_Node then
797 return In_Tree.Project_Nodes.Table (Zone).Field3;
799 end First_Comment_Before_End;
801 -------------------------------
802 -- First_Declarative_Item_Of --
803 -------------------------------
805 function First_Declarative_Item_Of
806 (Node : Project_Node_Id;
807 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
813 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
815 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
817 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
819 if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
820 return In_Tree.Project_Nodes.Table (Node).Field1;
822 return In_Tree.Project_Nodes.Table (Node).Field2;
824 end First_Declarative_Item_Of;
826 ------------------------------
827 -- First_Expression_In_List --
828 ------------------------------
830 function First_Expression_In_List
831 (Node : Project_Node_Id;
832 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
838 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
839 return In_Tree.Project_Nodes.Table (Node).Field1;
840 end First_Expression_In_List;
842 --------------------------
843 -- First_Literal_String --
844 --------------------------
846 function First_Literal_String
847 (Node : Project_Node_Id;
848 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
854 In_Tree.Project_Nodes.Table (Node).Kind =
855 N_String_Type_Declaration);
856 return In_Tree.Project_Nodes.Table (Node).Field1;
857 end First_Literal_String;
859 ----------------------
860 -- First_Package_Of --
861 ----------------------
863 function First_Package_Of
864 (Node : Project_Node_Id;
865 In_Tree : Project_Node_Tree_Ref) return Package_Declaration_Id
871 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
872 return In_Tree.Project_Nodes.Table (Node).Packages;
873 end First_Package_Of;
875 --------------------------
876 -- First_String_Type_Of --
877 --------------------------
879 function First_String_Type_Of
880 (Node : Project_Node_Id;
881 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
887 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
888 return In_Tree.Project_Nodes.Table (Node).Field3;
889 end First_String_Type_Of;
896 (Node : Project_Node_Id;
897 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
903 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
904 return In_Tree.Project_Nodes.Table (Node).Field1;
907 -----------------------
908 -- First_Variable_Of --
909 -----------------------
911 function First_Variable_Of
912 (Node : Project_Node_Id;
913 In_Tree : Project_Node_Tree_Ref) return Variable_Node_Id
919 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
921 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
923 return In_Tree.Project_Nodes.Table (Node).Variables;
924 end First_Variable_Of;
926 --------------------------
927 -- First_With_Clause_Of --
928 --------------------------
930 function First_With_Clause_Of
931 (Node : Project_Node_Id;
932 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
938 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
939 return In_Tree.Project_Nodes.Table (Node).Field1;
940 end First_With_Clause_Of;
942 ------------------------
943 -- Follows_Empty_Line --
944 ------------------------
946 function Follows_Empty_Line
947 (Node : Project_Node_Id;
948 In_Tree : Project_Node_Tree_Ref) return Boolean is
953 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
954 return In_Tree.Project_Nodes.Table (Node).Flag1;
955 end Follows_Empty_Line;
961 function Hash (N : Project_Node_Id) return Header_Num is
963 return Header_Num (N mod Project_Node_Id (Header_Num'Last));
970 procedure Initialize (Tree : Project_Node_Tree_Ref) is
972 Project_Node_Table.Init (Tree.Project_Nodes);
973 Projects_Htable.Reset (Tree.Projects_HT);
976 -------------------------------
977 -- Is_Followed_By_Empty_Line --
978 -------------------------------
980 function Is_Followed_By_Empty_Line
981 (Node : Project_Node_Id;
982 In_Tree : Project_Node_Tree_Ref) return Boolean
988 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
989 return In_Tree.Project_Nodes.Table (Node).Flag2;
990 end Is_Followed_By_Empty_Line;
992 ----------------------
993 -- Is_Extending_All --
994 ----------------------
996 function Is_Extending_All
997 (Node : Project_Node_Id;
998 In_Tree : Project_Node_Tree_Ref) return Boolean is
1003 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
1005 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1006 return In_Tree.Project_Nodes.Table (Node).Flag2;
1007 end Is_Extending_All;
1009 -------------------------------------
1010 -- Imported_Or_Extended_Project_Of --
1011 -------------------------------------
1013 function Imported_Or_Extended_Project_Of
1014 (Project : Project_Node_Id;
1015 In_Tree : Project_Node_Tree_Ref;
1016 With_Name : Name_Id) return Project_Node_Id
1018 With_Clause : Project_Node_Id :=
1019 First_With_Clause_Of (Project, In_Tree);
1020 Result : Project_Node_Id := Empty_Node;
1023 -- First check all the imported projects
1025 while With_Clause /= Empty_Node loop
1027 -- Only non limited imported project may be used as prefix
1028 -- of variable or attributes.
1030 Result := Non_Limited_Project_Node_Of (With_Clause, In_Tree);
1031 exit when Result /= Empty_Node
1032 and then Name_Of (Result, In_Tree) = With_Name;
1033 With_Clause := Next_With_Clause_Of (With_Clause, In_Tree);
1036 -- If it is not an imported project, it might be the imported project
1038 if With_Clause = Empty_Node then
1041 (Project_Declaration_Of (Project, In_Tree), In_Tree);
1043 if Result /= Empty_Node
1044 and then Name_Of (Result, In_Tree) /= With_Name
1046 Result := Empty_Node;
1051 end Imported_Or_Extended_Project_Of;
1058 (Node : Project_Node_Id;
1059 In_Tree : Project_Node_Tree_Ref) return Project_Node_Kind is
1061 pragma Assert (Node /= Empty_Node);
1062 return In_Tree.Project_Nodes.Table (Node).Kind;
1069 function Location_Of
1070 (Node : Project_Node_Id;
1071 In_Tree : Project_Node_Tree_Ref) return Source_Ptr is
1073 pragma Assert (Node /= Empty_Node);
1074 return In_Tree.Project_Nodes.Table (Node).Location;
1082 (Node : Project_Node_Id;
1083 In_Tree : Project_Node_Tree_Ref) return Name_Id is
1085 pragma Assert (Node /= Empty_Node);
1086 return In_Tree.Project_Nodes.Table (Node).Name;
1089 --------------------
1090 -- Next_Case_Item --
1091 --------------------
1093 function Next_Case_Item
1094 (Node : Project_Node_Id;
1095 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1101 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1102 return In_Tree.Project_Nodes.Table (Node).Field3;
1109 function Next_Comment
1110 (Node : Project_Node_Id;
1111 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id is
1116 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
1117 return In_Tree.Project_Nodes.Table (Node).Comments;
1120 ---------------------------
1121 -- Next_Declarative_Item --
1122 ---------------------------
1124 function Next_Declarative_Item
1125 (Node : Project_Node_Id;
1126 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1132 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
1133 return In_Tree.Project_Nodes.Table (Node).Field2;
1134 end Next_Declarative_Item;
1136 -----------------------------
1137 -- Next_Expression_In_List --
1138 -----------------------------
1140 function Next_Expression_In_List
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_Expression);
1149 return In_Tree.Project_Nodes.Table (Node).Field2;
1150 end Next_Expression_In_List;
1152 -------------------------
1153 -- Next_Literal_String --
1154 -------------------------
1156 function Next_Literal_String
1157 (Node : Project_Node_Id;
1158 In_Tree : Project_Node_Tree_Ref)
1159 return Project_Node_Id
1165 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
1166 return In_Tree.Project_Nodes.Table (Node).Field1;
1167 end Next_Literal_String;
1169 -----------------------------
1170 -- Next_Package_In_Project --
1171 -----------------------------
1173 function Next_Package_In_Project
1174 (Node : Project_Node_Id;
1175 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1181 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1182 return In_Tree.Project_Nodes.Table (Node).Field3;
1183 end Next_Package_In_Project;
1185 ----------------------
1186 -- Next_String_Type --
1187 ----------------------
1189 function Next_String_Type
1190 (Node : Project_Node_Id;
1191 In_Tree : Project_Node_Tree_Ref)
1192 return Project_Node_Id
1198 In_Tree.Project_Nodes.Table (Node).Kind =
1199 N_String_Type_Declaration);
1200 return In_Tree.Project_Nodes.Table (Node).Field2;
1201 end Next_String_Type;
1208 (Node : Project_Node_Id;
1209 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1215 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
1216 return In_Tree.Project_Nodes.Table (Node).Field2;
1223 function Next_Variable
1224 (Node : Project_Node_Id;
1225 In_Tree : Project_Node_Tree_Ref)
1226 return Project_Node_Id
1232 (In_Tree.Project_Nodes.Table (Node).Kind =
1233 N_Typed_Variable_Declaration
1235 In_Tree.Project_Nodes.Table (Node).Kind =
1236 N_Variable_Declaration));
1238 return In_Tree.Project_Nodes.Table (Node).Field3;
1241 -------------------------
1242 -- Next_With_Clause_Of --
1243 -------------------------
1245 function Next_With_Clause_Of
1246 (Node : Project_Node_Id;
1247 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1253 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
1254 return In_Tree.Project_Nodes.Table (Node).Field2;
1255 end Next_With_Clause_Of;
1257 ---------------------------------
1258 -- Non_Limited_Project_Node_Of --
1259 ---------------------------------
1261 function Non_Limited_Project_Node_Of
1262 (Node : Project_Node_Id;
1263 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1269 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1270 return In_Tree.Project_Nodes.Table (Node).Field3;
1271 end Non_Limited_Project_Node_Of;
1277 function Package_Id_Of
1278 (Node : Project_Node_Id;
1279 In_Tree : Project_Node_Tree_Ref) return Package_Node_Id
1285 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1286 return In_Tree.Project_Nodes.Table (Node).Pkg_Id;
1289 ---------------------
1290 -- Package_Node_Of --
1291 ---------------------
1293 function Package_Node_Of
1294 (Node : Project_Node_Id;
1295 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1301 (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1303 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1304 return In_Tree.Project_Nodes.Table (Node).Field2;
1305 end Package_Node_Of;
1311 function Path_Name_Of
1312 (Node : Project_Node_Id;
1313 In_Tree : Project_Node_Tree_Ref) return Name_Id
1319 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
1321 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
1322 return In_Tree.Project_Nodes.Table (Node).Path_Name;
1325 ----------------------------
1326 -- Project_Declaration_Of --
1327 ----------------------------
1329 function Project_Declaration_Of
1330 (Node : Project_Node_Id;
1331 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1337 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1338 return In_Tree.Project_Nodes.Table (Node).Field2;
1339 end Project_Declaration_Of;
1341 -------------------------------------------
1342 -- Project_File_Includes_Unkept_Comments --
1343 -------------------------------------------
1345 function Project_File_Includes_Unkept_Comments
1346 (Node : Project_Node_Id;
1347 In_Tree : Project_Node_Tree_Ref) return Boolean
1349 Declaration : constant Project_Node_Id :=
1350 Project_Declaration_Of (Node, In_Tree);
1352 return In_Tree.Project_Nodes.Table (Declaration).Flag1;
1353 end Project_File_Includes_Unkept_Comments;
1355 ---------------------
1356 -- Project_Node_Of --
1357 ---------------------
1359 function Project_Node_Of
1360 (Node : Project_Node_Id;
1361 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1367 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
1369 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1371 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1372 return In_Tree.Project_Nodes.Table (Node).Field1;
1373 end Project_Node_Of;
1375 -----------------------------------
1376 -- Project_Of_Renamed_Package_Of --
1377 -----------------------------------
1379 function Project_Of_Renamed_Package_Of
1380 (Node : Project_Node_Id;
1381 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
1387 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
1388 return In_Tree.Project_Nodes.Table (Node).Field1;
1389 end Project_Of_Renamed_Package_Of;
1391 --------------------------
1392 -- Remove_Next_End_Node --
1393 --------------------------
1395 procedure Remove_Next_End_Node is
1397 Next_End_Nodes.Decrement_Last;
1398 end Remove_Next_End_Node;
1404 procedure Reset_State is
1406 End_Of_Line_Node := Empty_Node;
1407 Previous_Line_Node := Empty_Node;
1408 Previous_End_Node := Empty_Node;
1409 Unkept_Comments := False;
1410 Comments.Set_Last (0);
1417 procedure Restore (S : in Comment_State) is
1419 End_Of_Line_Node := S.End_Of_Line_Node;
1420 Previous_Line_Node := S.Previous_Line_Node;
1421 Previous_End_Node := S.Previous_End_Node;
1422 Next_End_Nodes.Set_Last (0);
1423 Unkept_Comments := S.Unkept_Comments;
1425 Comments.Set_Last (0);
1427 for J in S.Comments'Range loop
1428 Comments.Increment_Last;
1429 Comments.Table (Comments.Last) := S.Comments (J);
1437 procedure Save (S : out Comment_State) is
1438 Cmts : constant Comments_Ptr := new Comment_Array (1 .. Comments.Last);
1441 for J in 1 .. Comments.Last loop
1442 Cmts (J) := Comments.Table (J);
1446 (End_Of_Line_Node => End_Of_Line_Node,
1447 Previous_Line_Node => Previous_Line_Node,
1448 Previous_End_Node => Previous_End_Node,
1449 Unkept_Comments => Unkept_Comments,
1457 procedure Scan (In_Tree : Project_Node_Tree_Ref) is
1458 Empty_Line : Boolean := False;
1461 -- If there are comments, then they will not be kept. Set the flag and
1462 -- clear the comments.
1464 if Comments.Last > 0 then
1465 Unkept_Comments := True;
1466 Comments.Set_Last (0);
1469 -- Loop until a token other that End_Of_Line or Comment is found
1472 Prj.Err.Scanner.Scan;
1475 when Tok_End_Of_Line =>
1476 if Prev_Token = Tok_End_Of_Line then
1479 if Comments.Last > 0 then
1480 Comments.Table (Comments.Last).Is_Followed_By_Empty_Line
1486 -- If this is a line comment, add it to the comment table
1488 if Prev_Token = Tok_End_Of_Line
1489 or else Prev_Token = No_Token
1491 Comments.Increment_Last;
1492 Comments.Table (Comments.Last) :=
1493 (Value => Comment_Id,
1494 Follows_Empty_Line => Empty_Line,
1495 Is_Followed_By_Empty_Line => False);
1497 -- Otherwise, it is an end of line comment. If there is
1498 -- an end of line node specified, associate the comment with
1501 elsif End_Of_Line_Node /= Empty_Node then
1503 Zones : constant Project_Node_Id :=
1504 Comment_Zones_Of (End_Of_Line_Node, In_Tree);
1506 In_Tree.Project_Nodes.Table (Zones).Value := Comment_Id;
1509 -- Otherwise, this end of line node cannot be kept
1512 Unkept_Comments := True;
1513 Comments.Set_Last (0);
1516 Empty_Line := False;
1519 -- If there are comments, where the first comment is not
1520 -- following an empty line, put the initial uninterrupted
1521 -- comment zone with the node of the preceding line (either
1522 -- a Previous_Line or a Previous_End node), if any.
1524 if Comments.Last > 0 and then
1525 not Comments.Table (1).Follows_Empty_Line then
1526 if Previous_Line_Node /= Empty_Node then
1528 (To => Previous_Line_Node,
1530 In_Tree => In_Tree);
1532 elsif Previous_End_Node /= Empty_Node then
1534 (To => Previous_End_Node,
1536 In_Tree => In_Tree);
1540 -- If there are still comments and the token is "end", then
1541 -- put these comments with the Next_End node, if any;
1542 -- otherwise, these comments cannot be kept. Always clear
1545 if Comments.Last > 0 and then Token = Tok_End then
1546 if Next_End_Nodes.Last > 0 then
1548 (To => Next_End_Nodes.Table (Next_End_Nodes.Last),
1549 Where => Before_End,
1550 In_Tree => In_Tree);
1553 Unkept_Comments := True;
1556 Comments.Set_Last (0);
1559 -- Reset the End_Of_Line, Previous_Line and Previous_End nodes
1560 -- so that they are not used again.
1562 End_Of_Line_Node := Empty_Node;
1563 Previous_Line_Node := Empty_Node;
1564 Previous_End_Node := Empty_Node;
1573 ------------------------------------
1574 -- Set_Associative_Array_Index_Of --
1575 ------------------------------------
1577 procedure Set_Associative_Array_Index_Of
1578 (Node : Project_Node_Id;
1579 In_Tree : Project_Node_Tree_Ref;
1586 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1588 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1589 In_Tree.Project_Nodes.Table (Node).Value := To;
1590 end Set_Associative_Array_Index_Of;
1592 --------------------------------
1593 -- Set_Associative_Package_Of --
1594 --------------------------------
1596 procedure Set_Associative_Package_Of
1597 (Node : Project_Node_Id;
1598 In_Tree : Project_Node_Tree_Ref;
1599 To : Project_Node_Id)
1605 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration);
1606 In_Tree.Project_Nodes.Table (Node).Field3 := To;
1607 end Set_Associative_Package_Of;
1609 --------------------------------
1610 -- Set_Associative_Project_Of --
1611 --------------------------------
1613 procedure Set_Associative_Project_Of
1614 (Node : Project_Node_Id;
1615 In_Tree : Project_Node_Tree_Ref;
1616 To : Project_Node_Id)
1622 (In_Tree.Project_Nodes.Table (Node).Kind =
1623 N_Attribute_Declaration));
1624 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1625 end Set_Associative_Project_Of;
1627 --------------------------
1628 -- Set_Case_Insensitive --
1629 --------------------------
1631 procedure Set_Case_Insensitive
1632 (Node : Project_Node_Id;
1633 In_Tree : Project_Node_Tree_Ref;
1640 (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1642 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
1643 In_Tree.Project_Nodes.Table (Node).Flag1 := To;
1644 end Set_Case_Insensitive;
1646 ------------------------------------
1647 -- Set_Case_Variable_Reference_Of --
1648 ------------------------------------
1650 procedure Set_Case_Variable_Reference_Of
1651 (Node : Project_Node_Id;
1652 In_Tree : Project_Node_Tree_Ref;
1653 To : Project_Node_Id)
1659 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
1660 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1661 end Set_Case_Variable_Reference_Of;
1663 ---------------------------
1664 -- Set_Current_Item_Node --
1665 ---------------------------
1667 procedure Set_Current_Item_Node
1668 (Node : Project_Node_Id;
1669 In_Tree : Project_Node_Tree_Ref;
1670 To : Project_Node_Id)
1676 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
1677 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1678 end Set_Current_Item_Node;
1680 ----------------------
1681 -- Set_Current_Term --
1682 ----------------------
1684 procedure Set_Current_Term
1685 (Node : Project_Node_Id;
1686 In_Tree : Project_Node_Tree_Ref;
1687 To : Project_Node_Id)
1693 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
1694 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1695 end Set_Current_Term;
1697 ----------------------
1698 -- Set_Directory_Of --
1699 ----------------------
1701 procedure Set_Directory_Of
1702 (Node : Project_Node_Id;
1703 In_Tree : Project_Node_Tree_Ref;
1710 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
1711 In_Tree.Project_Nodes.Table (Node).Directory := To;
1712 end Set_Directory_Of;
1714 ---------------------
1715 -- Set_End_Of_Line --
1716 ---------------------
1718 procedure Set_End_Of_Line (To : Project_Node_Id) is
1720 End_Of_Line_Node := To;
1721 end Set_End_Of_Line;
1723 ----------------------------
1724 -- Set_Expression_Kind_Of --
1725 ----------------------------
1727 procedure Set_Expression_Kind_Of
1728 (Node : Project_Node_Id;
1729 In_Tree : Project_Node_Tree_Ref;
1736 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
1738 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
1740 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
1742 In_Tree.Project_Nodes.Table (Node).Kind =
1743 N_Typed_Variable_Declaration
1745 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
1747 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
1749 In_Tree.Project_Nodes.Table (Node).Kind = N_Term
1751 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
1753 In_Tree.Project_Nodes.Table (Node).Kind =
1754 N_Attribute_Reference));
1755 In_Tree.Project_Nodes.Table (Node).Expr_Kind := To;
1756 end Set_Expression_Kind_Of;
1758 -----------------------
1759 -- Set_Expression_Of --
1760 -----------------------
1762 procedure Set_Expression_Of
1763 (Node : Project_Node_Id;
1764 In_Tree : Project_Node_Tree_Ref;
1765 To : Project_Node_Id)
1771 (In_Tree.Project_Nodes.Table (Node).Kind =
1772 N_Attribute_Declaration
1774 In_Tree.Project_Nodes.Table (Node).Kind =
1775 N_Typed_Variable_Declaration
1777 In_Tree.Project_Nodes.Table (Node).Kind =
1778 N_Variable_Declaration));
1779 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1780 end Set_Expression_Of;
1782 -------------------------------
1783 -- Set_External_Reference_Of --
1784 -------------------------------
1786 procedure Set_External_Reference_Of
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_External_Value);
1796 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1797 end Set_External_Reference_Of;
1799 -----------------------------
1800 -- Set_External_Default_Of --
1801 -----------------------------
1803 procedure Set_External_Default_Of
1804 (Node : Project_Node_Id;
1805 In_Tree : Project_Node_Tree_Ref;
1806 To : Project_Node_Id)
1812 In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
1813 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1814 end Set_External_Default_Of;
1816 ----------------------------
1817 -- Set_First_Case_Item_Of --
1818 ----------------------------
1820 procedure Set_First_Case_Item_Of
1821 (Node : Project_Node_Id;
1822 In_Tree : Project_Node_Tree_Ref;
1823 To : Project_Node_Id)
1829 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
1830 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1831 end Set_First_Case_Item_Of;
1833 -------------------------
1834 -- Set_First_Choice_Of --
1835 -------------------------
1837 procedure Set_First_Choice_Of
1838 (Node : Project_Node_Id;
1839 In_Tree : Project_Node_Tree_Ref;
1840 To : Project_Node_Id)
1846 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1847 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1848 end Set_First_Choice_Of;
1850 -----------------------------
1851 -- Set_First_Comment_After --
1852 -----------------------------
1854 procedure Set_First_Comment_After
1855 (Node : Project_Node_Id;
1856 In_Tree : Project_Node_Tree_Ref;
1857 To : Project_Node_Id)
1859 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1861 In_Tree.Project_Nodes.Table (Zone).Field2 := To;
1862 end Set_First_Comment_After;
1864 ---------------------------------
1865 -- Set_First_Comment_After_End --
1866 ---------------------------------
1868 procedure Set_First_Comment_After_End
1869 (Node : Project_Node_Id;
1870 In_Tree : Project_Node_Tree_Ref;
1871 To : Project_Node_Id)
1873 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1875 In_Tree.Project_Nodes.Table (Zone).Comments := To;
1876 end Set_First_Comment_After_End;
1878 ------------------------------
1879 -- Set_First_Comment_Before --
1880 ------------------------------
1882 procedure Set_First_Comment_Before
1883 (Node : Project_Node_Id;
1884 In_Tree : Project_Node_Tree_Ref;
1885 To : Project_Node_Id)
1888 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1890 In_Tree.Project_Nodes.Table (Zone).Field1 := To;
1891 end Set_First_Comment_Before;
1893 ----------------------------------
1894 -- Set_First_Comment_Before_End --
1895 ----------------------------------
1897 procedure Set_First_Comment_Before_End
1898 (Node : Project_Node_Id;
1899 In_Tree : Project_Node_Tree_Ref;
1900 To : Project_Node_Id)
1902 Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
1904 In_Tree.Project_Nodes.Table (Zone).Field2 := To;
1905 end Set_First_Comment_Before_End;
1907 ------------------------
1908 -- Set_Next_Case_Item --
1909 ------------------------
1911 procedure Set_Next_Case_Item
1912 (Node : Project_Node_Id;
1913 In_Tree : Project_Node_Tree_Ref;
1914 To : Project_Node_Id)
1920 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
1921 In_Tree.Project_Nodes.Table (Node).Field3 := To;
1922 end Set_Next_Case_Item;
1924 ----------------------
1925 -- Set_Next_Comment --
1926 ----------------------
1928 procedure Set_Next_Comment
1929 (Node : Project_Node_Id;
1930 In_Tree : Project_Node_Tree_Ref;
1931 To : Project_Node_Id)
1937 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
1938 In_Tree.Project_Nodes.Table (Node).Comments := To;
1939 end Set_Next_Comment;
1941 -----------------------------------
1942 -- Set_First_Declarative_Item_Of --
1943 -----------------------------------
1945 procedure Set_First_Declarative_Item_Of
1946 (Node : Project_Node_Id;
1947 In_Tree : Project_Node_Tree_Ref;
1948 To : Project_Node_Id)
1954 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
1956 In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
1958 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
1960 if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
1961 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1963 In_Tree.Project_Nodes.Table (Node).Field2 := To;
1965 end Set_First_Declarative_Item_Of;
1967 ----------------------------------
1968 -- Set_First_Expression_In_List --
1969 ----------------------------------
1971 procedure Set_First_Expression_In_List
1972 (Node : Project_Node_Id;
1973 In_Tree : Project_Node_Tree_Ref;
1974 To : Project_Node_Id)
1980 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
1981 In_Tree.Project_Nodes.Table (Node).Field1 := To;
1982 end Set_First_Expression_In_List;
1984 ------------------------------
1985 -- Set_First_Literal_String --
1986 ------------------------------
1988 procedure Set_First_Literal_String
1989 (Node : Project_Node_Id;
1990 In_Tree : Project_Node_Tree_Ref;
1991 To : Project_Node_Id)
1997 In_Tree.Project_Nodes.Table (Node).Kind =
1998 N_String_Type_Declaration);
1999 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2000 end Set_First_Literal_String;
2002 --------------------------
2003 -- Set_First_Package_Of --
2004 --------------------------
2006 procedure Set_First_Package_Of
2007 (Node : Project_Node_Id;
2008 In_Tree : Project_Node_Tree_Ref;
2009 To : Package_Declaration_Id)
2015 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2016 In_Tree.Project_Nodes.Table (Node).Packages := To;
2017 end Set_First_Package_Of;
2019 ------------------------------
2020 -- Set_First_String_Type_Of --
2021 ------------------------------
2023 procedure Set_First_String_Type_Of
2024 (Node : Project_Node_Id;
2025 In_Tree : Project_Node_Tree_Ref;
2026 To : Project_Node_Id)
2032 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2033 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2034 end Set_First_String_Type_Of;
2036 --------------------
2037 -- Set_First_Term --
2038 --------------------
2040 procedure Set_First_Term
2041 (Node : Project_Node_Id;
2042 In_Tree : Project_Node_Tree_Ref;
2043 To : Project_Node_Id)
2049 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
2050 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2053 ---------------------------
2054 -- Set_First_Variable_Of --
2055 ---------------------------
2057 procedure Set_First_Variable_Of
2058 (Node : Project_Node_Id;
2059 In_Tree : Project_Node_Tree_Ref;
2060 To : Variable_Node_Id)
2066 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2068 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
2069 In_Tree.Project_Nodes.Table (Node).Variables := To;
2070 end Set_First_Variable_Of;
2072 ------------------------------
2073 -- Set_First_With_Clause_Of --
2074 ------------------------------
2076 procedure Set_First_With_Clause_Of
2077 (Node : Project_Node_Id;
2078 In_Tree : Project_Node_Tree_Ref;
2079 To : Project_Node_Id)
2085 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2086 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2087 end Set_First_With_Clause_Of;
2089 --------------------------
2090 -- Set_Is_Extending_All --
2091 --------------------------
2093 procedure Set_Is_Extending_All
2094 (Node : Project_Node_Id;
2095 In_Tree : Project_Node_Tree_Ref)
2101 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2103 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
2104 In_Tree.Project_Nodes.Table (Node).Flag2 := True;
2105 end Set_Is_Extending_All;
2111 procedure Set_Kind_Of
2112 (Node : Project_Node_Id;
2113 In_Tree : Project_Node_Tree_Ref;
2114 To : Project_Node_Kind)
2117 pragma Assert (Node /= Empty_Node);
2118 In_Tree.Project_Nodes.Table (Node).Kind := To;
2121 ---------------------
2122 -- Set_Location_Of --
2123 ---------------------
2125 procedure Set_Location_Of
2126 (Node : Project_Node_Id;
2127 In_Tree : Project_Node_Tree_Ref;
2131 pragma Assert (Node /= Empty_Node);
2132 In_Tree.Project_Nodes.Table (Node).Location := To;
2133 end Set_Location_Of;
2135 -----------------------------
2136 -- Set_Extended_Project_Of --
2137 -----------------------------
2139 procedure Set_Extended_Project_Of
2140 (Node : Project_Node_Id;
2141 In_Tree : Project_Node_Tree_Ref;
2142 To : Project_Node_Id)
2148 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
2149 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2150 end Set_Extended_Project_Of;
2152 ----------------------------------
2153 -- Set_Extended_Project_Path_Of --
2154 ----------------------------------
2156 procedure Set_Extended_Project_Path_Of
2157 (Node : Project_Node_Id;
2158 In_Tree : Project_Node_Tree_Ref;
2165 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2166 In_Tree.Project_Nodes.Table (Node).Value := To;
2167 end Set_Extended_Project_Path_Of;
2169 ------------------------------
2170 -- Set_Extending_Project_Of --
2171 ------------------------------
2173 procedure Set_Extending_Project_Of
2174 (Node : Project_Node_Id;
2175 In_Tree : Project_Node_Tree_Ref;
2176 To : Project_Node_Id)
2182 In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
2183 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2184 end Set_Extending_Project_Of;
2190 procedure Set_Name_Of
2191 (Node : Project_Node_Id;
2192 In_Tree : Project_Node_Tree_Ref;
2196 pragma Assert (Node /= Empty_Node);
2197 In_Tree.Project_Nodes.Table (Node).Name := To;
2200 -------------------------------
2201 -- Set_Next_Declarative_Item --
2202 -------------------------------
2204 procedure Set_Next_Declarative_Item
2205 (Node : Project_Node_Id;
2206 In_Tree : Project_Node_Tree_Ref;
2207 To : Project_Node_Id)
2213 In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
2214 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2215 end Set_Next_Declarative_Item;
2217 -----------------------
2218 -- Set_Next_End_Node --
2219 -----------------------
2221 procedure Set_Next_End_Node (To : Project_Node_Id) is
2223 Next_End_Nodes.Increment_Last;
2224 Next_End_Nodes.Table (Next_End_Nodes.Last) := To;
2225 end Set_Next_End_Node;
2227 ---------------------------------
2228 -- Set_Next_Expression_In_List --
2229 ---------------------------------
2231 procedure Set_Next_Expression_In_List
2232 (Node : Project_Node_Id;
2233 In_Tree : Project_Node_Tree_Ref;
2234 To : Project_Node_Id)
2240 In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
2241 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2242 end Set_Next_Expression_In_List;
2244 -----------------------------
2245 -- Set_Next_Literal_String --
2246 -----------------------------
2248 procedure Set_Next_Literal_String
2249 (Node : Project_Node_Id;
2250 In_Tree : Project_Node_Tree_Ref;
2251 To : Project_Node_Id)
2257 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
2258 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2259 end Set_Next_Literal_String;
2261 ---------------------------------
2262 -- Set_Next_Package_In_Project --
2263 ---------------------------------
2265 procedure Set_Next_Package_In_Project
2266 (Node : Project_Node_Id;
2267 In_Tree : Project_Node_Tree_Ref;
2268 To : Project_Node_Id)
2274 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2275 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2276 end Set_Next_Package_In_Project;
2278 --------------------------
2279 -- Set_Next_String_Type --
2280 --------------------------
2282 procedure Set_Next_String_Type
2283 (Node : Project_Node_Id;
2284 In_Tree : Project_Node_Tree_Ref;
2285 To : Project_Node_Id)
2291 In_Tree.Project_Nodes.Table (Node).Kind =
2292 N_String_Type_Declaration);
2293 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2294 end Set_Next_String_Type;
2300 procedure Set_Next_Term
2301 (Node : Project_Node_Id;
2302 In_Tree : Project_Node_Tree_Ref;
2303 To : Project_Node_Id)
2309 In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
2310 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2313 -----------------------
2314 -- Set_Next_Variable --
2315 -----------------------
2317 procedure Set_Next_Variable
2318 (Node : Project_Node_Id;
2319 In_Tree : Project_Node_Tree_Ref;
2320 To : Project_Node_Id)
2326 (In_Tree.Project_Nodes.Table (Node).Kind =
2327 N_Typed_Variable_Declaration
2329 In_Tree.Project_Nodes.Table (Node).Kind =
2330 N_Variable_Declaration));
2331 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2332 end Set_Next_Variable;
2334 -----------------------------
2335 -- Set_Next_With_Clause_Of --
2336 -----------------------------
2338 procedure Set_Next_With_Clause_Of
2339 (Node : Project_Node_Id;
2340 In_Tree : Project_Node_Tree_Ref;
2341 To : Project_Node_Id)
2347 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
2348 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2349 end Set_Next_With_Clause_Of;
2351 -----------------------
2352 -- Set_Package_Id_Of --
2353 -----------------------
2355 procedure Set_Package_Id_Of
2356 (Node : Project_Node_Id;
2357 In_Tree : Project_Node_Tree_Ref;
2358 To : Package_Node_Id)
2364 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2365 In_Tree.Project_Nodes.Table (Node).Pkg_Id := To;
2366 end Set_Package_Id_Of;
2368 -------------------------
2369 -- Set_Package_Node_Of --
2370 -------------------------
2372 procedure Set_Package_Node_Of
2373 (Node : Project_Node_Id;
2374 In_Tree : Project_Node_Tree_Ref;
2375 To : Project_Node_Id)
2381 (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
2383 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
2384 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2385 end Set_Package_Node_Of;
2387 ----------------------
2388 -- Set_Path_Name_Of --
2389 ----------------------
2391 procedure Set_Path_Name_Of
2392 (Node : Project_Node_Id;
2393 In_Tree : Project_Node_Tree_Ref;
2400 (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
2402 In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
2403 In_Tree.Project_Nodes.Table (Node).Path_Name := To;
2404 end Set_Path_Name_Of;
2406 ---------------------------
2407 -- Set_Previous_End_Node --
2408 ---------------------------
2409 procedure Set_Previous_End_Node (To : Project_Node_Id) is
2411 Previous_End_Node := To;
2412 end Set_Previous_End_Node;
2414 ----------------------------
2415 -- Set_Previous_Line_Node --
2416 ----------------------------
2418 procedure Set_Previous_Line_Node (To : Project_Node_Id) is
2420 Previous_Line_Node := To;
2421 end Set_Previous_Line_Node;
2423 --------------------------------
2424 -- Set_Project_Declaration_Of --
2425 --------------------------------
2427 procedure Set_Project_Declaration_Of
2428 (Node : Project_Node_Id;
2429 In_Tree : Project_Node_Tree_Ref;
2430 To : Project_Node_Id)
2436 In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
2437 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2438 end Set_Project_Declaration_Of;
2440 -----------------------------------------------
2441 -- Set_Project_File_Includes_Unkept_Comments --
2442 -----------------------------------------------
2444 procedure Set_Project_File_Includes_Unkept_Comments
2445 (Node : Project_Node_Id;
2446 In_Tree : Project_Node_Tree_Ref;
2449 Declaration : constant Project_Node_Id :=
2450 Project_Declaration_Of (Node, In_Tree);
2452 In_Tree.Project_Nodes.Table (Declaration).Flag1 := To;
2453 end Set_Project_File_Includes_Unkept_Comments;
2455 -------------------------
2456 -- Set_Project_Node_Of --
2457 -------------------------
2459 procedure Set_Project_Node_Of
2460 (Node : Project_Node_Id;
2461 In_Tree : Project_Node_Tree_Ref;
2462 To : Project_Node_Id;
2463 Limited_With : Boolean := False)
2469 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2471 In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
2473 In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
2474 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2476 if In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2477 and then not Limited_With
2479 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2481 end Set_Project_Node_Of;
2483 ---------------------------------------
2484 -- Set_Project_Of_Renamed_Package_Of --
2485 ---------------------------------------
2487 procedure Set_Project_Of_Renamed_Package_Of
2488 (Node : Project_Node_Id;
2489 In_Tree : Project_Node_Tree_Ref;
2490 To : Project_Node_Id)
2496 In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
2497 In_Tree.Project_Nodes.Table (Node).Field1 := To;
2498 end Set_Project_Of_Renamed_Package_Of;
2500 -------------------------
2501 -- Set_Source_Index_Of --
2502 -------------------------
2504 procedure Set_Source_Index_Of
2505 (Node : Project_Node_Id;
2506 In_Tree : Project_Node_Tree_Ref;
2513 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
2515 In_Tree.Project_Nodes.Table (Node).Kind =
2516 N_Attribute_Declaration));
2517 In_Tree.Project_Nodes.Table (Node).Src_Index := To;
2518 end Set_Source_Index_Of;
2520 ------------------------
2521 -- Set_String_Type_Of --
2522 ------------------------
2524 procedure Set_String_Type_Of
2525 (Node : Project_Node_Id;
2526 In_Tree : Project_Node_Tree_Ref;
2527 To : Project_Node_Id)
2533 (In_Tree.Project_Nodes.Table (Node).Kind =
2534 N_Variable_Reference
2536 In_Tree.Project_Nodes.Table (Node).Kind =
2537 N_Typed_Variable_Declaration)
2539 In_Tree.Project_Nodes.Table (To).Kind = N_String_Type_Declaration);
2541 if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
2542 In_Tree.Project_Nodes.Table (Node).Field3 := To;
2544 In_Tree.Project_Nodes.Table (Node).Field2 := To;
2546 end Set_String_Type_Of;
2548 -------------------------
2549 -- Set_String_Value_Of --
2550 -------------------------
2552 procedure Set_String_Value_Of
2553 (Node : Project_Node_Id;
2554 In_Tree : Project_Node_Tree_Ref;
2561 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2563 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
2565 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
2566 In_Tree.Project_Nodes.Table (Node).Value := To;
2567 end Set_String_Value_Of;
2569 ---------------------
2570 -- Source_Index_Of --
2571 ---------------------
2573 function Source_Index_Of
2574 (Node : Project_Node_Id;
2575 In_Tree : Project_Node_Tree_Ref) return Int
2581 (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
2583 In_Tree.Project_Nodes.Table (Node).Kind =
2584 N_Attribute_Declaration));
2585 return In_Tree.Project_Nodes.Table (Node).Src_Index;
2586 end Source_Index_Of;
2588 --------------------
2589 -- String_Type_Of --
2590 --------------------
2592 function String_Type_Of
2593 (Node : Project_Node_Id;
2594 In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
2600 (In_Tree.Project_Nodes.Table (Node).Kind =
2601 N_Variable_Reference
2603 In_Tree.Project_Nodes.Table (Node).Kind =
2604 N_Typed_Variable_Declaration));
2606 if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
2607 return In_Tree.Project_Nodes.Table (Node).Field3;
2609 return In_Tree.Project_Nodes.Table (Node).Field2;
2613 ---------------------
2614 -- String_Value_Of --
2615 ---------------------
2617 function String_Value_Of
2618 (Node : Project_Node_Id;
2619 In_Tree : Project_Node_Tree_Ref) return Name_Id
2625 (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
2627 In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
2629 In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
2630 return In_Tree.Project_Nodes.Table (Node).Value;
2631 end String_Value_Of;
2633 --------------------
2634 -- Value_Is_Valid --
2635 --------------------
2637 function Value_Is_Valid
2638 (For_Typed_Variable : Project_Node_Id;
2639 In_Tree : Project_Node_Tree_Ref;
2640 Value : Name_Id) return Boolean
2644 (For_Typed_Variable /= Empty_Node
2646 (In_Tree.Project_Nodes.Table (For_Typed_Variable).Kind =
2647 N_Typed_Variable_Declaration));
2650 Current_String : Project_Node_Id :=
2651 First_Literal_String
2652 (String_Type_Of (For_Typed_Variable, In_Tree),
2656 while Current_String /= Empty_Node
2658 String_Value_Of (Current_String, In_Tree) /= Value
2661 Next_Literal_String (Current_String, In_Tree);
2664 return Current_String /= Empty_Node;
2669 -------------------------------
2670 -- There_Are_Unkept_Comments --
2671 -------------------------------
2673 function There_Are_Unkept_Comments return Boolean is
2675 return Unkept_Comments;
2676 end There_Are_Unkept_Comments;