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