OSDN Git Service

15156e869d317eb74a264610ed293ae5a535bf74
[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-2003 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 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.                                                      --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 --  This package defines the structure of the Project File tree.
28
29 with GNAT.HTable;
30
31 with Prj.Attr; use Prj.Attr;
32 with Prj.Com;  use Prj.Com;
33 with Types;    use Types;
34 with Table;
35
36 package Prj.Tree is
37
38    Project_Nodes_Initial   : constant := 1_000;
39    Project_Nodes_Increment : constant := 100;
40    --  Allocation parameters for initializing and extending number
41    --  of nodes in table Tree_Private_Part.Project_Nodes
42
43    Project_Node_Low_Bound  : constant := 0;
44    Project_Node_High_Bound : constant := 099_999_999;
45    --  Range of values for project node id's (in practice infinite)
46
47    type Project_Node_Id is range
48      Project_Node_Low_Bound .. Project_Node_High_Bound;
49    --  The index of table Tree_Private_Part.Project_Nodes
50
51    Empty_Node : constant Project_Node_Id := Project_Node_Low_Bound;
52    --  Designates no node in table Project_Nodes
53
54    First_Node_Id : constant Project_Node_Id := Project_Node_Low_Bound + 1;
55
56    subtype Variable_Node_Id is Project_Node_Id;
57    --  Used to designate a node whose expected kind is one of
58    --  N_Typed_Variable_Declaration, N_Variable_Declaration or
59    --  N_Variable_Reference.
60
61    subtype Package_Declaration_Id is Project_Node_Id;
62    --  Used to designate a node whose expected kind is N_Proect_Declaration
63
64    type Project_Node_Kind is
65      (N_Project,
66       N_With_Clause,
67       N_Project_Declaration,
68       N_Declarative_Item,
69       N_Package_Declaration,
70       N_String_Type_Declaration,
71       N_Literal_String,
72       N_Attribute_Declaration,
73       N_Typed_Variable_Declaration,
74       N_Variable_Declaration,
75       N_Expression,
76       N_Term,
77       N_Literal_String_List,
78       N_Variable_Reference,
79       N_External_Value,
80       N_Attribute_Reference,
81       N_Case_Construction,
82       N_Case_Item);
83    --  Each node in the tree is of a Project_Node_Kind
84    --  For the signification of the fields in each node of a
85    --  Project_Node_Kind, look at package Tree_Private_Part.
86
87    procedure Initialize;
88    --  Initialize the Project File tree: empty the Project_Nodes table
89    --  and reset the Projects_Htable.
90
91    function Default_Project_Node
92      (Of_Kind       : Project_Node_Kind;
93       And_Expr_Kind : Variable_Kind := Undefined)
94       return          Project_Node_Id;
95    --  Returns a Project_Node_Record with the specified Kind and
96    --  Expr_Kind; all the other components have default nil values.
97
98    function Hash (N : Project_Node_Id) return Header_Num;
99    --  Used for hash tables where the key is a Project_Node_Id
100
101    function Imported_Or_Extended_Project_Of
102      (Project   : Project_Node_Id;
103       With_Name : Name_Id)
104       return      Project_Node_Id;
105    --  Return the node of a project imported or extended by project Project and
106    --  whose name is With_Name. Return Empty_Node if there is no such project.
107
108    ----------------------
109    -- Access Functions --
110    ----------------------
111
112    --  The following query functions are part of the abstract interface
113    --  of the Project File tree
114
115    function Name_Of (Node : Project_Node_Id) return Name_Id;
116    pragma Inline (Name_Of);
117    --  Valid for all non empty nodes. May return No_Name for nodes that have
118    --  no names.
119
120    function Kind_Of (Node : Project_Node_Id) return Project_Node_Kind;
121    pragma Inline (Kind_Of);
122    --  Valid for all non empty nodes
123
124    function Location_Of (Node : Project_Node_Id) return Source_Ptr;
125    pragma Inline (Location_Of);
126    --  Valid for all non empty nodes
127
128    function Directory_Of (Node : Project_Node_Id) return Name_Id;
129    pragma Inline (Directory_Of);
130    --  Only valid for N_Project nodes.
131
132    function Expression_Kind_Of (Node : Project_Node_Id) return Variable_Kind;
133    pragma Inline (Expression_Kind_Of);
134    --  Only valid for N_Literal_String, N_Attribute_Declaration,
135    --  N_Variable_Declaration, N_Typed_Variable_Declaration, N_Expression,
136    --  N_Term, N_Variable_Reference or N_Attribute_Reference nodes.
137
138    function Is_Extending_All (Node  : Project_Node_Id) return Boolean;
139    pragma Inline (Is_Extending_All);
140    --  Only valid for N_Project
141
142    function First_Variable_Of
143      (Node  : Project_Node_Id)
144       return  Variable_Node_Id;
145    pragma Inline (First_Variable_Of);
146    --  Only valid for N_Project or N_Package_Declaration nodes
147
148    function First_Package_Of
149      (Node  : Project_Node_Id)
150       return  Package_Declaration_Id;
151    pragma Inline (First_Package_Of);
152    --  Only valid for N_Project nodes
153
154    function Package_Id_Of (Node  : Project_Node_Id) return Package_Node_Id;
155    pragma Inline (Package_Id_Of);
156    --  Only valid for N_Package_Declaration nodes
157
158    function Path_Name_Of (Node  : Project_Node_Id) return Name_Id;
159    pragma Inline (Path_Name_Of);
160    --  Only valid for N_Project and N_With_Clause nodes.
161
162    function String_Value_Of (Node  : Project_Node_Id) return Name_Id;
163    pragma Inline (String_Value_Of);
164    --  Only valid for N_With_Clause or N_Literal_String nodes.
165
166    function First_With_Clause_Of
167      (Node  : Project_Node_Id)
168       return  Project_Node_Id;
169    pragma Inline (First_With_Clause_Of);
170    --  Only valid for N_Project nodes
171
172    function Project_Declaration_Of
173      (Node  : Project_Node_Id)
174       return  Project_Node_Id;
175    pragma Inline (Project_Declaration_Of);
176    --  Only valid for N_Project nodes
177
178    function Extending_Project_Of
179      (Node  : Project_Node_Id)
180       return  Project_Node_Id;
181    pragma Inline (Extending_Project_Of);
182    --  Only valid for N_Project_Declaration nodes
183
184    function First_String_Type_Of
185      (Node  : Project_Node_Id)
186       return  Project_Node_Id;
187    pragma Inline (First_String_Type_Of);
188    --  Only valid for N_Project nodes
189
190    function Extended_Project_Path_Of
191      (Node  : Project_Node_Id)
192       return  Name_Id;
193    pragma Inline (Extended_Project_Path_Of);
194    --  Only valid for N_With_Clause nodes
195
196    function Project_Node_Of
197      (Node  : Project_Node_Id)
198       return  Project_Node_Id;
199    pragma Inline (Project_Node_Of);
200    --  Only valid for N_With_Clause, N_Variable_Reference and
201    --  N_Attribute_Reference nodes.
202
203    function Non_Limited_Project_Node_Of
204      (Node  : Project_Node_Id)
205       return  Project_Node_Id;
206    pragma Inline (Non_Limited_Project_Node_Of);
207    --  Only valid for N_With_Clause nodes. Returns Empty_Node for limited
208    --  imported project files, otherwise returns the same result as
209    --  Project_Node_Of.
210
211    function Next_With_Clause_Of
212      (Node  : Project_Node_Id)
213       return  Project_Node_Id;
214    pragma Inline (Next_With_Clause_Of);
215    --  Only valid for N_With_Clause nodes
216
217    function First_Declarative_Item_Of
218      (Node  : Project_Node_Id)
219       return  Project_Node_Id;
220    pragma Inline (First_Declarative_Item_Of);
221    --  Only valid for N_With_Clause nodes
222
223    function Extended_Project_Of
224      (Node  : Project_Node_Id)
225       return Project_Node_Id;
226    pragma Inline (Extended_Project_Of);
227    --  Only valid for N_Project_Declaration nodes
228
229    function Current_Item_Node
230      (Node  : Project_Node_Id)
231       return  Project_Node_Id;
232    pragma Inline (Current_Item_Node);
233    --  Only valid for N_Declarative_Item nodes
234
235    function Next_Declarative_Item
236      (Node  : Project_Node_Id)
237       return  Project_Node_Id;
238    pragma Inline (Next_Declarative_Item);
239    --  Only valid for N_Declarative_Item node
240
241    function Project_Of_Renamed_Package_Of
242      (Node  : Project_Node_Id)
243       return  Project_Node_Id;
244    pragma Inline (Project_Of_Renamed_Package_Of);
245    --  Only valid for N_Package_Declaration nodes.
246    --  May return Empty_Node.
247
248    function Next_Package_In_Project
249      (Node  : Project_Node_Id)
250       return  Project_Node_Id;
251    pragma Inline (Next_Package_In_Project);
252    --  Only valid for N_Package_Declaration nodes
253
254    function First_Literal_String
255      (Node  : Project_Node_Id)
256       return  Project_Node_Id;
257    pragma Inline (First_Literal_String);
258    --  Only valid for N_String_Type_Declaration nodes
259
260    function Next_String_Type
261      (Node  : Project_Node_Id)
262       return  Project_Node_Id;
263    pragma Inline (Next_String_Type);
264    --  Only valid for N_String_Type_Declaration nodes
265
266    function Next_Literal_String
267      (Node  : Project_Node_Id)
268       return  Project_Node_Id;
269    pragma Inline (Next_Literal_String);
270    --  Only valid for N_Literal_String nodes
271
272    function Expression_Of
273      (Node  : Project_Node_Id)
274       return  Project_Node_Id;
275    pragma Inline (Expression_Of);
276    --  Only valid for N_Attribute_Declaration, N_Typed_Variable_Declaration
277    --  or N_Variable_Declaration nodes
278
279    function Associative_Project_Of
280      (Node  : Project_Node_Id)
281       return  Project_Node_Id;
282    pragma Inline (Associative_Project_Of);
283    --  Only valid for N_Attribute_Declaration nodes
284
285    function Associative_Package_Of
286      (Node  : Project_Node_Id)
287       return  Project_Node_Id;
288    pragma Inline (Associative_Package_Of);
289    --  Only valid for N_Attribute_Declaration nodes
290
291    function Value_Is_Valid
292      (For_Typed_Variable : Project_Node_Id;
293       Value              : Name_Id)
294       return               Boolean;
295    pragma Inline (Value_Is_Valid);
296    --  Only valid for N_Typed_Variable_Declaration. Returns True if Value is
297    --  in the list of allowed strings for For_Typed_Variable. False otherwise.
298
299    function Associative_Array_Index_Of
300      (Node  : Project_Node_Id)
301       return  Name_Id;
302    pragma Inline (Associative_Array_Index_Of);
303    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference.
304    --  Returns No_String for non associative array attributes.
305
306    function Next_Variable
307      (Node  : Project_Node_Id)
308       return  Project_Node_Id;
309    pragma Inline (Next_Variable);
310    --  Only valid for N_Typed_Variable_Declaration or N_Variable_Declaration
311    --  nodes.
312
313    function First_Term
314      (Node  : Project_Node_Id)
315       return  Project_Node_Id;
316    pragma Inline (First_Term);
317    --  Only valid for N_Expression nodes
318
319    function Next_Expression_In_List
320      (Node  : Project_Node_Id)
321       return  Project_Node_Id;
322    pragma Inline (Next_Expression_In_List);
323    --  Only valid for N_Expression nodes
324
325    function Current_Term
326      (Node  : Project_Node_Id)
327       return  Project_Node_Id;
328    pragma Inline (Current_Term);
329    --  Only valid for N_Term nodes
330
331    function Next_Term
332      (Node  : Project_Node_Id)
333       return  Project_Node_Id;
334    pragma Inline (Next_Term);
335    --  Only valid for N_Term nodes
336
337    function First_Expression_In_List
338      (Node  : Project_Node_Id)
339       return  Project_Node_Id;
340    pragma Inline (First_Expression_In_List);
341    --  Only valid for N_Literal_String_List nodes
342
343    function Package_Node_Of
344      (Node  : Project_Node_Id)
345       return  Project_Node_Id;
346    pragma Inline (Package_Node_Of);
347    --  Only valid for N_Variable_Reference or N_Attribute_Reference nodes.
348    --  May return Empty_Node.
349
350    function String_Type_Of
351      (Node  : Project_Node_Id)
352       return  Project_Node_Id;
353    pragma Inline (String_Type_Of);
354    --  Only valid for N_Variable_Reference or N_Typed_Variable_Declaration
355    --  nodes.
356
357    function External_Reference_Of
358      (Node  : Project_Node_Id)
359       return  Project_Node_Id;
360    pragma Inline (External_Reference_Of);
361    --  Only valid for N_External_Value nodes
362
363    function External_Default_Of
364      (Node  : Project_Node_Id)
365       return  Project_Node_Id;
366    pragma Inline (External_Default_Of);
367    --  Only valid for N_External_Value nodes
368
369    function Case_Variable_Reference_Of
370      (Node  : Project_Node_Id)
371       return  Project_Node_Id;
372    pragma Inline (Case_Variable_Reference_Of);
373    --  Only valid for N_Case_Construction nodes
374
375    function First_Case_Item_Of
376      (Node  : Project_Node_Id)
377       return  Project_Node_Id;
378    pragma Inline (First_Case_Item_Of);
379    --  Only valid for N_Case_Construction nodes
380
381    function First_Choice_Of
382      (Node  : Project_Node_Id)
383       return  Project_Node_Id;
384    pragma Inline (First_Choice_Of);
385    --  Return the first choice in a N_Case_Item, or Empty_Node if
386    --  this is when others.
387
388    function Next_Case_Item
389      (Node  : Project_Node_Id)
390       return  Project_Node_Id;
391    pragma Inline (Next_Case_Item);
392    --  Only valid for N_Case_Item nodes
393
394    function Case_Insensitive (Node : Project_Node_Id) return Boolean;
395    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference nodes
396
397    --------------------
398    -- Set Procedures --
399    --------------------
400
401    --  The following procedures are part of the abstract interface of
402    --  the Project File tree.
403
404    --  Each Set_* procedure is valid only for the same Project_Node_Kind
405    --  nodes as the corresponding query function above.
406
407    procedure Set_Name_Of
408      (Node : Project_Node_Id;
409       To   : Name_Id);
410    pragma Inline (Set_Name_Of);
411
412    procedure Set_Kind_Of
413      (Node : Project_Node_Id;
414       To   : Project_Node_Kind);
415    pragma Inline (Set_Kind_Of);
416
417    procedure Set_Location_Of
418      (Node : Project_Node_Id;
419       To   : Source_Ptr);
420    pragma Inline (Set_Location_Of);
421
422    procedure Set_Directory_Of
423      (Node : Project_Node_Id;
424       To   : Name_Id);
425    pragma Inline (Set_Directory_Of);
426
427    procedure Set_Expression_Kind_Of
428      (Node : Project_Node_Id;
429       To   : Variable_Kind);
430    pragma Inline (Set_Expression_Kind_Of);
431
432    procedure Set_Is_Extending_All (Node  : Project_Node_Id);
433    pragma Inline (Set_Is_Extending_All);
434
435    procedure Set_First_Variable_Of
436      (Node : Project_Node_Id;
437       To   : Variable_Node_Id);
438    pragma Inline (Set_First_Variable_Of);
439
440    procedure Set_First_Package_Of
441      (Node : Project_Node_Id;
442       To   : Package_Declaration_Id);
443    pragma Inline (Set_First_Package_Of);
444
445    procedure Set_Package_Id_Of
446      (Node : Project_Node_Id;
447       To   : Package_Node_Id);
448    pragma Inline (Set_Package_Id_Of);
449
450    procedure Set_Path_Name_Of
451      (Node : Project_Node_Id;
452       To   : Name_Id);
453    pragma Inline (Set_Path_Name_Of);
454
455    procedure Set_String_Value_Of
456      (Node : Project_Node_Id;
457       To   : Name_Id);
458    pragma Inline (Set_String_Value_Of);
459
460    procedure Set_First_With_Clause_Of
461      (Node : Project_Node_Id;
462       To   : Project_Node_Id);
463    pragma Inline (Set_First_With_Clause_Of);
464
465    procedure Set_Project_Declaration_Of
466      (Node : Project_Node_Id;
467       To   : Project_Node_Id);
468    pragma Inline (Set_Project_Declaration_Of);
469
470    procedure Set_Extending_Project_Of
471      (Node : Project_Node_Id;
472       To   : Project_Node_Id);
473    pragma Inline (Set_Extending_Project_Of);
474
475    procedure Set_First_String_Type_Of
476      (Node : Project_Node_Id;
477       To   : Project_Node_Id);
478    pragma Inline (Set_First_String_Type_Of);
479
480    procedure Set_Extended_Project_Path_Of
481      (Node : Project_Node_Id;
482       To   : Name_Id);
483    pragma Inline (Set_Extended_Project_Path_Of);
484
485    procedure Set_Project_Node_Of
486      (Node         : Project_Node_Id;
487       To           : Project_Node_Id;
488       Limited_With : Boolean := False);
489    pragma Inline (Set_Project_Node_Of);
490
491    procedure Set_Next_With_Clause_Of
492      (Node : Project_Node_Id;
493       To   : Project_Node_Id);
494    pragma Inline (Set_Next_With_Clause_Of);
495
496    procedure Set_First_Declarative_Item_Of
497      (Node : Project_Node_Id;
498       To   : Project_Node_Id);
499    pragma Inline (Set_First_Declarative_Item_Of);
500
501    procedure Set_Extended_Project_Of
502      (Node : Project_Node_Id;
503       To   : Project_Node_Id);
504    pragma Inline (Set_Extended_Project_Of);
505
506    procedure Set_Current_Item_Node
507      (Node : Project_Node_Id;
508       To   : Project_Node_Id);
509    pragma Inline (Set_Current_Item_Node);
510
511    procedure Set_Next_Declarative_Item
512      (Node : Project_Node_Id;
513       To   : Project_Node_Id);
514    pragma Inline (Set_Next_Declarative_Item);
515
516    procedure Set_Project_Of_Renamed_Package_Of
517      (Node : Project_Node_Id;
518       To   : Project_Node_Id);
519    pragma Inline (Set_Project_Of_Renamed_Package_Of);
520
521    procedure Set_Next_Package_In_Project
522      (Node : Project_Node_Id;
523       To   : Project_Node_Id);
524    pragma Inline (Set_Next_Package_In_Project);
525
526    procedure Set_First_Literal_String
527      (Node : Project_Node_Id;
528       To   : Project_Node_Id);
529    pragma Inline (Set_First_Literal_String);
530
531    procedure Set_Next_String_Type
532      (Node : Project_Node_Id;
533       To   : Project_Node_Id);
534    pragma Inline (Set_Next_String_Type);
535
536    procedure Set_Next_Literal_String
537      (Node : Project_Node_Id;
538       To   : Project_Node_Id);
539    pragma Inline (Set_Next_Literal_String);
540
541    procedure Set_Expression_Of
542      (Node : Project_Node_Id;
543       To   : Project_Node_Id);
544    pragma Inline (Set_Expression_Of);
545
546    procedure Set_Associative_Project_Of
547      (Node : Project_Node_Id;
548       To   : Project_Node_Id);
549    pragma Inline (Set_Associative_Project_Of);
550
551    procedure Set_Associative_Package_Of
552      (Node : Project_Node_Id;
553       To   : Project_Node_Id);
554    pragma Inline (Set_Associative_Package_Of);
555
556    procedure Set_Associative_Array_Index_Of
557      (Node : Project_Node_Id;
558       To   : Name_Id);
559    pragma Inline (Set_Associative_Array_Index_Of);
560
561    procedure Set_Next_Variable
562      (Node : Project_Node_Id;
563       To   : Project_Node_Id);
564    pragma Inline (Set_Next_Variable);
565
566    procedure Set_First_Term
567      (Node : Project_Node_Id;
568       To   : Project_Node_Id);
569    pragma Inline (Set_First_Term);
570
571    procedure Set_Next_Expression_In_List
572      (Node : Project_Node_Id;
573       To   : Project_Node_Id);
574    pragma Inline (Set_Next_Expression_In_List);
575
576    procedure Set_Current_Term
577      (Node : Project_Node_Id;
578       To   : Project_Node_Id);
579    pragma Inline (Set_Current_Term);
580
581    procedure Set_Next_Term
582      (Node : Project_Node_Id;
583       To   : Project_Node_Id);
584    pragma Inline (Set_Next_Term);
585
586    procedure Set_First_Expression_In_List
587      (Node : Project_Node_Id;
588       To   : Project_Node_Id);
589    pragma Inline (Set_First_Expression_In_List);
590
591    procedure Set_Package_Node_Of
592      (Node : Project_Node_Id;
593       To   : Project_Node_Id);
594    pragma Inline (Set_Package_Node_Of);
595
596    procedure Set_String_Type_Of
597      (Node : Project_Node_Id;
598       To   : Project_Node_Id);
599    pragma Inline (Set_String_Type_Of);
600
601    procedure Set_External_Reference_Of
602      (Node : Project_Node_Id;
603       To   : Project_Node_Id);
604    pragma Inline (Set_External_Reference_Of);
605
606    procedure Set_External_Default_Of
607      (Node : Project_Node_Id;
608       To   : Project_Node_Id);
609    pragma Inline (Set_External_Default_Of);
610
611    procedure Set_Case_Variable_Reference_Of
612      (Node : Project_Node_Id;
613       To   : Project_Node_Id);
614    pragma Inline (Set_Case_Variable_Reference_Of);
615
616    procedure Set_First_Case_Item_Of
617      (Node : Project_Node_Id;
618       To   : Project_Node_Id);
619    pragma Inline (Set_First_Case_Item_Of);
620
621    procedure Set_First_Choice_Of
622      (Node : Project_Node_Id;
623       To   : Project_Node_Id);
624    pragma Inline (Set_First_Choice_Of);
625
626    procedure Set_Next_Case_Item
627      (Node : Project_Node_Id;
628       To   : Project_Node_Id);
629    pragma Inline (Set_Next_Case_Item);
630
631    procedure Set_Case_Insensitive
632      (Node : Project_Node_Id;
633       To   : Boolean);
634
635    -------------------------------
636    -- Restricted Access Section --
637    -------------------------------
638
639    package Tree_Private_Part is
640
641       --  This is conceptually in the private part.
642       --  However, for efficiency, some packages are accessing it directly.
643
644       type Project_Node_Record is record
645
646          Kind : Project_Node_Kind;
647
648          Location : Source_Ptr := No_Location;
649
650          Directory : Name_Id       := No_Name;
651          --  Only for N_Project
652
653          Expr_Kind : Variable_Kind := Undefined;
654          --  See below for what Project_Node_Kind it is used
655
656          Variables : Variable_Node_Id := Empty_Node;
657          --  First variable in a project or a package
658
659          Packages : Package_Declaration_Id := Empty_Node;
660          --  First package declaration in a project
661
662          Pkg_Id : Package_Node_Id := Empty_Package;
663          --  Only used for N_Package_Declaration
664          --  The component Pkg_Id is an entry into the table Package_Attributes
665          --  (in Prj.Attr). It is used to indicate all the attributes of the
666          --  package with their characteristics.
667          --
668          --  The tables Prj.Attr.Attributes and Prj.Attr.Package_Attributes
669          --  are built once and for all through a call (from Prj.Initialize)
670          --  to procedure Prj.Attr.Initialize. It is never modified after that.
671
672          Name : Name_Id := No_Name;
673          --  See below for what Project_Node_Kind it is used
674
675          Path_Name : Name_Id := No_Name;
676          --  See below for what Project_Node_Kind it is used
677
678          Value : Name_Id := No_Name;
679          --  See below for what Project_Node_Kind it is used
680
681          Field1 : Project_Node_Id := Empty_Node;
682          --  See below the meaning for each Project_Node_Kind
683
684          Field2 : Project_Node_Id := Empty_Node;
685          --  See below the meaning for each Project_Node_Kind
686
687          Field3 : Project_Node_Id := Empty_Node;
688          --  See below the meaning for each Project_Node_Kind
689
690          Case_Insensitive : Boolean := False;
691          --  This flag is significant only for N_Attribute_Declaration and
692          --  N_Atribute_Reference. It indicates for an associative array
693          --  attribute, that the index is case insensitive.
694
695          Extending_All : Boolean := False;
696          --  This flag is significant only for N_Project. It indicates that
697          --  the project "extends all" another project.
698
699       end record;
700
701       --  type Project_Node_Kind is
702
703       --   (N_Project,
704       --    --  Name:      project name
705       --    --  Path_Name: project path name
706       --    --  Expr_Kind: Undefined
707       --    --  Field1:    first with clause
708       --    --  Field2:    project declaration
709       --    --  Field3:    first string type
710       --    --  Value:     extended project path name (if any)
711
712       --    N_With_Clause,
713       --    --  Name:      imported project name
714       --    --  Path_Name: imported project path name
715       --    --  Expr_Kind: Undefined
716       --    --  Field1:    project node
717       --    --  Field2:    next with clause
718       --    --  Field3:    project node or empty if "limited with"
719       --    --  Value:     literal string withed
720
721       --    N_Project_Declaration,
722       --    --  Name:      not used
723       --    --  Path_Name: not used
724       --    --  Expr_Kind: Undefined
725       --    --  Field1:    first declarative item
726       --    --  Field2:    extended project
727       --    --  Field3:    extending project
728       --    --  Value:     not used
729
730       --    N_Declarative_Item,
731       --    --  Name:      not used
732       --    --  Path_Name: not used
733       --    --  Expr_Kind: Undefined
734       --    --  Field1:    current item node
735       --    --  Field2:    next declarative item
736       --    --  Field3:    not used
737       --    --  Value:     not used
738
739       --    N_Package_Declaration,
740       --    --  Name:      package name
741       --    --  Path_Name: not used
742       --    --  Expr_Kind: Undefined
743       --    --  Field1:    project of renamed package (if any)
744       --    --  Field2:    first declarative item
745       --    --  Field3:    next package in project
746       --    --  Value:     not used
747
748       --    N_String_Type_Declaration,
749       --    --  Name:      type name
750       --    --  Path_Name: not used
751       --    --  Expr_Kind: Undefined
752       --    --  Field1:    first literal string
753       --    --  Field2:    next string type
754       --    --  Field3:    not used
755       --    --  Value:     not used
756
757       --    N_Literal_String,
758       --    --  Name:      not used
759       --    --  Path_Name: not used
760       --    --  Expr_Kind: Single
761       --    --  Field1:    next literal string
762       --    --  Field2:    not used
763       --    --  Field3:    not used
764       --    --  Value:     string value
765
766       --    N_Attribute_Declaration,
767       --    --  Name:      attribute name
768       --    --  Path_Name: not used
769       --    --  Expr_Kind: attribute kind
770       --    --  Field1:    expression
771       --    --  Field2:    project of full associative array
772       --    --  Field3:    package of full associative array
773       --    --  Value:     associative array index
774       --    --             (if an associative array element)
775
776       --    N_Typed_Variable_Declaration,
777       --    --  Name:      variable name
778       --    --  Path_Name: not used
779       --    --  Expr_Kind: Single
780       --    --  Field1:    expression
781       --    --  Field2:    type of variable (N_String_Type_Declaration)
782       --    --  Field3:    next variable
783       --    --  Value:     not used
784
785       --    N_Variable_Declaration,
786       --    --  Name:      variable name
787       --    --  Path_Name: not used
788       --    --  Expr_Kind: variable kind
789       --    --  Field1:    expression
790       --    --  Field2:    not used
791       --    --             Field3 is used for next variable, instead of Field2,
792       --    --             so that it is the same field for
793       --    --             N_Variable_Declaration and
794       --    --             N_Typed_Variable_Declaration
795       --    --  Field3:    next variable
796       --    --  Value:     not used
797
798       --    N_Expression,
799       --    --  Name:      not used
800       --    --  Path_Name: not used
801       --    --  Expr_Kind: expression kind
802       --    --  Field1:    first term
803       --    --  Field2:    next expression in list
804       --    --  Field3:    not used
805       --    --  Value:     not used
806
807       --    N_Term,
808       --    --  Name:      not used
809       --    --  Path_Name: not used
810       --    --  Expr_Kind: term kind
811       --    --  Field1:    current term
812       --    --  Field2:    next term in the expression
813       --    --  Field3:    not used
814       --    --  Value:     not used
815
816       --    N_Literal_String_List,
817       --    --  Designates a list of string expressions between brackets
818       --    --  separated by commas. The string expressions are not necessarily
819       --    --  literal strings.
820       --    --  Name:      not used
821       --    --  Path_Name: not used
822       --    --  Expr_Kind: List
823       --    --  Field1:    first expression
824       --    --  Field2:    not used
825       --    --  Field3:    not used
826       --    --  Value:     not used
827
828       --    N_Variable_Reference,
829       --    --  Name:      variable name
830       --    --  Path_Name: not used
831       --    --  Expr_Kind: variable kind
832       --    --  Field1:    project (if specified)
833       --    --  Field2:    package (if specified)
834       --    --  Field3:    type of variable (N_String_Type_Declaration), if any
835       --    --  Value:     not used
836
837       --    N_External_Value,
838       --    --  Name:      not used
839       --    --  Path_Name: not used
840       --    --  Expr_Kind: Single
841       --    --  Field1:    Name of the external reference (literal string)
842       --    --  Field2:    Default (literal string)
843       --    --  Field3:    not used
844       --    --  Value:     not used
845
846       --    N_Attribute_Reference,
847       --    --  Name:      attribute name
848       --    --  Path_Name: not used
849       --    --  Expr_Kind: attribute kind
850       --    --  Field1:    project
851       --    --  Field2:    package (if attribute of a package)
852       --    --  Field3:    not used
853       --    --  Value:     associative array index
854       --    --             (if an associative array element)
855
856       --    N_Case_Construction,
857       --    --  Name:      not used
858       --    --  Path_Name: not used
859       --    --  Expr_Kind: Undefined
860       --    --  Field1:    case variable reference
861       --    --  Field2:    first case item
862       --    --  Field3:    not used
863       --    --  Value:     not used
864
865       --    N_Case_Item);
866       --    --  Name:      not used
867       --    --  Path_Name: not used
868       --    --  Expr_Kind: not used
869       --    --  Field1:    first choice (literal string), or Empty_Node
870       --    --             for when others
871       --    --  Field2:    first declarative item
872       --    --  Field3:    next case item
873       --    --  Value:     not used
874
875       package Project_Nodes is
876          new Table.Table (Table_Component_Type => Project_Node_Record,
877                           Table_Index_Type     => Project_Node_Id,
878                           Table_Low_Bound      => First_Node_Id,
879                           Table_Initial        => Project_Nodes_Initial,
880                           Table_Increment      => Project_Nodes_Increment,
881                           Table_Name           => "Project_Nodes");
882       --  This table contains the syntactic tree of project data
883       --  from project files.
884
885       type Project_Name_And_Node is record
886          Name : Name_Id;
887          --  Name of the project
888
889          Node : Project_Node_Id;
890          --  Node of the project in table Project_Nodes
891
892          Extended : Boolean;
893          --  True when the project is being extended by another project
894       end record;
895
896       No_Project_Name_And_Node : constant Project_Name_And_Node :=
897         (Name => No_Name, Node => Empty_Node, Extended => True);
898
899       package Projects_Htable is new GNAT.HTable.Simple_HTable
900         (Header_Num => Header_Num,
901          Element    => Project_Name_And_Node,
902          No_Element => No_Project_Name_And_Node,
903          Key        => Name_Id,
904          Hash       => Hash,
905          Equal      => "=");
906       --  This hash table contains a mapping of project names to project nodes.
907       --  Note that this hash table contains only the nodes whose Kind is
908       --  N_Project. It is used to find the node of a project from its
909       --  name, and to verify if a project has already been parsed, knowing
910       --  its name.
911
912    end Tree_Private_Part;
913
914 end Prj.Tree;