OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / ada / prj-tree.ads
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              P R J . T R E E                             --
6 --                                                                          --
7 --                                 S p e c                                  --
8 --                                                                          --
9 --          Copyright (C) 2001-2011, Free Software Foundation, Inc.         --
10 --                                                                          --
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.          --
20 --                                                                          --
21 -- GNAT was originally developed  by the GNAT team at  New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
23 --                                                                          --
24 ------------------------------------------------------------------------------
25
26 --  This package defines the structure of the Project File tree
27
28 with GNAT.Dynamic_HTables;
29 with GNAT.Dynamic_Tables;
30
31 with Table;
32
33 with Prj.Attr; use Prj.Attr;
34 with Prj.Env;
35 with Prj.Ext;
36
37 package Prj.Tree is
38
39    -----------------
40    -- Environment --
41    -----------------
42
43    --  The following record contains the context in which projects are parsed
44    --  and processed (finding importing project, resolving external values,..).
45
46    type Environment is record
47       External : Prj.Ext.External_References;
48       --  External references are stored in this hash table (and manipulated
49       --  through subprograms in prj-ext.ads). External references are
50       --  project-tree specific so that one can load the same tree twice but
51       --  have two views of it, for instance.
52
53       Project_Path : aliased Prj.Env.Project_Search_Path;
54       --  The project path is tree specific, since we might want to load
55       --  simultaneously multiple projects, each with its own search path, in
56       --  particular when using different compilers with different default
57       --  search directories.
58
59       Flags : Prj.Processing_Flags;
60       --  Configure errors and warnings
61    end record;
62
63    procedure Initialize
64      (Self      : out Environment;
65       Flags     : Processing_Flags);
66    --  Initialize a new environment
67
68    procedure Initialize_And_Copy
69      (Self      : out Environment;
70       Copy_From : Environment);
71    --  Initialize a new environment, copying its values from Copy_From
72
73    procedure Free (Self : in out Environment);
74    --  Free the memory used by Self
75
76    procedure Override_Flags
77      (Self : in out Environment; Flags : Prj.Processing_Flags);
78    --  Override the subprogram called in case there are parsing errors. This
79    --  is needed in applications that do their own error handling, since the
80    --  error handler is likely to be a local subprogram in this case (which
81    --  can't be stored when the flags are created).
82
83    -------------------
84    -- Project nodes --
85    -------------------
86
87    type Project_Node_Tree_Data;
88    type Project_Node_Tree_Ref is access all Project_Node_Tree_Data;
89    --  Type to designate a project node tree, so that several project node
90    --  trees can coexist in memory.
91
92    Project_Nodes_Initial   : constant := 1_000;
93    Project_Nodes_Increment : constant := 100;
94    --  Allocation parameters for initializing and extending number
95    --  of nodes in table Tree_Private_Part.Project_Nodes
96
97    Project_Node_Low_Bound  : constant := 0;
98    Project_Node_High_Bound : constant := 099_999_999;
99    --  Range of values for project node id's (in practice infinite)
100
101    type Project_Node_Id is range
102      Project_Node_Low_Bound .. Project_Node_High_Bound;
103    --  The index of table Tree_Private_Part.Project_Nodes
104
105    Empty_Node : constant Project_Node_Id := Project_Node_Low_Bound;
106    --  Designates no node in table Project_Nodes
107
108    First_Node_Id : constant Project_Node_Id := Project_Node_Low_Bound + 1;
109
110    subtype Variable_Node_Id is Project_Node_Id;
111    --  Used to designate a node whose expected kind is one of
112    --  N_Typed_Variable_Declaration, N_Variable_Declaration or
113    --  N_Variable_Reference.
114
115    subtype Package_Declaration_Id is Project_Node_Id;
116    --  Used to designate a node whose expected kind is N_Project_Declaration
117
118    type Project_Node_Kind is
119      (N_Project,
120       N_With_Clause,
121       N_Project_Declaration,
122       N_Declarative_Item,
123       N_Package_Declaration,
124       N_String_Type_Declaration,
125       N_Literal_String,
126       N_Attribute_Declaration,
127       N_Typed_Variable_Declaration,
128       N_Variable_Declaration,
129       N_Expression,
130       N_Term,
131       N_Literal_String_List,
132       N_Variable_Reference,
133       N_External_Value,
134       N_Attribute_Reference,
135       N_Case_Construction,
136       N_Case_Item,
137       N_Comment_Zones,
138       N_Comment);
139    --  Each node in the tree is of a Project_Node_Kind. For the signification
140    --  of the fields in each node of Project_Node_Kind, look at package
141    --  Tree_Private_Part.
142
143    function Present (Node : Project_Node_Id) return Boolean;
144    pragma Inline (Present);
145    --  Return True if Node /= Empty_Node
146
147    function No (Node : Project_Node_Id) return Boolean;
148    pragma Inline (No);
149    --  Return True if Node = Empty_Node
150
151    procedure Initialize (Tree : Project_Node_Tree_Ref);
152    --  Initialize the Project File tree: empty the Project_Nodes table
153    --  and reset the Projects_Htable.
154
155    function Default_Project_Node
156      (In_Tree       : Project_Node_Tree_Ref;
157       Of_Kind       : Project_Node_Kind;
158       And_Expr_Kind : Variable_Kind := Undefined) return Project_Node_Id;
159    --  Returns a Project_Node_Record with the specified Kind and Expr_Kind. All
160    --  the other components have default nil values.
161    --  To create a node for a project itself, see Create_Project below instead
162
163    function Hash (N : Project_Node_Id) return Header_Num;
164    --  Used for hash tables where the key is a Project_Node_Id
165
166    function Imported_Or_Extended_Project_Of
167      (Project   : Project_Node_Id;
168       In_Tree   : Project_Node_Tree_Ref;
169       With_Name : Name_Id) return Project_Node_Id;
170    --  Return the node of a project imported or extended by project Project and
171    --  whose name is With_Name. Return Empty_Node if there is no such project.
172
173    --------------
174    -- Comments --
175    --------------
176
177    type Comment_State is private;
178    --  A type to store the values of several global variables related to
179    --  comments.
180
181    procedure Save (S : out Comment_State);
182    --  Save in variable S the comment state. Called before scanning a new
183    --  project file.
184
185    procedure Restore_And_Free (S : in out Comment_State);
186    --  Restore the comment state to a previously saved value. Called after
187    --  scanning a project file. Frees the memory occupied by S
188
189    procedure Reset_State;
190    --  Set the comment state to its initial value. Called before scanning a
191    --  new project file.
192
193    function There_Are_Unkept_Comments return Boolean;
194    --  Indicates that some of the comments in a project file could not be
195    --  stored in the parse tree.
196
197    procedure Set_Previous_Line_Node (To : Project_Node_Id);
198    --  Indicate the node on the previous line. If there are comments
199    --  immediately following this line, then they should be associated with
200    --  this node.
201
202    procedure Set_Previous_End_Node (To : Project_Node_Id);
203    --  Indicate that on the previous line the "end" belongs to node To.
204    --  If there are comments immediately following this "end" line, they
205    --  should be associated with this node.
206
207    procedure Set_End_Of_Line (To : Project_Node_Id);
208    --  Indicate the node on the current line. If there is an end of line
209    --  comment, then it should be associated with this node.
210
211    procedure Set_Next_End_Node (To : Project_Node_Id);
212    --  Put node To on the top of the end node stack. When an END line is found
213    --  with this node on the top of the end node stack, the comments, if any,
214    --  immediately preceding this "end" line will be associated with this node.
215
216    procedure Remove_Next_End_Node;
217    --  Remove the top of the end node stack
218
219    ------------------------
220    -- Comment Processing --
221    ------------------------
222
223    type Comment_Data is record
224       Value                     : Name_Id := No_Name;
225       Follows_Empty_Line        : Boolean := False;
226       Is_Followed_By_Empty_Line : Boolean := False;
227    end record;
228    --  Component type for Comments Table below
229
230    package Comments is new Table.Table
231      (Table_Component_Type => Comment_Data,
232       Table_Index_Type     => Natural,
233       Table_Low_Bound      => 1,
234       Table_Initial        => 10,
235       Table_Increment      => 100,
236       Table_Name           => "Prj.Tree.Comments");
237    --  A table to store the comments that may be stored is the tree
238
239    procedure Scan (In_Tree : Project_Node_Tree_Ref);
240    --  Scan the tokens and accumulate comments
241
242    type Comment_Location is
243      (Before, After, Before_End, After_End, End_Of_Line);
244    --  Used in call to Add_Comments below
245
246    procedure Add_Comments
247      (To      : Project_Node_Id;
248       In_Tree : Project_Node_Tree_Ref;
249       Where   : Comment_Location);
250    --  Add comments to this node
251
252    ----------------------
253    -- Access Functions --
254    ----------------------
255
256    --  The following query functions are part of the abstract interface
257    --  of the Project File tree. They provide access to fields of a project.
258
259    --  The access functions should be called only with valid arguments.
260    --  For each function the condition of validity is specified. If an access
261    --  function is called with invalid arguments, then exception
262    --  Assertion_Error is raised if assertions are enabled, otherwise the
263    --  behaviour is not defined and may result in a crash.
264
265    function Name_Of
266      (Node    : Project_Node_Id;
267       In_Tree : Project_Node_Tree_Ref) return Name_Id;
268    pragma Inline (Name_Of);
269    --  Valid for all non empty nodes. May return No_Name for nodes that have
270    --  no names.
271
272    function Kind_Of
273      (Node    : Project_Node_Id;
274       In_Tree : Project_Node_Tree_Ref) return Project_Node_Kind;
275    pragma Inline (Kind_Of);
276    --  Valid for all non empty nodes
277
278    function Location_Of
279      (Node    : Project_Node_Id;
280       In_Tree : Project_Node_Tree_Ref) return Source_Ptr;
281    pragma Inline (Location_Of);
282    --  Valid for all non empty nodes
283
284    function First_Comment_After
285      (Node    : Project_Node_Id;
286       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
287    --  Valid only for N_Comment_Zones nodes
288
289    function First_Comment_After_End
290      (Node    : Project_Node_Id;
291       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
292    --  Valid only for N_Comment_Zones nodes
293
294    function First_Comment_Before
295      (Node    : Project_Node_Id;
296       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
297    --  Valid only for N_Comment_Zones nodes
298
299    function First_Comment_Before_End
300      (Node    : Project_Node_Id;
301       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
302    --  Valid only for N_Comment_Zones nodes
303
304    function Next_Comment
305      (Node    : Project_Node_Id;
306       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
307    --  Valid only for N_Comment nodes
308
309    function End_Of_Line_Comment
310      (Node    : Project_Node_Id;
311       In_Tree : Project_Node_Tree_Ref) return Name_Id;
312    --  Valid only for non empty nodes
313
314    function Follows_Empty_Line
315      (Node    : Project_Node_Id;
316       In_Tree : Project_Node_Tree_Ref) return Boolean;
317    --  Valid only for N_Comment nodes
318
319    function Is_Followed_By_Empty_Line
320      (Node    : Project_Node_Id;
321       In_Tree : Project_Node_Tree_Ref) return Boolean;
322    --  Valid only for N_Comment nodes
323
324    function Parent_Project_Of
325      (Node    : Project_Node_Id;
326       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
327    pragma Inline (Parent_Project_Of);
328    --  Valid only for N_Project nodes
329
330    function Project_File_Includes_Unkept_Comments
331      (Node    : Project_Node_Id;
332       In_Tree : Project_Node_Tree_Ref) return Boolean;
333    --  Valid only for N_Project nodes
334
335    function Directory_Of
336      (Node    : Project_Node_Id;
337       In_Tree : Project_Node_Tree_Ref) return Path_Name_Type;
338    pragma Inline (Directory_Of);
339    --  Returns the directory that contains the project file. This always ends
340    --  with a directory separator. Only valid for N_Project nodes.
341
342    function Expression_Kind_Of
343      (Node    : Project_Node_Id;
344       In_Tree : Project_Node_Tree_Ref) return Variable_Kind;
345    pragma Inline (Expression_Kind_Of);
346    --  Only valid for N_Literal_String, N_Attribute_Declaration,
347    --  N_Variable_Declaration, N_Typed_Variable_Declaration, N_Expression,
348    --  N_Term, N_Variable_Reference, N_Attribute_Reference nodes or
349    --  N_External_Value.
350
351    function Is_Extending_All
352      (Node    : Project_Node_Id;
353       In_Tree : Project_Node_Tree_Ref) return Boolean;
354    pragma Inline (Is_Extending_All);
355    --  Only valid for N_Project and N_With_Clause
356
357    function Is_Not_Last_In_List
358      (Node    : Project_Node_Id;
359       In_Tree : Project_Node_Tree_Ref) return Boolean;
360    pragma Inline (Is_Not_Last_In_List);
361    --  Only valid for N_With_Clause
362
363    function First_Variable_Of
364      (Node    : Project_Node_Id;
365       In_Tree : Project_Node_Tree_Ref) return Variable_Node_Id;
366    pragma Inline (First_Variable_Of);
367    --  Only valid for N_Project or N_Package_Declaration nodes
368
369    function First_Package_Of
370      (Node    : Project_Node_Id;
371       In_Tree : Project_Node_Tree_Ref) return Package_Declaration_Id;
372    pragma Inline (First_Package_Of);
373    --  Only valid for N_Project nodes
374
375    function Package_Id_Of
376      (Node    : Project_Node_Id;
377       In_Tree : Project_Node_Tree_Ref) return Package_Node_Id;
378    pragma Inline (Package_Id_Of);
379    --  Only valid for N_Package_Declaration nodes
380
381    function Path_Name_Of
382      (Node    : Project_Node_Id;
383       In_Tree : Project_Node_Tree_Ref) return Path_Name_Type;
384    pragma Inline (Path_Name_Of);
385    --  Only valid for N_Project and N_With_Clause nodes
386
387    function String_Value_Of
388      (Node    : Project_Node_Id;
389       In_Tree : Project_Node_Tree_Ref) return Name_Id;
390    pragma Inline (String_Value_Of);
391    --  Only valid for N_With_Clause, N_Literal_String nodes or N_Comment.
392    --  For a N_With_Clause created automatically for a virtual extending
393    --  project, No_Name is returned.
394
395    function Source_Index_Of
396      (Node    : Project_Node_Id;
397       In_Tree : Project_Node_Tree_Ref) return Int;
398    pragma Inline (Source_Index_Of);
399    --  Only valid for N_Literal_String and N_Attribute_Declaration nodes
400
401    function First_With_Clause_Of
402      (Node    : Project_Node_Id;
403       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
404    pragma Inline (First_With_Clause_Of);
405    --  Only valid for N_Project nodes
406
407    function Project_Declaration_Of
408      (Node    : Project_Node_Id;
409       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
410    pragma Inline (Project_Declaration_Of);
411    --  Only valid for N_Project nodes
412
413    function Project_Qualifier_Of
414      (Node    : Project_Node_Id;
415       In_Tree : Project_Node_Tree_Ref) return Project_Qualifier;
416    pragma Inline (Project_Qualifier_Of);
417    --  Only valid for N_Project nodes
418
419    function Extending_Project_Of
420      (Node    : Project_Node_Id;
421       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
422    pragma Inline (Extending_Project_Of);
423    --  Only valid for N_Project_Declaration nodes
424
425    function First_String_Type_Of
426      (Node    : Project_Node_Id;
427       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
428    pragma Inline (First_String_Type_Of);
429    --  Only valid for N_Project nodes
430
431    function Extended_Project_Path_Of
432      (Node    : Project_Node_Id;
433       In_Tree : Project_Node_Tree_Ref) return Path_Name_Type;
434    pragma Inline (Extended_Project_Path_Of);
435    --  Only valid for N_With_Clause nodes
436
437    function Project_Node_Of
438      (Node    : Project_Node_Id;
439       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
440    pragma Inline (Project_Node_Of);
441    --  Only valid for N_With_Clause, N_Variable_Reference and
442    --  N_Attribute_Reference nodes.
443
444    function Non_Limited_Project_Node_Of
445      (Node    : Project_Node_Id;
446       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
447    pragma Inline (Non_Limited_Project_Node_Of);
448    --  Only valid for N_With_Clause nodes. Returns Empty_Node for limited
449    --  imported project files, otherwise returns the same result as
450    --  Project_Node_Of.
451
452    function Next_With_Clause_Of
453      (Node    : Project_Node_Id;
454       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
455    pragma Inline (Next_With_Clause_Of);
456    --  Only valid for N_With_Clause nodes
457
458    function First_Declarative_Item_Of
459      (Node    : Project_Node_Id;
460       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
461    pragma Inline (First_Declarative_Item_Of);
462    --  Only valid for N_Project_Declaration, N_Case_Item and
463    --  N_Package_Declaration.
464
465    function Extended_Project_Of
466      (Node    : Project_Node_Id;
467       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
468    pragma Inline (Extended_Project_Of);
469    --  Only valid for N_Project_Declaration nodes
470
471    function Current_Item_Node
472      (Node    : Project_Node_Id;
473       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
474    pragma Inline (Current_Item_Node);
475    --  Only valid for N_Declarative_Item nodes
476
477    function Next_Declarative_Item
478      (Node    : Project_Node_Id;
479       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
480    pragma Inline (Next_Declarative_Item);
481    --  Only valid for N_Declarative_Item node
482
483    function Project_Of_Renamed_Package_Of
484      (Node    : Project_Node_Id;
485       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
486    pragma Inline (Project_Of_Renamed_Package_Of);
487    --  Only valid for N_Package_Declaration nodes. May return Empty_Node.
488
489    function Next_Package_In_Project
490      (Node    : Project_Node_Id;
491       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
492    pragma Inline (Next_Package_In_Project);
493    --  Only valid for N_Package_Declaration nodes
494
495    function First_Literal_String
496      (Node    : Project_Node_Id;
497       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
498    pragma Inline (First_Literal_String);
499    --  Only valid for N_String_Type_Declaration nodes
500
501    function Next_String_Type
502      (Node    : Project_Node_Id;
503       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
504    pragma Inline (Next_String_Type);
505    --  Only valid for N_String_Type_Declaration nodes
506
507    function Next_Literal_String
508      (Node    : Project_Node_Id;
509       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
510    pragma Inline (Next_Literal_String);
511    --  Only valid for N_Literal_String nodes
512
513    function Expression_Of
514      (Node    : Project_Node_Id;
515       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
516    pragma Inline (Expression_Of);
517    --  Only valid for N_Attribute_Declaration, N_Typed_Variable_Declaration
518    --  or N_Variable_Declaration nodes
519
520    function Associative_Project_Of
521      (Node    : Project_Node_Id;
522       In_Tree : Project_Node_Tree_Ref)
523       return  Project_Node_Id;
524    pragma Inline (Associative_Project_Of);
525    --  Only valid for N_Attribute_Declaration nodes
526
527    function Associative_Package_Of
528      (Node    : Project_Node_Id;
529       In_Tree : Project_Node_Tree_Ref)
530       return  Project_Node_Id;
531    pragma Inline (Associative_Package_Of);
532    --  Only valid for N_Attribute_Declaration nodes
533
534    function Value_Is_Valid
535      (For_Typed_Variable : Project_Node_Id;
536       In_Tree            : Project_Node_Tree_Ref;
537       Value              : Name_Id) return Boolean;
538    pragma Inline (Value_Is_Valid);
539    --  Only valid for N_Typed_Variable_Declaration. Returns True if Value is
540    --  in the list of allowed strings for For_Typed_Variable. False otherwise.
541
542    function Associative_Array_Index_Of
543      (Node    : Project_Node_Id;
544       In_Tree : Project_Node_Tree_Ref) return Name_Id;
545    pragma Inline (Associative_Array_Index_Of);
546    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference.
547    --  Returns No_Name for non associative array attributes.
548
549    function Next_Variable
550      (Node    : Project_Node_Id;
551       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
552    pragma Inline (Next_Variable);
553    --  Only valid for N_Typed_Variable_Declaration or N_Variable_Declaration
554    --  nodes.
555
556    function First_Term
557      (Node    : Project_Node_Id;
558       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
559    pragma Inline (First_Term);
560    --  Only valid for N_Expression nodes
561
562    function Next_Expression_In_List
563      (Node    : Project_Node_Id;
564       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
565    pragma Inline (Next_Expression_In_List);
566    --  Only valid for N_Expression nodes
567
568    function Current_Term
569      (Node    : Project_Node_Id;
570       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
571    pragma Inline (Current_Term);
572    --  Only valid for N_Term nodes
573
574    function Next_Term
575      (Node    : Project_Node_Id;
576       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
577    pragma Inline (Next_Term);
578    --  Only valid for N_Term nodes
579
580    function First_Expression_In_List
581      (Node    : Project_Node_Id;
582       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
583    pragma Inline (First_Expression_In_List);
584    --  Only valid for N_Literal_String_List nodes
585
586    function Package_Node_Of
587      (Node    : Project_Node_Id;
588       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
589    pragma Inline (Package_Node_Of);
590    --  Only valid for N_Variable_Reference or N_Attribute_Reference nodes.
591    --  May return Empty_Node.
592
593    function String_Type_Of
594      (Node    : Project_Node_Id;
595       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
596    pragma Inline (String_Type_Of);
597    --  Only valid for N_Variable_Reference or N_Typed_Variable_Declaration
598    --  nodes.
599
600    function External_Reference_Of
601      (Node    : Project_Node_Id;
602       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
603    pragma Inline (External_Reference_Of);
604    --  Only valid for N_External_Value nodes
605
606    function External_Default_Of
607      (Node    : Project_Node_Id;
608       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
609    pragma Inline (External_Default_Of);
610    --  Only valid for N_External_Value nodes
611
612    function Case_Variable_Reference_Of
613      (Node    : Project_Node_Id;
614       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
615    pragma Inline (Case_Variable_Reference_Of);
616    --  Only valid for N_Case_Construction nodes
617
618    function First_Case_Item_Of
619      (Node    : Project_Node_Id;
620       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
621    pragma Inline (First_Case_Item_Of);
622    --  Only valid for N_Case_Construction nodes
623
624    function First_Choice_Of
625      (Node    : Project_Node_Id;
626       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
627    pragma Inline (First_Choice_Of);
628    --  Only valid for N_Case_Item nodes. Return the first choice in a
629    --  N_Case_Item, or Empty_Node if this is when others.
630
631    function Next_Case_Item
632      (Node    : Project_Node_Id;
633       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
634    pragma Inline (Next_Case_Item);
635    --  Only valid for N_Case_Item nodes
636
637    function Case_Insensitive
638      (Node    : Project_Node_Id;
639       In_Tree : Project_Node_Tree_Ref) return Boolean;
640    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference nodes
641
642    -----------------------
643    -- Create procedures --
644    -----------------------
645    --  The following procedures are used to edit a project file tree. They are
646    --  slightly higher-level than the Set_* procedures below
647
648    function Create_Project
649      (In_Tree        : Project_Node_Tree_Ref;
650       Name           : Name_Id;
651       Full_Path      : Path_Name_Type;
652       Is_Config_File : Boolean := False) return Project_Node_Id;
653    --  Create a new node for a project and register it in the tree so that it
654    --  can be retrieved later on.
655
656    function Create_Package
657      (Tree    : Project_Node_Tree_Ref;
658       Project : Project_Node_Id;
659       Pkg     : String) return Project_Node_Id;
660    --  Create a new package in Project. If the package already exists, it is
661    --  returned. The name of the package *must* be lower-cases, or none of its
662    --  attributes will be recognized.
663
664    function Create_Attribute
665      (Tree       : Project_Node_Tree_Ref;
666       Prj_Or_Pkg : Project_Node_Id;
667       Name       : Name_Id;
668       Index_Name : Name_Id         := No_Name;
669       Kind       : Variable_Kind   := List;
670       At_Index   : Integer         := 0;
671       Value      : Project_Node_Id := Empty_Node) return Project_Node_Id;
672    --  Create a new attribute. The new declaration is added at the end of the
673    --  declarative item list for Prj_Or_Pkg (a project or a package), but
674    --  before any package declaration). No addition is done if Prj_Or_Pkg is
675    --  Empty_Node. If Index_Name is not "", then if creates an attribute value
676    --  for a specific index. At_Index is used for the " at <idx>" in the naming
677    --  exceptions.
678    --
679    --  To set the value of the attribute, either provide a value for Value, or
680    --  use Set_Expression_Of to set the value of the attribute (in which case
681    --  Enclose_In_Expression might be useful). The former is recommended since
682    --  it will more correctly handle cases where the index needs to be set on
683    --  the expression rather than on the index of the attribute (i.e. 'for
684    --  Specification ("unit") use "file" at 3', versus 'for Executable ("file"
685    --  at 3) use "name"'). Value must be a N_String_Literal if an index will be
686    --  added to it.
687
688    function Create_Literal_String
689      (Str  : Namet.Name_Id;
690       Tree : Project_Node_Tree_Ref) return Project_Node_Id;
691    --  Create a literal string whose value is Str
692
693    procedure Add_At_End
694      (Tree                  : Project_Node_Tree_Ref;
695       Parent                : Project_Node_Id;
696       Expr                  : Project_Node_Id;
697       Add_Before_First_Pkg  : Boolean := False;
698       Add_Before_First_Case : Boolean := False);
699    --  Add a new declarative item in the list in Parent. This new declarative
700    --  item will contain Expr (unless Expr is already a declarative item, in
701    --  which case it is added directly to the list). The new item is inserted
702    --  at the end of the list, unless Add_Before_First_Pkg is True. In the
703    --  latter case, it is added just before the first case construction is
704    --  seen, or before the first package (this assumes that all packages are
705    --  found at the end of the project, which isn't true in the general case
706    --  unless you have normalized the project to match this description).
707
708    function Enclose_In_Expression
709      (Node : Project_Node_Id;
710       Tree : Project_Node_Tree_Ref) return Project_Node_Id;
711    --  Enclose the Node inside a N_Expression node, and return this expression.
712    --  This does nothing if Node is already a N_Expression.
713
714    --------------------
715    -- Set Procedures --
716    --------------------
717
718    --  The following procedures are part of the abstract interface of the
719    --  Project File tree.
720
721    --  Foe each Set_* procedure the condition of validity is specified. If an
722    --  access function is called with invalid arguments, then exception
723    --  Assertion_Error is raised if assertions are enabled, otherwise the
724    --  behaviour is not defined and may result in a crash.
725
726    --  These are very low-level, and manipulate the tree itself directly. You
727    --  should look at the Create_* procedure instead if you want to use higher
728    --  level constructs
729
730    procedure Set_Name_Of
731      (Node    : Project_Node_Id;
732       In_Tree : Project_Node_Tree_Ref;
733       To      : Name_Id);
734    pragma Inline (Set_Name_Of);
735    --  Valid for all non empty nodes.
736
737    procedure Set_Kind_Of
738      (Node    : Project_Node_Id;
739       In_Tree : Project_Node_Tree_Ref;
740       To      : Project_Node_Kind);
741    pragma Inline (Set_Kind_Of);
742    --  Valid for all non empty nodes
743
744    procedure Set_Location_Of
745      (Node    : Project_Node_Id;
746       In_Tree : Project_Node_Tree_Ref;
747       To      : Source_Ptr);
748    pragma Inline (Set_Location_Of);
749    --  Valid for all non empty nodes
750
751    procedure Set_First_Comment_After
752      (Node    : Project_Node_Id;
753       In_Tree : Project_Node_Tree_Ref;
754       To      : Project_Node_Id);
755    pragma Inline (Set_First_Comment_After);
756    --  Valid only for N_Comment_Zones nodes
757
758    procedure Set_First_Comment_After_End
759      (Node    : Project_Node_Id;
760       In_Tree : Project_Node_Tree_Ref;
761       To      : Project_Node_Id);
762    pragma Inline (Set_First_Comment_After_End);
763    --  Valid only for N_Comment_Zones nodes
764
765    procedure Set_First_Comment_Before
766      (Node    : Project_Node_Id;
767       In_Tree : Project_Node_Tree_Ref;
768       To      : Project_Node_Id);
769    pragma Inline (Set_First_Comment_Before);
770    --  Valid only for N_Comment_Zones nodes
771
772    procedure Set_First_Comment_Before_End
773      (Node    : Project_Node_Id;
774       In_Tree : Project_Node_Tree_Ref;
775       To      : Project_Node_Id);
776    pragma Inline (Set_First_Comment_Before_End);
777    --  Valid only for N_Comment_Zones nodes
778
779    procedure Set_Next_Comment
780      (Node    : Project_Node_Id;
781       In_Tree : Project_Node_Tree_Ref;
782       To      : Project_Node_Id);
783    pragma Inline (Set_Next_Comment);
784    --  Valid only for N_Comment nodes
785
786    procedure Set_Parent_Project_Of
787      (Node    : Project_Node_Id;
788       In_Tree : Project_Node_Tree_Ref;
789       To      : Project_Node_Id);
790    --  Valid only for N_Project nodes
791
792    procedure Set_Project_File_Includes_Unkept_Comments
793      (Node    : Project_Node_Id;
794       In_Tree : Project_Node_Tree_Ref;
795       To      : Boolean);
796    --  Valid only for N_Project nodes
797
798    procedure Set_Directory_Of
799      (Node    : Project_Node_Id;
800       In_Tree : Project_Node_Tree_Ref;
801       To      : Path_Name_Type);
802    pragma Inline (Set_Directory_Of);
803    --  Valid only for N_Project nodes
804
805    procedure Set_Expression_Kind_Of
806      (Node    : Project_Node_Id;
807       In_Tree : Project_Node_Tree_Ref;
808       To      : Variable_Kind);
809    pragma Inline (Set_Expression_Kind_Of);
810    --  Only valid for N_Literal_String, N_Attribute_Declaration,
811    --  N_Variable_Declaration, N_Typed_Variable_Declaration, N_Expression,
812    --  N_Term, N_Variable_Reference, N_Attribute_Reference or N_External_Value
813    --  nodes.
814
815    procedure Set_Is_Extending_All
816      (Node    : Project_Node_Id;
817       In_Tree : Project_Node_Tree_Ref);
818    pragma Inline (Set_Is_Extending_All);
819    --  Only valid for N_Project and N_With_Clause
820
821    procedure Set_Is_Not_Last_In_List
822      (Node    : Project_Node_Id;
823       In_Tree : Project_Node_Tree_Ref);
824    pragma Inline (Set_Is_Not_Last_In_List);
825    --  Only valid for N_With_Clause
826
827    procedure Set_First_Variable_Of
828      (Node    : Project_Node_Id;
829       In_Tree : Project_Node_Tree_Ref;
830       To      : Variable_Node_Id);
831    pragma Inline (Set_First_Variable_Of);
832    --  Only valid for N_Project or N_Package_Declaration nodes
833
834    procedure Set_First_Package_Of
835      (Node    : Project_Node_Id;
836       In_Tree : Project_Node_Tree_Ref;
837       To      : Package_Declaration_Id);
838    pragma Inline (Set_First_Package_Of);
839    --  Only valid for N_Project nodes
840
841    procedure Set_Package_Id_Of
842      (Node    : Project_Node_Id;
843       In_Tree : Project_Node_Tree_Ref;
844       To      : Package_Node_Id);
845    pragma Inline (Set_Package_Id_Of);
846    --  Only valid for N_Package_Declaration nodes
847
848    procedure Set_Path_Name_Of
849      (Node    : Project_Node_Id;
850       In_Tree : Project_Node_Tree_Ref;
851       To      : Path_Name_Type);
852    pragma Inline (Set_Path_Name_Of);
853    --  Only valid for N_Project and N_With_Clause nodes
854
855    procedure Set_String_Value_Of
856      (Node    : Project_Node_Id;
857       In_Tree : Project_Node_Tree_Ref;
858       To      : Name_Id);
859    pragma Inline (Set_String_Value_Of);
860    --  Only valid for N_With_Clause, N_Literal_String nodes or N_Comment.
861
862    procedure Set_Source_Index_Of
863      (Node    : Project_Node_Id;
864       In_Tree : Project_Node_Tree_Ref;
865       To      : Int);
866    pragma Inline (Set_Source_Index_Of);
867    --  Only valid for N_Literal_String and N_Attribute_Declaration nodes. For
868    --  N_Literal_String, set the source index of the literal string. For
869    --  N_Attribute_Declaration, set the source index of the index of the
870    --  associative array element.
871
872    procedure Set_First_With_Clause_Of
873      (Node    : Project_Node_Id;
874       In_Tree : Project_Node_Tree_Ref;
875       To      : Project_Node_Id);
876    pragma Inline (Set_First_With_Clause_Of);
877    --  Only valid for N_Project nodes
878
879    procedure Set_Project_Declaration_Of
880      (Node    : Project_Node_Id;
881       In_Tree : Project_Node_Tree_Ref;
882       To      : Project_Node_Id);
883    pragma Inline (Set_Project_Declaration_Of);
884    --  Only valid for N_Project nodes
885
886    procedure Set_Project_Qualifier_Of
887      (Node    : Project_Node_Id;
888       In_Tree : Project_Node_Tree_Ref;
889       To      : Project_Qualifier);
890    pragma Inline (Set_Project_Qualifier_Of);
891    --  Only valid for N_Project nodes
892
893    procedure Set_Extending_Project_Of
894      (Node    : Project_Node_Id;
895       In_Tree : Project_Node_Tree_Ref;
896       To      : Project_Node_Id);
897    pragma Inline (Set_Extending_Project_Of);
898    --  Only valid for N_Project_Declaration nodes
899
900    procedure Set_First_String_Type_Of
901      (Node    : Project_Node_Id;
902       In_Tree : Project_Node_Tree_Ref;
903       To      : Project_Node_Id);
904    pragma Inline (Set_First_String_Type_Of);
905    --  Only valid for N_Project nodes
906
907    procedure Set_Extended_Project_Path_Of
908      (Node    : Project_Node_Id;
909       In_Tree : Project_Node_Tree_Ref;
910       To      : Path_Name_Type);
911    pragma Inline (Set_Extended_Project_Path_Of);
912    --  Only valid for N_With_Clause nodes
913
914    procedure Set_Project_Node_Of
915      (Node         : Project_Node_Id;
916       In_Tree      : Project_Node_Tree_Ref;
917       To           : Project_Node_Id;
918       Limited_With : Boolean := False);
919    pragma Inline (Set_Project_Node_Of);
920    --  Only valid for N_With_Clause, N_Variable_Reference and
921    --  N_Attribute_Reference nodes.
922
923    procedure Set_Next_With_Clause_Of
924      (Node    : Project_Node_Id;
925       In_Tree : Project_Node_Tree_Ref;
926       To      : Project_Node_Id);
927    pragma Inline (Set_Next_With_Clause_Of);
928    --  Only valid for N_With_Clause nodes
929
930    procedure Set_First_Declarative_Item_Of
931      (Node    : Project_Node_Id;
932       In_Tree : Project_Node_Tree_Ref;
933       To      : Project_Node_Id);
934    pragma Inline (Set_First_Declarative_Item_Of);
935    --  Only valid for N_Project_Declaration, N_Case_Item and
936    --  N_Package_Declaration.
937
938    procedure Set_Extended_Project_Of
939      (Node    : Project_Node_Id;
940       In_Tree : Project_Node_Tree_Ref;
941       To      : Project_Node_Id);
942    pragma Inline (Set_Extended_Project_Of);
943    --  Only valid for N_Project_Declaration nodes
944
945    procedure Set_Current_Item_Node
946      (Node    : Project_Node_Id;
947       In_Tree : Project_Node_Tree_Ref;
948       To      : Project_Node_Id);
949    pragma Inline (Set_Current_Item_Node);
950    --  Only valid for N_Declarative_Item nodes
951
952    procedure Set_Next_Declarative_Item
953      (Node    : Project_Node_Id;
954       In_Tree : Project_Node_Tree_Ref;
955       To      : Project_Node_Id);
956    pragma Inline (Set_Next_Declarative_Item);
957    --  Only valid for N_Declarative_Item node
958
959    procedure Set_Project_Of_Renamed_Package_Of
960      (Node    : Project_Node_Id;
961       In_Tree : Project_Node_Tree_Ref;
962       To      : Project_Node_Id);
963    pragma Inline (Set_Project_Of_Renamed_Package_Of);
964    --  Only valid for N_Package_Declaration nodes.
965
966    procedure Set_Next_Package_In_Project
967      (Node    : Project_Node_Id;
968       In_Tree : Project_Node_Tree_Ref;
969       To      : Project_Node_Id);
970    pragma Inline (Set_Next_Package_In_Project);
971    --  Only valid for N_Package_Declaration nodes
972
973    procedure Set_First_Literal_String
974      (Node    : Project_Node_Id;
975       In_Tree : Project_Node_Tree_Ref;
976       To      : Project_Node_Id);
977    pragma Inline (Set_First_Literal_String);
978    --  Only valid for N_String_Type_Declaration nodes
979
980    procedure Set_Next_String_Type
981      (Node    : Project_Node_Id;
982       In_Tree : Project_Node_Tree_Ref;
983       To      : Project_Node_Id);
984    pragma Inline (Set_Next_String_Type);
985    --  Only valid for N_String_Type_Declaration nodes
986
987    procedure Set_Next_Literal_String
988      (Node    : Project_Node_Id;
989       In_Tree : Project_Node_Tree_Ref;
990       To      : Project_Node_Id);
991    pragma Inline (Set_Next_Literal_String);
992    --  Only valid for N_Literal_String nodes
993
994    procedure Set_Expression_Of
995      (Node    : Project_Node_Id;
996       In_Tree : Project_Node_Tree_Ref;
997       To      : Project_Node_Id);
998    pragma Inline (Set_Expression_Of);
999    --  Only valid for N_Attribute_Declaration, N_Typed_Variable_Declaration
1000    --  or N_Variable_Declaration nodes
1001
1002    procedure Set_Associative_Project_Of
1003      (Node    : Project_Node_Id;
1004       In_Tree : Project_Node_Tree_Ref;
1005       To      : Project_Node_Id);
1006    pragma Inline (Set_Associative_Project_Of);
1007    --  Only valid for N_Attribute_Declaration nodes
1008
1009    procedure Set_Associative_Package_Of
1010      (Node    : Project_Node_Id;
1011       In_Tree : Project_Node_Tree_Ref;
1012       To      : Project_Node_Id);
1013    pragma Inline (Set_Associative_Package_Of);
1014    --  Only valid for N_Attribute_Declaration nodes
1015
1016    procedure Set_Associative_Array_Index_Of
1017      (Node    : Project_Node_Id;
1018       In_Tree : Project_Node_Tree_Ref;
1019       To      : Name_Id);
1020    pragma Inline (Set_Associative_Array_Index_Of);
1021    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference.
1022
1023    procedure Set_Next_Variable
1024      (Node    : Project_Node_Id;
1025       In_Tree : Project_Node_Tree_Ref;
1026       To      : Project_Node_Id);
1027    pragma Inline (Set_Next_Variable);
1028    --  Only valid for N_Typed_Variable_Declaration or N_Variable_Declaration
1029    --  nodes.
1030
1031    procedure Set_First_Term
1032      (Node    : Project_Node_Id;
1033       In_Tree : Project_Node_Tree_Ref;
1034       To      : Project_Node_Id);
1035    pragma Inline (Set_First_Term);
1036    --  Only valid for N_Expression nodes
1037
1038    procedure Set_Next_Expression_In_List
1039      (Node    : Project_Node_Id;
1040       In_Tree : Project_Node_Tree_Ref;
1041       To      : Project_Node_Id);
1042    pragma Inline (Set_Next_Expression_In_List);
1043    --  Only valid for N_Expression nodes
1044
1045    procedure Set_Current_Term
1046      (Node    : Project_Node_Id;
1047       In_Tree : Project_Node_Tree_Ref;
1048       To      : Project_Node_Id);
1049    pragma Inline (Set_Current_Term);
1050    --  Only valid for N_Term nodes
1051
1052    procedure Set_Next_Term
1053      (Node    : Project_Node_Id;
1054       In_Tree : Project_Node_Tree_Ref;
1055       To      : Project_Node_Id);
1056    pragma Inline (Set_Next_Term);
1057    --  Only valid for N_Term nodes
1058
1059    procedure Set_First_Expression_In_List
1060      (Node    : Project_Node_Id;
1061       In_Tree : Project_Node_Tree_Ref;
1062       To      : Project_Node_Id);
1063    pragma Inline (Set_First_Expression_In_List);
1064    --  Only valid for N_Literal_String_List nodes
1065
1066    procedure Set_Package_Node_Of
1067      (Node    : Project_Node_Id;
1068       In_Tree : Project_Node_Tree_Ref;
1069       To      : Project_Node_Id);
1070    pragma Inline (Set_Package_Node_Of);
1071    --  Only valid for N_Variable_Reference or N_Attribute_Reference nodes.
1072
1073    procedure Set_String_Type_Of
1074      (Node    : Project_Node_Id;
1075       In_Tree : Project_Node_Tree_Ref;
1076       To      : Project_Node_Id);
1077    pragma Inline (Set_String_Type_Of);
1078    --  Only valid for N_Variable_Reference or N_Typed_Variable_Declaration
1079    --  nodes.
1080
1081    procedure Set_External_Reference_Of
1082      (Node    : Project_Node_Id;
1083       In_Tree : Project_Node_Tree_Ref;
1084       To      : Project_Node_Id);
1085    pragma Inline (Set_External_Reference_Of);
1086    --  Only valid for N_External_Value nodes
1087
1088    procedure Set_External_Default_Of
1089      (Node    : Project_Node_Id;
1090       In_Tree : Project_Node_Tree_Ref;
1091       To      : Project_Node_Id);
1092    pragma Inline (Set_External_Default_Of);
1093    --  Only valid for N_External_Value nodes
1094
1095    procedure Set_Case_Variable_Reference_Of
1096      (Node    : Project_Node_Id;
1097       In_Tree : Project_Node_Tree_Ref;
1098       To      : Project_Node_Id);
1099    pragma Inline (Set_Case_Variable_Reference_Of);
1100    --  Only valid for N_Case_Construction nodes
1101
1102    procedure Set_First_Case_Item_Of
1103      (Node    : Project_Node_Id;
1104       In_Tree : Project_Node_Tree_Ref;
1105       To      : Project_Node_Id);
1106    pragma Inline (Set_First_Case_Item_Of);
1107    --  Only valid for N_Case_Construction nodes
1108
1109    procedure Set_First_Choice_Of
1110      (Node    : Project_Node_Id;
1111       In_Tree : Project_Node_Tree_Ref;
1112       To      : Project_Node_Id);
1113    pragma Inline (Set_First_Choice_Of);
1114    --  Only valid for N_Case_Item nodes.
1115
1116    procedure Set_Next_Case_Item
1117      (Node    : Project_Node_Id;
1118       In_Tree : Project_Node_Tree_Ref;
1119       To      : Project_Node_Id);
1120    pragma Inline (Set_Next_Case_Item);
1121    --  Only valid for N_Case_Item nodes.
1122
1123    procedure Set_Case_Insensitive
1124      (Node    : Project_Node_Id;
1125       In_Tree : Project_Node_Tree_Ref;
1126       To      : Boolean);
1127    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference nodes
1128
1129    -------------------------------
1130    -- Restricted Access Section --
1131    -------------------------------
1132
1133    package Tree_Private_Part is
1134
1135       --  This is conceptually in the private part. However, for efficiency,
1136       --  some packages are accessing it directly.
1137
1138       type Project_Node_Record is record
1139
1140          Kind : Project_Node_Kind;
1141
1142          Qualifier : Project_Qualifier := Unspecified;
1143
1144          Location : Source_Ptr := No_Location;
1145
1146          Directory : Path_Name_Type := No_Path;
1147          --  Only for N_Project
1148
1149          Expr_Kind : Variable_Kind := Undefined;
1150          --  See below for what Project_Node_Kind it is used
1151
1152          Variables : Variable_Node_Id := Empty_Node;
1153          --  First variable in a project or a package
1154
1155          Packages : Package_Declaration_Id := Empty_Node;
1156          --  First package declaration in a project
1157
1158          Pkg_Id : Package_Node_Id := Empty_Package;
1159          --  Only used for N_Package_Declaration
1160          --
1161          --  The component Pkg_Id is an entry into the table Package_Attributes
1162          --  (in Prj.Attr). It is used to indicate all the attributes of the
1163          --  package with their characteristics.
1164          --
1165          --  The tables Prj.Attr.Attributes and Prj.Attr.Package_Attributes
1166          --  are built once and for all through a call (from Prj.Initialize)
1167          --  to procedure Prj.Attr.Initialize. It is never modified after that.
1168
1169          Name : Name_Id := No_Name;
1170          --  See below for what Project_Node_Kind it is used
1171
1172          Src_Index : Int := 0;
1173          --  Index of a unit in a multi-unit source.
1174          --  Only for some N_Attribute_Declaration and N_Literal_String.
1175
1176          Path_Name : Path_Name_Type := No_Path;
1177          --  See below for what Project_Node_Kind it is used
1178
1179          Value : Name_Id := No_Name;
1180          --  See below for what Project_Node_Kind it is used
1181
1182          Field1 : Project_Node_Id := Empty_Node;
1183          --  See below the meaning for each Project_Node_Kind
1184
1185          Field2 : Project_Node_Id := Empty_Node;
1186          --  See below the meaning for each Project_Node_Kind
1187
1188          Field3 : Project_Node_Id := Empty_Node;
1189          --  See below the meaning for each Project_Node_Kind
1190
1191          Field4 : Project_Node_Id := Empty_Node;
1192          --  See below the meaning for each Project_Node_Kind
1193
1194          Flag1 : Boolean := False;
1195          --  This flag is significant only for:
1196          --
1197          --    N_Attribute_Declaration and N_Attribute_Reference
1198          --      Indicates for an associative array attribute, that the
1199          --      index is case insensitive.
1200          --
1201          --    N_Comment
1202          --      Indicates that the comment is preceded by an empty line.
1203          --
1204          --    N_Project
1205          --      Indicates that there are comments in the project source that
1206          --      cannot be kept in the tree.
1207          --
1208          --    N_Project_Declaration
1209          --      Indicates that there are unkept comments in the project.
1210          --
1211          --    N_With_Clause
1212          --      Indicates that this is not the last with in a with clause.
1213          --      Set for "A", but not for "B" in with "B"; and with "A", "B";
1214
1215          Flag2 : Boolean := False;
1216          --  This flag is significant only for:
1217          --
1218          --    N_Project
1219          --      Indicates that the project "extends all" another project.
1220          --
1221          --    N_Comment
1222          --      Indicates that the comment is followed by an empty line.
1223          --
1224          --    N_With_Clause
1225          --      Indicates that the originally imported project is an extending
1226          --      all project.
1227
1228          Comments : Project_Node_Id := Empty_Node;
1229          --  For nodes other that N_Comment_Zones or N_Comment, designates the
1230          --  comment zones associated with the node.
1231          --
1232          --  For N_Comment_Zones, designates the comment after the "end" of
1233          --  the construct.
1234          --
1235          --  For N_Comment, designates the next comment, if any.
1236
1237       end record;
1238
1239       --  type Project_Node_Kind is
1240
1241       --   (N_Project,
1242       --    --  Name:      project name
1243       --    --  Path_Name: project path name
1244       --    --  Expr_Kind: Undefined
1245       --    --  Field1:    first with clause
1246       --    --  Field2:    project declaration
1247       --    --  Field3:    first string type
1248       --    --  Field4:    parent project, if any
1249       --    --  Value:     extended project path name (if any)
1250
1251       --    N_With_Clause,
1252       --    --  Name:      imported project name
1253       --    --  Path_Name: imported project path name
1254       --    --  Expr_Kind: Undefined
1255       --    --  Field1:    project node
1256       --    --  Field2:    next with clause
1257       --    --  Field3:    project node or empty if "limited with"
1258       --    --  Field4:    not used
1259       --    --  Value:     literal string withed
1260
1261       --    N_Project_Declaration,
1262       --    --  Name:      not used
1263       --    --  Path_Name: not used
1264       --    --  Expr_Kind: Undefined
1265       --    --  Field1:    first declarative item
1266       --    --  Field2:    extended project
1267       --    --  Field3:    extending project
1268       --    --  Field4:    not used
1269       --    --  Value:     not used
1270
1271       --    N_Declarative_Item,
1272       --    --  Name:      not used
1273       --    --  Path_Name: not used
1274       --    --  Expr_Kind: Undefined
1275       --    --  Field1:    current item node
1276       --    --  Field2:    next declarative item
1277       --    --  Field3:    not used
1278       --    --  Field4:    not used
1279       --    --  Value:     not used
1280
1281       --    N_Package_Declaration,
1282       --    --  Name:      package name
1283       --    --  Path_Name: not used
1284       --    --  Expr_Kind: Undefined
1285       --    --  Field1:    project of renamed package (if any)
1286       --    --  Field2:    first declarative item
1287       --    --  Field3:    next package in project
1288       --    --  Field4:    not used
1289       --    --  Value:     not used
1290
1291       --    N_String_Type_Declaration,
1292       --    --  Name:      type name
1293       --    --  Path_Name: not used
1294       --    --  Expr_Kind: Undefined
1295       --    --  Field1:    first literal string
1296       --    --  Field2:    next string type
1297       --    --  Field3:    not used
1298       --    --  Field4:    not used
1299       --    --  Value:     not used
1300
1301       --    N_Literal_String,
1302       --    --  Name:      not used
1303       --    --  Path_Name: not used
1304       --    --  Expr_Kind: Single
1305       --    --  Field1:    next literal string
1306       --    --  Field2:    not used
1307       --    --  Field3:    not used
1308       --    --  Field4:    not used
1309       --    --  Value:     string value
1310
1311       --    N_Attribute_Declaration,
1312       --    --  Name:      attribute name
1313       --    --  Path_Name: not used
1314       --    --  Expr_Kind: attribute kind
1315       --    --  Field1:    expression
1316       --    --  Field2:    project of full associative array
1317       --    --  Field3:    package of full associative array
1318       --    --  Field4:    not used
1319       --    --  Value:     associative array index
1320       --    --             (if an associative array element)
1321
1322       --    N_Typed_Variable_Declaration,
1323       --    --  Name:      variable name
1324       --    --  Path_Name: not used
1325       --    --  Expr_Kind: Single
1326       --    --  Field1:    expression
1327       --    --  Field2:    type of variable (N_String_Type_Declaration)
1328       --    --  Field3:    next variable
1329       --    --  Field4:    not used
1330       --    --  Value:     not used
1331
1332       --    N_Variable_Declaration,
1333       --    --  Name:      variable name
1334       --    --  Path_Name: not used
1335       --    --  Expr_Kind: variable kind
1336       --    --  Field1:    expression
1337       --    --  Field2:    not used
1338       --    --             Field3 is used for next variable, instead of Field2,
1339       --    --             so that it is the same field for
1340       --    --             N_Variable_Declaration and
1341       --    --             N_Typed_Variable_Declaration
1342       --    --  Field3:    next variable
1343       --    --  Field4:    not used
1344       --    --  Value:     not used
1345
1346       --    N_Expression,
1347       --    --  Name:      not used
1348       --    --  Path_Name: not used
1349       --    --  Expr_Kind: expression kind
1350       --    --  Field1:    first term
1351       --    --  Field2:    next expression in list
1352       --    --  Field3:    not used
1353       --    --  Value:     not used
1354
1355       --    N_Term,
1356       --    --  Name:      not used
1357       --    --  Path_Name: not used
1358       --    --  Expr_Kind: term kind
1359       --    --  Field1:    current term
1360       --    --  Field2:    next term in the expression
1361       --    --  Field3:    not used
1362       --    --  Field4:    not used
1363       --    --  Value:     not used
1364
1365       --    N_Literal_String_List,
1366       --    --  Designates a list of string expressions between brackets
1367       --    --  separated by commas. The string expressions are not necessarily
1368       --    --  literal strings.
1369       --    --  Name:      not used
1370       --    --  Path_Name: not used
1371       --    --  Expr_Kind: List
1372       --    --  Field1:    first expression
1373       --    --  Field2:    not used
1374       --    --  Field3:    not used
1375       --    --  Field4:    not used
1376       --    --  Value:     not used
1377
1378       --    N_Variable_Reference,
1379       --    --  Name:      variable name
1380       --    --  Path_Name: not used
1381       --    --  Expr_Kind: variable kind
1382       --    --  Field1:    project (if specified)
1383       --    --  Field2:    package (if specified)
1384       --    --  Field3:    type of variable (N_String_Type_Declaration), if any
1385       --    --  Field4:    not used
1386       --    --  Value:     not used
1387
1388       --    N_External_Value,
1389       --    --  Name:      not used
1390       --    --  Path_Name: not used
1391       --    --  Expr_Kind: Single
1392       --    --  Field1:    Name of the external reference (literal string)
1393       --    --  Field2:    Default (literal string)
1394       --    --  Field3:    not used
1395       --    --  Value:     not used
1396
1397       --    N_Attribute_Reference,
1398       --    --  Name:      attribute name
1399       --    --  Path_Name: not used
1400       --    --  Expr_Kind: attribute kind
1401       --    --  Field1:    project
1402       --    --  Field2:    package (if attribute of a package)
1403       --    --  Field3:    not used
1404       --    --  Field4:    not used
1405       --    --  Value:     associative array index
1406       --    --             (if an associative array element)
1407
1408       --    N_Case_Construction,
1409       --    --  Name:      not used
1410       --    --  Path_Name: not used
1411       --    --  Expr_Kind: Undefined
1412       --    --  Field1:    case variable reference
1413       --    --  Field2:    first case item
1414       --    --  Field3:    not used
1415       --    --  Field4:    not used
1416       --    --  Value:     not used
1417
1418       --    N_Case_Item
1419       --    --  Name:      not used
1420       --    --  Path_Name: not used
1421       --    --  Expr_Kind: not used
1422       --    --  Field1:    first choice (literal string), or Empty_Node
1423       --    --             for when others
1424       --    --  Field2:    first declarative item
1425       --    --  Field3:    next case item
1426       --    --  Field4:    not used
1427       --    --  Value:     not used
1428
1429       --    N_Comment_zones
1430       --    --  Name:      not used
1431       --    --  Path_Name: not used
1432       --    --  Expr_Kind: not used
1433       --    --  Field1:    comment before the construct
1434       --    --  Field2:    comment after the construct
1435       --    --  Field3:    comment before the "end" of the construct
1436       --    --  Value:     end of line comment
1437       --    --  Field4:    not used
1438       --    --  Comments:  comment after the "end" of the construct
1439
1440       --    N_Comment
1441       --    --  Name:      not used
1442       --    --  Path_Name: not used
1443       --    --  Expr_Kind: not used
1444       --    --  Field1:    not used
1445       --    --  Field2:    not used
1446       --    --  Field3:    not used
1447       --    --  Field4:    not used
1448       --    --  Value:     comment
1449       --    --  Flag1:     comment is preceded by an empty line
1450       --    --  Flag2:     comment is followed by an empty line
1451       --    --  Comments:  next comment
1452
1453       package Project_Node_Table is new
1454         GNAT.Dynamic_Tables
1455           (Table_Component_Type => Project_Node_Record,
1456            Table_Index_Type     => Project_Node_Id,
1457            Table_Low_Bound      => First_Node_Id,
1458            Table_Initial        => Project_Nodes_Initial,
1459            Table_Increment      => Project_Nodes_Increment);
1460       --  Table contains the syntactic tree of project data from project files
1461
1462       type Project_Name_And_Node is record
1463          Name : Name_Id;
1464          --  Name of the project
1465
1466          Display_Name : Name_Id;
1467          --  The name of the project as it appears in the .gpr file
1468
1469          Node : Project_Node_Id;
1470          --  Node of the project in table Project_Nodes
1471
1472          Canonical_Path : Path_Name_Type;
1473          --  Resolved and canonical path of a real project file.
1474          --  No_Name in case of virtual projects.
1475
1476          Extended : Boolean;
1477          --  True when the project is being extended by another project
1478
1479          Proj_Qualifier : Project_Qualifier;
1480          --  The project qualifier of the project, if any
1481       end record;
1482
1483       No_Project_Name_And_Node : constant Project_Name_And_Node :=
1484         (Name           => No_Name,
1485          Display_Name   => No_Name,
1486          Node           => Empty_Node,
1487          Canonical_Path => No_Path,
1488          Extended       => True,
1489          Proj_Qualifier => Unspecified);
1490
1491       package Projects_Htable is new GNAT.Dynamic_HTables.Simple_HTable
1492         (Header_Num => Header_Num,
1493          Element    => Project_Name_And_Node,
1494          No_Element => No_Project_Name_And_Node,
1495          Key        => Name_Id,
1496          Hash       => Hash,
1497          Equal      => "=");
1498       --  This hash table contains a mapping of project names to project nodes.
1499       --  Note that this hash table contains only the nodes whose Kind is
1500       --  N_Project. It is used to find the node of a project from its name,
1501       --  and to verify if a project has already been parsed, knowing its name.
1502
1503    end Tree_Private_Part;
1504
1505    type Project_Node_Tree_Data is record
1506       Project_Nodes : Tree_Private_Part.Project_Node_Table.Instance;
1507       Projects_HT   : Tree_Private_Part.Projects_Htable.Instance;
1508
1509       Incomplete_With : Boolean := False;
1510       --  Set to True if the projects were loaded with the flag
1511       --  Ignore_Missing_With set to True, and there were indeed some with
1512       --  statements that could not be resolved
1513    end record;
1514
1515    procedure Free (Proj : in out Project_Node_Tree_Ref);
1516    --  Free memory used by Prj
1517
1518 private
1519    type Comment_Array is array (Positive range <>) of Comment_Data;
1520    type Comments_Ptr is access Comment_Array;
1521
1522    type Comment_State is record
1523       End_Of_Line_Node   : Project_Node_Id := Empty_Node;
1524       Previous_Line_Node : Project_Node_Id := Empty_Node;
1525       Previous_End_Node  : Project_Node_Id := Empty_Node;
1526       Unkept_Comments    : Boolean := False;
1527       Comments           : Comments_Ptr := null;
1528    end record;
1529
1530 end Prj.Tree;