OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [gcc-4.5.1/] [gcc-4.5.1-or32-1.0rc2/] [gcc/] [ada/] [prj-tree.ads] - Blame information for rev 384

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.