1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 2001-2014, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 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. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 -- This package defines the structure of the Project File tree
28 with GNAT
.Dynamic_HTables
;
29 with GNAT
.Dynamic_Tables
;
33 with Prj
.Attr
; use Prj
.Attr
;
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
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).
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
121 N_Project_Declaration
,
123 N_Package_Declaration
,
124 N_String_Type_Declaration
,
126 N_Attribute_Declaration
,
127 N_Typed_Variable_Declaration
,
128 N_Variable_Declaration
,
131 N_Literal_String_List
,
132 N_Variable_Reference
,
134 N_Attribute_Reference
,
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;
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.
177 type Comment_State
is private;
178 -- A type to store the values of several global variables related to
181 procedure Save
(S
: out Comment_State
);
182 -- Save in variable S the comment state. Called before scanning a new
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
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
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;
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,
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.
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
272 function Display_Name_Of
273 (Node
: Project_Node_Id
;
274 In_Tree
: Project_Node_Tree_Ref
) return Name_Id
;
275 pragma Inline
(Display_Name_Of
);
276 -- Valid only for N_Project node. Returns the display name of the project.
279 (Node
: Project_Node_Id
;
280 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Kind
;
281 pragma Inline
(Kind_Of
);
282 -- Valid for all non empty nodes
285 (Node
: Project_Node_Id
;
286 In_Tree
: Project_Node_Tree_Ref
) return Source_Ptr
;
287 pragma Inline
(Location_Of
);
288 -- Valid for all non empty nodes
290 function First_Comment_After
291 (Node
: Project_Node_Id
;
292 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
293 -- Valid only for N_Comment_Zones nodes
295 function First_Comment_After_End
296 (Node
: Project_Node_Id
;
297 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
298 -- Valid only for N_Comment_Zones nodes
300 function First_Comment_Before
301 (Node
: Project_Node_Id
;
302 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
303 -- Valid only for N_Comment_Zones nodes
305 function First_Comment_Before_End
306 (Node
: Project_Node_Id
;
307 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
308 -- Valid only for N_Comment_Zones nodes
310 function Next_Comment
311 (Node
: Project_Node_Id
;
312 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
313 -- Valid only for N_Comment nodes
315 function End_Of_Line_Comment
316 (Node
: Project_Node_Id
;
317 In_Tree
: Project_Node_Tree_Ref
) return Name_Id
;
318 -- Valid only for non empty nodes
320 function Follows_Empty_Line
321 (Node
: Project_Node_Id
;
322 In_Tree
: Project_Node_Tree_Ref
) return Boolean;
323 -- Valid only for N_Comment nodes
325 function Is_Followed_By_Empty_Line
326 (Node
: Project_Node_Id
;
327 In_Tree
: Project_Node_Tree_Ref
) return Boolean;
328 -- Valid only for N_Comment nodes
330 function Parent_Project_Of
331 (Node
: Project_Node_Id
;
332 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
333 pragma Inline
(Parent_Project_Of
);
334 -- Valid only for N_Project nodes
336 function Project_File_Includes_Unkept_Comments
337 (Node
: Project_Node_Id
;
338 In_Tree
: Project_Node_Tree_Ref
) return Boolean;
339 -- Valid only for N_Project nodes
341 function Directory_Of
342 (Node
: Project_Node_Id
;
343 In_Tree
: Project_Node_Tree_Ref
) return Path_Name_Type
;
344 pragma Inline
(Directory_Of
);
345 -- Returns the directory that contains the project file. This always ends
346 -- with a directory separator. Only valid for N_Project nodes.
348 function Expression_Kind_Of
349 (Node
: Project_Node_Id
;
350 In_Tree
: Project_Node_Tree_Ref
) return Variable_Kind
;
351 pragma Inline
(Expression_Kind_Of
);
352 -- Only valid for N_Literal_String, N_Attribute_Declaration,
353 -- N_Variable_Declaration, N_Typed_Variable_Declaration, N_Expression,
354 -- N_Term, N_Variable_Reference, N_Attribute_Reference nodes or
357 function Is_Extending_All
358 (Node
: Project_Node_Id
;
359 In_Tree
: Project_Node_Tree_Ref
) return Boolean;
360 pragma Inline
(Is_Extending_All
);
361 -- Only valid for N_Project and N_With_Clause
363 function Is_Not_Last_In_List
364 (Node
: Project_Node_Id
;
365 In_Tree
: Project_Node_Tree_Ref
) return Boolean;
366 pragma Inline
(Is_Not_Last_In_List
);
367 -- Only valid for N_With_Clause
369 function First_Variable_Of
370 (Node
: Project_Node_Id
;
371 In_Tree
: Project_Node_Tree_Ref
) return Variable_Node_Id
;
372 pragma Inline
(First_Variable_Of
);
373 -- Only valid for N_Project or N_Package_Declaration nodes
375 function First_Package_Of
376 (Node
: Project_Node_Id
;
377 In_Tree
: Project_Node_Tree_Ref
) return Package_Declaration_Id
;
378 pragma Inline
(First_Package_Of
);
379 -- Only valid for N_Project nodes
381 function Package_Id_Of
382 (Node
: Project_Node_Id
;
383 In_Tree
: Project_Node_Tree_Ref
) return Package_Node_Id
;
384 pragma Inline
(Package_Id_Of
);
385 -- Only valid for N_Package_Declaration nodes
387 function Path_Name_Of
388 (Node
: Project_Node_Id
;
389 In_Tree
: Project_Node_Tree_Ref
) return Path_Name_Type
;
390 pragma Inline
(Path_Name_Of
);
391 -- Only valid for N_Project and N_With_Clause nodes
393 function String_Value_Of
394 (Node
: Project_Node_Id
;
395 In_Tree
: Project_Node_Tree_Ref
) return Name_Id
;
396 pragma Inline
(String_Value_Of
);
397 -- Only valid for N_With_Clause, N_Literal_String nodes or N_Comment.
398 -- For a N_With_Clause created automatically for a virtual extending
399 -- project, No_Name is returned.
401 function Source_Index_Of
402 (Node
: Project_Node_Id
;
403 In_Tree
: Project_Node_Tree_Ref
) return Int
;
404 pragma Inline
(Source_Index_Of
);
405 -- Only valid for N_Literal_String and N_Attribute_Declaration nodes
407 function First_With_Clause_Of
408 (Node
: Project_Node_Id
;
409 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
410 pragma Inline
(First_With_Clause_Of
);
411 -- Only valid for N_Project nodes
413 function Project_Declaration_Of
414 (Node
: Project_Node_Id
;
415 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
416 pragma Inline
(Project_Declaration_Of
);
417 -- Only valid for N_Project nodes
419 function Project_Qualifier_Of
420 (Node
: Project_Node_Id
;
421 In_Tree
: Project_Node_Tree_Ref
) return Project_Qualifier
;
422 pragma Inline
(Project_Qualifier_Of
);
423 -- Only valid for N_Project nodes
425 function Extending_Project_Of
426 (Node
: Project_Node_Id
;
427 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
428 pragma Inline
(Extending_Project_Of
);
429 -- Only valid for N_Project_Declaration nodes
431 function First_String_Type_Of
432 (Node
: Project_Node_Id
;
433 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
434 pragma Inline
(First_String_Type_Of
);
435 -- Only valid for N_Project nodes
437 function Extended_Project_Path_Of
438 (Node
: Project_Node_Id
;
439 In_Tree
: Project_Node_Tree_Ref
) return Path_Name_Type
;
440 pragma Inline
(Extended_Project_Path_Of
);
441 -- Only valid for N_With_Clause nodes
443 function Project_Node_Of
444 (Node
: Project_Node_Id
;
445 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
446 pragma Inline
(Project_Node_Of
);
447 -- Only valid for N_With_Clause, N_Variable_Reference and
448 -- N_Attribute_Reference nodes.
450 function Non_Limited_Project_Node_Of
451 (Node
: Project_Node_Id
;
452 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
453 pragma Inline
(Non_Limited_Project_Node_Of
);
454 -- Only valid for N_With_Clause nodes. Returns Empty_Node for limited
455 -- imported project files, otherwise returns the same result as
458 function Next_With_Clause_Of
459 (Node
: Project_Node_Id
;
460 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
461 pragma Inline
(Next_With_Clause_Of
);
462 -- Only valid for N_With_Clause nodes
464 function First_Declarative_Item_Of
465 (Node
: Project_Node_Id
;
466 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
467 pragma Inline
(First_Declarative_Item_Of
);
468 -- Only valid for N_Project_Declaration, N_Case_Item and
469 -- N_Package_Declaration.
471 function Extended_Project_Of
472 (Node
: Project_Node_Id
;
473 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
474 pragma Inline
(Extended_Project_Of
);
475 -- Only valid for N_Project_Declaration nodes
477 function Current_Item_Node
478 (Node
: Project_Node_Id
;
479 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
480 pragma Inline
(Current_Item_Node
);
481 -- Only valid for N_Declarative_Item nodes
483 function Next_Declarative_Item
484 (Node
: Project_Node_Id
;
485 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
486 pragma Inline
(Next_Declarative_Item
);
487 -- Only valid for N_Declarative_Item node
489 function Project_Of_Renamed_Package_Of
490 (Node
: Project_Node_Id
;
491 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
492 pragma Inline
(Project_Of_Renamed_Package_Of
);
493 -- Only valid for N_Package_Declaration nodes. May return Empty_Node.
495 function Next_Package_In_Project
496 (Node
: Project_Node_Id
;
497 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
498 pragma Inline
(Next_Package_In_Project
);
499 -- Only valid for N_Package_Declaration nodes
501 function First_Literal_String
502 (Node
: Project_Node_Id
;
503 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
504 pragma Inline
(First_Literal_String
);
505 -- Only valid for N_String_Type_Declaration nodes
507 function Next_String_Type
508 (Node
: Project_Node_Id
;
509 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
510 pragma Inline
(Next_String_Type
);
511 -- Only valid for N_String_Type_Declaration nodes
513 function Next_Literal_String
514 (Node
: Project_Node_Id
;
515 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
516 pragma Inline
(Next_Literal_String
);
517 -- Only valid for N_Literal_String nodes
519 function Expression_Of
520 (Node
: Project_Node_Id
;
521 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
522 pragma Inline
(Expression_Of
);
523 -- Only valid for N_Attribute_Declaration, N_Typed_Variable_Declaration
524 -- or N_Variable_Declaration nodes
526 function Associative_Project_Of
527 (Node
: Project_Node_Id
;
528 In_Tree
: Project_Node_Tree_Ref
)
529 return Project_Node_Id
;
530 pragma Inline
(Associative_Project_Of
);
531 -- Only valid for N_Attribute_Declaration nodes
533 function Associative_Package_Of
534 (Node
: Project_Node_Id
;
535 In_Tree
: Project_Node_Tree_Ref
)
536 return Project_Node_Id
;
537 pragma Inline
(Associative_Package_Of
);
538 -- Only valid for N_Attribute_Declaration nodes
540 function Value_Is_Valid
541 (For_Typed_Variable
: Project_Node_Id
;
542 In_Tree
: Project_Node_Tree_Ref
;
543 Value
: Name_Id
) return Boolean;
544 pragma Inline
(Value_Is_Valid
);
545 -- Only valid for N_Typed_Variable_Declaration. Returns True if Value is
546 -- in the list of allowed strings for For_Typed_Variable. False otherwise.
548 function Associative_Array_Index_Of
549 (Node
: Project_Node_Id
;
550 In_Tree
: Project_Node_Tree_Ref
) return Name_Id
;
551 pragma Inline
(Associative_Array_Index_Of
);
552 -- Only valid for N_Attribute_Declaration and N_Attribute_Reference.
553 -- Returns No_Name for non associative array attributes.
555 function Next_Variable
556 (Node
: Project_Node_Id
;
557 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
558 pragma Inline
(Next_Variable
);
559 -- Only valid for N_Typed_Variable_Declaration or N_Variable_Declaration
563 (Node
: Project_Node_Id
;
564 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
565 pragma Inline
(First_Term
);
566 -- Only valid for N_Expression nodes
568 function Next_Expression_In_List
569 (Node
: Project_Node_Id
;
570 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
571 pragma Inline
(Next_Expression_In_List
);
572 -- Only valid for N_Expression nodes
574 function Current_Term
575 (Node
: Project_Node_Id
;
576 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
577 pragma Inline
(Current_Term
);
578 -- Only valid for N_Term nodes
581 (Node
: Project_Node_Id
;
582 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
583 pragma Inline
(Next_Term
);
584 -- Only valid for N_Term nodes
586 function First_Expression_In_List
587 (Node
: Project_Node_Id
;
588 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
589 pragma Inline
(First_Expression_In_List
);
590 -- Only valid for N_Literal_String_List nodes
592 function Package_Node_Of
593 (Node
: Project_Node_Id
;
594 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
595 pragma Inline
(Package_Node_Of
);
596 -- Only valid for N_Variable_Reference or N_Attribute_Reference nodes.
597 -- May return Empty_Node.
600 (Node
: Project_Node_Id
;
601 In_Tree
: Project_Node_Tree_Ref
) return Attribute_Default_Value
;
602 pragma Inline
(Default_Of
);
603 -- Only valid for N_Attribute_Reference nodes
605 function String_Type_Of
606 (Node
: Project_Node_Id
;
607 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
608 pragma Inline
(String_Type_Of
);
609 -- Only valid for N_Variable_Reference or N_Typed_Variable_Declaration
612 function External_Reference_Of
613 (Node
: Project_Node_Id
;
614 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
615 pragma Inline
(External_Reference_Of
);
616 -- Only valid for N_External_Value nodes
618 function External_Default_Of
619 (Node
: Project_Node_Id
;
620 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
621 pragma Inline
(External_Default_Of
);
622 -- Only valid for N_External_Value nodes
624 function Case_Variable_Reference_Of
625 (Node
: Project_Node_Id
;
626 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
627 pragma Inline
(Case_Variable_Reference_Of
);
628 -- Only valid for N_Case_Construction nodes
630 function First_Case_Item_Of
631 (Node
: Project_Node_Id
;
632 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
633 pragma Inline
(First_Case_Item_Of
);
634 -- Only valid for N_Case_Construction nodes
636 function First_Choice_Of
637 (Node
: Project_Node_Id
;
638 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
639 pragma Inline
(First_Choice_Of
);
640 -- Only valid for N_Case_Item nodes. Return the first choice in a
641 -- N_Case_Item, or Empty_Node if this is when others.
643 function Next_Case_Item
644 (Node
: Project_Node_Id
;
645 In_Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
646 pragma Inline
(Next_Case_Item
);
647 -- Only valid for N_Case_Item nodes
649 function Case_Insensitive
650 (Node
: Project_Node_Id
;
651 In_Tree
: Project_Node_Tree_Ref
) return Boolean;
652 -- Only valid for N_Attribute_Declaration and N_Attribute_Reference nodes
654 -----------------------
655 -- Create procedures --
656 -----------------------
657 -- The following procedures are used to edit a project file tree. They are
658 -- slightly higher-level than the Set_* procedures below
660 function Create_Project
661 (In_Tree
: Project_Node_Tree_Ref
;
663 Full_Path
: Path_Name_Type
;
664 Is_Config_File
: Boolean := False) return Project_Node_Id
;
665 -- Create a new node for a project and register it in the tree so that it
666 -- can be retrieved later on.
668 function Create_Package
669 (Tree
: Project_Node_Tree_Ref
;
670 Project
: Project_Node_Id
;
671 Pkg
: String) return Project_Node_Id
;
672 -- Create a new package in Project. If the package already exists, it is
673 -- returned. The name of the package *must* be lower-cases, or none of its
674 -- attributes will be recognized.
676 function Create_Attribute
677 (Tree
: Project_Node_Tree_Ref
;
678 Prj_Or_Pkg
: Project_Node_Id
;
680 Index_Name
: Name_Id
:= No_Name
;
681 Kind
: Variable_Kind
:= List
;
682 At_Index
: Integer := 0;
683 Value
: Project_Node_Id
:= Empty_Node
) return Project_Node_Id
;
684 -- Create a new attribute. The new declaration is added at the end of the
685 -- declarative item list for Prj_Or_Pkg (a project or a package), but
686 -- before any package declaration). No addition is done if Prj_Or_Pkg is
687 -- Empty_Node. If Index_Name is not "", then if creates an attribute value
688 -- for a specific index. At_Index is used for the " at <idx>" in the naming
691 -- To set the value of the attribute, either provide a value for Value, or
692 -- use Set_Expression_Of to set the value of the attribute (in which case
693 -- Enclose_In_Expression might be useful). The former is recommended since
694 -- it will more correctly handle cases where the index needs to be set on
695 -- the expression rather than on the index of the attribute (i.e. 'for
696 -- Specification ("unit") use "file" at 3', versus 'for Executable ("file"
697 -- at 3) use "name"'). Value must be a N_String_Literal if an index will be
700 function Create_Literal_String
701 (Str
: Namet
.Name_Id
;
702 Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
703 -- Create a literal string whose value is Str
706 (Tree
: Project_Node_Tree_Ref
;
707 Parent
: Project_Node_Id
;
708 Expr
: Project_Node_Id
;
709 Add_Before_First_Pkg
: Boolean := False;
710 Add_Before_First_Case
: Boolean := False);
711 -- Add a new declarative item in the list in Parent. This new declarative
712 -- item will contain Expr (unless Expr is already a declarative item, in
713 -- which case it is added directly to the list). The new item is inserted
714 -- at the end of the list, unless Add_Before_First_Pkg is True. In the
715 -- latter case, it is added just before the first case construction is
716 -- seen, or before the first package (this assumes that all packages are
717 -- found at the end of the project, which isn't true in the general case
718 -- unless you have normalized the project to match this description).
720 function Enclose_In_Expression
721 (Node
: Project_Node_Id
;
722 Tree
: Project_Node_Tree_Ref
) return Project_Node_Id
;
723 -- Enclose the Node inside a N_Expression node, and return this expression.
724 -- This does nothing if Node is already a N_Expression.
730 -- The following procedures are part of the abstract interface of the
731 -- Project File tree.
733 -- Foe each Set_* procedure the condition of validity is specified. If an
734 -- access function is called with invalid arguments, then exception
735 -- Assertion_Error is raised if assertions are enabled, otherwise the
736 -- behaviour is not defined and may result in a crash.
738 -- These are very low-level, and manipulate the tree itself directly. You
739 -- should look at the Create_* procedure instead if you want to use higher
742 procedure Set_Name_Of
743 (Node
: Project_Node_Id
;
744 In_Tree
: Project_Node_Tree_Ref
;
746 pragma Inline
(Set_Name_Of
);
747 -- Valid for all non empty nodes
749 procedure Set_Display_Name_Of
750 (Node
: Project_Node_Id
;
751 In_Tree
: Project_Node_Tree_Ref
;
753 pragma Inline
(Set_Display_Name_Of
);
754 -- Valid only for N_Project nodes
756 procedure Set_Kind_Of
757 (Node
: Project_Node_Id
;
758 In_Tree
: Project_Node_Tree_Ref
;
759 To
: Project_Node_Kind
);
760 pragma Inline
(Set_Kind_Of
);
761 -- Valid for all non empty nodes
763 procedure Set_Location_Of
764 (Node
: Project_Node_Id
;
765 In_Tree
: Project_Node_Tree_Ref
;
767 pragma Inline
(Set_Location_Of
);
768 -- Valid for all non empty nodes
770 procedure Set_First_Comment_After
771 (Node
: Project_Node_Id
;
772 In_Tree
: Project_Node_Tree_Ref
;
773 To
: Project_Node_Id
);
774 pragma Inline
(Set_First_Comment_After
);
775 -- Valid only for N_Comment_Zones nodes
777 procedure Set_First_Comment_After_End
778 (Node
: Project_Node_Id
;
779 In_Tree
: Project_Node_Tree_Ref
;
780 To
: Project_Node_Id
);
781 pragma Inline
(Set_First_Comment_After_End
);
782 -- Valid only for N_Comment_Zones nodes
784 procedure Set_First_Comment_Before
785 (Node
: Project_Node_Id
;
786 In_Tree
: Project_Node_Tree_Ref
;
787 To
: Project_Node_Id
);
788 pragma Inline
(Set_First_Comment_Before
);
789 -- Valid only for N_Comment_Zones nodes
791 procedure Set_First_Comment_Before_End
792 (Node
: Project_Node_Id
;
793 In_Tree
: Project_Node_Tree_Ref
;
794 To
: Project_Node_Id
);
795 pragma Inline
(Set_First_Comment_Before_End
);
796 -- Valid only for N_Comment_Zones nodes
798 procedure Set_Next_Comment
799 (Node
: Project_Node_Id
;
800 In_Tree
: Project_Node_Tree_Ref
;
801 To
: Project_Node_Id
);
802 pragma Inline
(Set_Next_Comment
);
803 -- Valid only for N_Comment nodes
805 procedure Set_Parent_Project_Of
806 (Node
: Project_Node_Id
;
807 In_Tree
: Project_Node_Tree_Ref
;
808 To
: Project_Node_Id
);
809 -- Valid only for N_Project nodes
811 procedure Set_Project_File_Includes_Unkept_Comments
812 (Node
: Project_Node_Id
;
813 In_Tree
: Project_Node_Tree_Ref
;
815 -- Valid only for N_Project nodes
817 procedure Set_Directory_Of
818 (Node
: Project_Node_Id
;
819 In_Tree
: Project_Node_Tree_Ref
;
820 To
: Path_Name_Type
);
821 pragma Inline
(Set_Directory_Of
);
822 -- Valid only for N_Project nodes
824 procedure Set_Expression_Kind_Of
825 (Node
: Project_Node_Id
;
826 In_Tree
: Project_Node_Tree_Ref
;
828 pragma Inline
(Set_Expression_Kind_Of
);
829 -- Only valid for N_Literal_String, N_Attribute_Declaration,
830 -- N_Variable_Declaration, N_Typed_Variable_Declaration, N_Expression,
831 -- N_Term, N_Variable_Reference, N_Attribute_Reference or N_External_Value
834 procedure Set_Is_Extending_All
835 (Node
: Project_Node_Id
;
836 In_Tree
: Project_Node_Tree_Ref
);
837 pragma Inline
(Set_Is_Extending_All
);
838 -- Only valid for N_Project and N_With_Clause
840 procedure Set_Is_Not_Last_In_List
841 (Node
: Project_Node_Id
;
842 In_Tree
: Project_Node_Tree_Ref
);
843 pragma Inline
(Set_Is_Not_Last_In_List
);
844 -- Only valid for N_With_Clause
846 procedure Set_First_Variable_Of
847 (Node
: Project_Node_Id
;
848 In_Tree
: Project_Node_Tree_Ref
;
849 To
: Variable_Node_Id
);
850 pragma Inline
(Set_First_Variable_Of
);
851 -- Only valid for N_Project or N_Package_Declaration nodes
853 procedure Set_First_Package_Of
854 (Node
: Project_Node_Id
;
855 In_Tree
: Project_Node_Tree_Ref
;
856 To
: Package_Declaration_Id
);
857 pragma Inline
(Set_First_Package_Of
);
858 -- Only valid for N_Project nodes
860 procedure Set_Package_Id_Of
861 (Node
: Project_Node_Id
;
862 In_Tree
: Project_Node_Tree_Ref
;
863 To
: Package_Node_Id
);
864 pragma Inline
(Set_Package_Id_Of
);
865 -- Only valid for N_Package_Declaration nodes
867 procedure Set_Path_Name_Of
868 (Node
: Project_Node_Id
;
869 In_Tree
: Project_Node_Tree_Ref
;
870 To
: Path_Name_Type
);
871 pragma Inline
(Set_Path_Name_Of
);
872 -- Only valid for N_Project and N_With_Clause nodes
874 procedure Set_String_Value_Of
875 (Node
: Project_Node_Id
;
876 In_Tree
: Project_Node_Tree_Ref
;
878 pragma Inline
(Set_String_Value_Of
);
879 -- Only valid for N_With_Clause, N_Literal_String nodes or N_Comment.
881 procedure Set_Source_Index_Of
882 (Node
: Project_Node_Id
;
883 In_Tree
: Project_Node_Tree_Ref
;
885 pragma Inline
(Set_Source_Index_Of
);
886 -- Only valid for N_Literal_String and N_Attribute_Declaration nodes. For
887 -- N_Literal_String, set the source index of the literal string. For
888 -- N_Attribute_Declaration, set the source index of the index of the
889 -- associative array element.
891 procedure Set_First_With_Clause_Of
892 (Node
: Project_Node_Id
;
893 In_Tree
: Project_Node_Tree_Ref
;
894 To
: Project_Node_Id
);
895 pragma Inline
(Set_First_With_Clause_Of
);
896 -- Only valid for N_Project nodes
898 procedure Set_Project_Declaration_Of
899 (Node
: Project_Node_Id
;
900 In_Tree
: Project_Node_Tree_Ref
;
901 To
: Project_Node_Id
);
902 pragma Inline
(Set_Project_Declaration_Of
);
903 -- Only valid for N_Project nodes
905 procedure Set_Project_Qualifier_Of
906 (Node
: Project_Node_Id
;
907 In_Tree
: Project_Node_Tree_Ref
;
908 To
: Project_Qualifier
);
909 pragma Inline
(Set_Project_Qualifier_Of
);
910 -- Only valid for N_Project nodes
912 procedure Set_Extending_Project_Of
913 (Node
: Project_Node_Id
;
914 In_Tree
: Project_Node_Tree_Ref
;
915 To
: Project_Node_Id
);
916 pragma Inline
(Set_Extending_Project_Of
);
917 -- Only valid for N_Project_Declaration nodes
919 procedure Set_First_String_Type_Of
920 (Node
: Project_Node_Id
;
921 In_Tree
: Project_Node_Tree_Ref
;
922 To
: Project_Node_Id
);
923 pragma Inline
(Set_First_String_Type_Of
);
924 -- Only valid for N_Project nodes
926 procedure Set_Extended_Project_Path_Of
927 (Node
: Project_Node_Id
;
928 In_Tree
: Project_Node_Tree_Ref
;
929 To
: Path_Name_Type
);
930 pragma Inline
(Set_Extended_Project_Path_Of
);
931 -- Only valid for N_With_Clause nodes
933 procedure Set_Project_Node_Of
934 (Node
: Project_Node_Id
;
935 In_Tree
: Project_Node_Tree_Ref
;
936 To
: Project_Node_Id
;
937 Limited_With
: Boolean := False);
938 pragma Inline
(Set_Project_Node_Of
);
939 -- Only valid for N_With_Clause, N_Variable_Reference and
940 -- N_Attribute_Reference nodes.
942 procedure Set_Next_With_Clause_Of
943 (Node
: Project_Node_Id
;
944 In_Tree
: Project_Node_Tree_Ref
;
945 To
: Project_Node_Id
);
946 pragma Inline
(Set_Next_With_Clause_Of
);
947 -- Only valid for N_With_Clause nodes
949 procedure Set_First_Declarative_Item_Of
950 (Node
: Project_Node_Id
;
951 In_Tree
: Project_Node_Tree_Ref
;
952 To
: Project_Node_Id
);
953 pragma Inline
(Set_First_Declarative_Item_Of
);
954 -- Only valid for N_Project_Declaration, N_Case_Item and
955 -- N_Package_Declaration.
957 procedure Set_Extended_Project_Of
958 (Node
: Project_Node_Id
;
959 In_Tree
: Project_Node_Tree_Ref
;
960 To
: Project_Node_Id
);
961 pragma Inline
(Set_Extended_Project_Of
);
962 -- Only valid for N_Project_Declaration nodes
964 procedure Set_Current_Item_Node
965 (Node
: Project_Node_Id
;
966 In_Tree
: Project_Node_Tree_Ref
;
967 To
: Project_Node_Id
);
968 pragma Inline
(Set_Current_Item_Node
);
969 -- Only valid for N_Declarative_Item nodes
971 procedure Set_Next_Declarative_Item
972 (Node
: Project_Node_Id
;
973 In_Tree
: Project_Node_Tree_Ref
;
974 To
: Project_Node_Id
);
975 pragma Inline
(Set_Next_Declarative_Item
);
976 -- Only valid for N_Declarative_Item node
978 procedure Set_Project_Of_Renamed_Package_Of
979 (Node
: Project_Node_Id
;
980 In_Tree
: Project_Node_Tree_Ref
;
981 To
: Project_Node_Id
);
982 pragma Inline
(Set_Project_Of_Renamed_Package_Of
);
983 -- Only valid for N_Package_Declaration nodes.
985 procedure Set_Next_Package_In_Project
986 (Node
: Project_Node_Id
;
987 In_Tree
: Project_Node_Tree_Ref
;
988 To
: Project_Node_Id
);
989 pragma Inline
(Set_Next_Package_In_Project
);
990 -- Only valid for N_Package_Declaration nodes
992 procedure Set_First_Literal_String
993 (Node
: Project_Node_Id
;
994 In_Tree
: Project_Node_Tree_Ref
;
995 To
: Project_Node_Id
);
996 pragma Inline
(Set_First_Literal_String
);
997 -- Only valid for N_String_Type_Declaration nodes
999 procedure Set_Next_String_Type
1000 (Node
: Project_Node_Id
;
1001 In_Tree
: Project_Node_Tree_Ref
;
1002 To
: Project_Node_Id
);
1003 pragma Inline
(Set_Next_String_Type
);
1004 -- Only valid for N_String_Type_Declaration nodes
1006 procedure Set_Next_Literal_String
1007 (Node
: Project_Node_Id
;
1008 In_Tree
: Project_Node_Tree_Ref
;
1009 To
: Project_Node_Id
);
1010 pragma Inline
(Set_Next_Literal_String
);
1011 -- Only valid for N_Literal_String nodes
1013 procedure Set_Expression_Of
1014 (Node
: Project_Node_Id
;
1015 In_Tree
: Project_Node_Tree_Ref
;
1016 To
: Project_Node_Id
);
1017 pragma Inline
(Set_Expression_Of
);
1018 -- Only valid for N_Attribute_Declaration, N_Typed_Variable_Declaration
1019 -- or N_Variable_Declaration nodes
1021 procedure Set_Associative_Project_Of
1022 (Node
: Project_Node_Id
;
1023 In_Tree
: Project_Node_Tree_Ref
;
1024 To
: Project_Node_Id
);
1025 pragma Inline
(Set_Associative_Project_Of
);
1026 -- Only valid for N_Attribute_Declaration nodes
1028 procedure Set_Associative_Package_Of
1029 (Node
: Project_Node_Id
;
1030 In_Tree
: Project_Node_Tree_Ref
;
1031 To
: Project_Node_Id
);
1032 pragma Inline
(Set_Associative_Package_Of
);
1033 -- Only valid for N_Attribute_Declaration nodes
1035 procedure Set_Associative_Array_Index_Of
1036 (Node
: Project_Node_Id
;
1037 In_Tree
: Project_Node_Tree_Ref
;
1039 pragma Inline
(Set_Associative_Array_Index_Of
);
1040 -- Only valid for N_Attribute_Declaration and N_Attribute_Reference.
1042 procedure Set_Next_Variable
1043 (Node
: Project_Node_Id
;
1044 In_Tree
: Project_Node_Tree_Ref
;
1045 To
: Project_Node_Id
);
1046 pragma Inline
(Set_Next_Variable
);
1047 -- Only valid for N_Typed_Variable_Declaration or N_Variable_Declaration
1050 procedure Set_First_Term
1051 (Node
: Project_Node_Id
;
1052 In_Tree
: Project_Node_Tree_Ref
;
1053 To
: Project_Node_Id
);
1054 pragma Inline
(Set_First_Term
);
1055 -- Only valid for N_Expression nodes
1057 procedure Set_Next_Expression_In_List
1058 (Node
: Project_Node_Id
;
1059 In_Tree
: Project_Node_Tree_Ref
;
1060 To
: Project_Node_Id
);
1061 pragma Inline
(Set_Next_Expression_In_List
);
1062 -- Only valid for N_Expression nodes
1064 procedure Set_Current_Term
1065 (Node
: Project_Node_Id
;
1066 In_Tree
: Project_Node_Tree_Ref
;
1067 To
: Project_Node_Id
);
1068 pragma Inline
(Set_Current_Term
);
1069 -- Only valid for N_Term nodes
1071 procedure Set_Next_Term
1072 (Node
: Project_Node_Id
;
1073 In_Tree
: Project_Node_Tree_Ref
;
1074 To
: Project_Node_Id
);
1075 pragma Inline
(Set_Next_Term
);
1076 -- Only valid for N_Term nodes
1078 procedure Set_First_Expression_In_List
1079 (Node
: Project_Node_Id
;
1080 In_Tree
: Project_Node_Tree_Ref
;
1081 To
: Project_Node_Id
);
1082 pragma Inline
(Set_First_Expression_In_List
);
1083 -- Only valid for N_Literal_String_List nodes
1085 procedure Set_Package_Node_Of
1086 (Node
: Project_Node_Id
;
1087 In_Tree
: Project_Node_Tree_Ref
;
1088 To
: Project_Node_Id
);
1089 pragma Inline
(Set_Package_Node_Of
);
1090 -- Only valid for N_Variable_Reference or N_Attribute_Reference nodes
1092 procedure Set_Default_Of
1093 (Node
: Project_Node_Id
;
1094 In_Tree
: Project_Node_Tree_Ref
;
1095 To
: Attribute_Default_Value
);
1096 pragma Inline
(Set_Default_Of
);
1097 -- Only valid for N_Attribute_Reference nodes
1099 procedure Set_String_Type_Of
1100 (Node
: Project_Node_Id
;
1101 In_Tree
: Project_Node_Tree_Ref
;
1102 To
: Project_Node_Id
);
1103 pragma Inline
(Set_String_Type_Of
);
1104 -- Only valid for N_Variable_Reference or N_Typed_Variable_Declaration
1107 procedure Set_External_Reference_Of
1108 (Node
: Project_Node_Id
;
1109 In_Tree
: Project_Node_Tree_Ref
;
1110 To
: Project_Node_Id
);
1111 pragma Inline
(Set_External_Reference_Of
);
1112 -- Only valid for N_External_Value nodes
1114 procedure Set_External_Default_Of
1115 (Node
: Project_Node_Id
;
1116 In_Tree
: Project_Node_Tree_Ref
;
1117 To
: Project_Node_Id
);
1118 pragma Inline
(Set_External_Default_Of
);
1119 -- Only valid for N_External_Value nodes
1121 procedure Set_Case_Variable_Reference_Of
1122 (Node
: Project_Node_Id
;
1123 In_Tree
: Project_Node_Tree_Ref
;
1124 To
: Project_Node_Id
);
1125 pragma Inline
(Set_Case_Variable_Reference_Of
);
1126 -- Only valid for N_Case_Construction nodes
1128 procedure Set_First_Case_Item_Of
1129 (Node
: Project_Node_Id
;
1130 In_Tree
: Project_Node_Tree_Ref
;
1131 To
: Project_Node_Id
);
1132 pragma Inline
(Set_First_Case_Item_Of
);
1133 -- Only valid for N_Case_Construction nodes
1135 procedure Set_First_Choice_Of
1136 (Node
: Project_Node_Id
;
1137 In_Tree
: Project_Node_Tree_Ref
;
1138 To
: Project_Node_Id
);
1139 pragma Inline
(Set_First_Choice_Of
);
1140 -- Only valid for N_Case_Item nodes.
1142 procedure Set_Next_Case_Item
1143 (Node
: Project_Node_Id
;
1144 In_Tree
: Project_Node_Tree_Ref
;
1145 To
: Project_Node_Id
);
1146 pragma Inline
(Set_Next_Case_Item
);
1147 -- Only valid for N_Case_Item nodes.
1149 procedure Set_Case_Insensitive
1150 (Node
: Project_Node_Id
;
1151 In_Tree
: Project_Node_Tree_Ref
;
1153 -- Only valid for N_Attribute_Declaration and N_Attribute_Reference nodes
1155 -------------------------------
1156 -- Restricted Access Section --
1157 -------------------------------
1159 package Tree_Private_Part
is
1161 -- This is conceptually in the private part. However, for efficiency,
1162 -- some packages are accessing it directly.
1164 type Project_Node_Record
is record
1166 Kind
: Project_Node_Kind
;
1168 Qualifier
: Project_Qualifier
:= Unspecified
;
1170 Location
: Source_Ptr
:= No_Location
;
1172 Directory
: Path_Name_Type
:= No_Path
;
1173 -- Only for N_Project
1175 Display_Name
: Name_Id
:= No_Name
;
1176 -- Only for N_Project
1178 Expr_Kind
: Variable_Kind
:= Undefined
;
1179 -- See below for what Project_Node_Kind it is used
1181 Variables
: Variable_Node_Id
:= Empty_Node
;
1182 -- First variable in a project or a package
1184 Packages
: Package_Declaration_Id
:= Empty_Node
;
1185 -- First package declaration in a project
1187 Pkg_Id
: Package_Node_Id
:= Empty_Package
;
1188 -- Only used for N_Package_Declaration
1190 -- The component Pkg_Id is an entry into the table Package_Attributes
1191 -- (in Prj.Attr). It is used to indicate all the attributes of the
1192 -- package with their characteristics.
1194 -- The tables Prj.Attr.Attributes and Prj.Attr.Package_Attributes
1195 -- are built once and for all through a call (from Prj.Initialize)
1196 -- to procedure Prj.Attr.Initialize. It is never modified after that.
1198 Name
: Name_Id
:= No_Name
;
1199 -- See below for what Project_Node_Kind it is used
1201 Src_Index
: Int
:= 0;
1202 -- Index of a unit in a multi-unit source.
1203 -- Only for some N_Attribute_Declaration and N_Literal_String.
1205 Path_Name
: Path_Name_Type
:= No_Path
;
1206 -- See below for what Project_Node_Kind it is used
1208 Value
: Name_Id
:= No_Name
;
1209 -- See below for what Project_Node_Kind it is used
1211 Default
: Attribute_Default_Value
:= Empty_Value
;
1212 -- Only used in N_Attribute_Reference
1214 Field1
: Project_Node_Id
:= Empty_Node
;
1215 -- See below the meaning for each Project_Node_Kind
1217 Field2
: Project_Node_Id
:= Empty_Node
;
1218 -- See below the meaning for each Project_Node_Kind
1220 Field3
: Project_Node_Id
:= Empty_Node
;
1221 -- See below the meaning for each Project_Node_Kind
1223 Field4
: Project_Node_Id
:= Empty_Node
;
1224 -- See below the meaning for each Project_Node_Kind
1226 Flag1
: Boolean := False;
1227 -- This flag is significant only for:
1229 -- N_Attribute_Declaration and N_Attribute_Reference
1230 -- Indicates for an associative array attribute, that the
1231 -- index is case insensitive.
1234 -- Indicates that the comment is preceded by an empty line.
1237 -- Indicates that there are comments in the project source that
1238 -- cannot be kept in the tree.
1240 -- N_Project_Declaration
1241 -- Indicates that there are unkept comments in the project.
1244 -- Indicates that this is not the last with in a with clause.
1245 -- Set for "A", but not for "B" in with "B"; and with "A", "B";
1247 Flag2
: Boolean := False;
1248 -- This flag is significant only for:
1251 -- Indicates that the project "extends all" another project.
1254 -- Indicates that the comment is followed by an empty line.
1257 -- Indicates that the originally imported project is an extending
1260 Comments
: Project_Node_Id
:= Empty_Node
;
1261 -- For nodes other that N_Comment_Zones or N_Comment, designates the
1262 -- comment zones associated with the node.
1264 -- For N_Comment_Zones, designates the comment after the "end" of
1267 -- For N_Comment, designates the next comment, if any.
1271 -- type Project_Node_Kind is
1274 -- -- Name: project name
1275 -- -- Path_Name: project path name
1276 -- -- Expr_Kind: Undefined
1277 -- -- Field1: first with clause
1278 -- -- Field2: project declaration
1279 -- -- Field3: first string type
1280 -- -- Field4: parent project, if any
1281 -- -- Value: extended project path name (if any)
1284 -- -- Name: imported project name
1285 -- -- Path_Name: imported project path name
1286 -- -- Expr_Kind: Undefined
1287 -- -- Field1: project node
1288 -- -- Field2: next with clause
1289 -- -- Field3: project node or empty if "limited with"
1290 -- -- Field4: not used
1291 -- -- Value: literal string withed
1293 -- N_Project_Declaration,
1294 -- -- Name: not used
1295 -- -- Path_Name: not used
1296 -- -- Expr_Kind: Undefined
1297 -- -- Field1: first declarative item
1298 -- -- Field2: extended project
1299 -- -- Field3: extending project
1300 -- -- Field4: not used
1301 -- -- Value: not used
1303 -- N_Declarative_Item,
1304 -- -- Name: not used
1305 -- -- Path_Name: not used
1306 -- -- Expr_Kind: Undefined
1307 -- -- Field1: current item node
1308 -- -- Field2: next declarative item
1309 -- -- Field3: not used
1310 -- -- Field4: not used
1311 -- -- Value: not used
1313 -- N_Package_Declaration,
1314 -- -- Name: package name
1315 -- -- Path_Name: not used
1316 -- -- Expr_Kind: Undefined
1317 -- -- Field1: project of renamed package (if any)
1318 -- -- Field2: first declarative item
1319 -- -- Field3: next package in project
1320 -- -- Field4: not used
1321 -- -- Value: not used
1323 -- N_String_Type_Declaration,
1324 -- -- Name: type name
1325 -- -- Path_Name: not used
1326 -- -- Expr_Kind: Undefined
1327 -- -- Field1: first literal string
1328 -- -- Field2: next string type
1329 -- -- Field3: not used
1330 -- -- Field4: not used
1331 -- -- Value: not used
1333 -- N_Literal_String,
1334 -- -- Name: not used
1335 -- -- Path_Name: not used
1336 -- -- Expr_Kind: Single
1337 -- -- Field1: next literal string
1338 -- -- Field2: not used
1339 -- -- Field3: not used
1340 -- -- Field4: not used
1341 -- -- Value: string value
1343 -- N_Attribute_Declaration,
1344 -- -- Name: attribute name
1345 -- -- Path_Name: not used
1346 -- -- Expr_Kind: attribute kind
1347 -- -- Field1: expression
1348 -- -- Field2: project of full associative array
1349 -- -- Field3: package of full associative array
1350 -- -- Field4: not used
1351 -- -- Value: associative array index
1352 -- -- (if an associative array element)
1354 -- N_Typed_Variable_Declaration,
1355 -- -- Name: variable name
1356 -- -- Path_Name: not used
1357 -- -- Expr_Kind: Single
1358 -- -- Field1: expression
1359 -- -- Field2: type of variable (N_String_Type_Declaration)
1360 -- -- Field3: next variable
1361 -- -- Field4: not used
1362 -- -- Value: not used
1364 -- N_Variable_Declaration,
1365 -- -- Name: variable name
1366 -- -- Path_Name: not used
1367 -- -- Expr_Kind: variable kind
1368 -- -- Field1: expression
1369 -- -- Field2: not used
1370 -- -- Field3 is used for next variable, instead of Field2,
1371 -- -- so that it is the same field for
1372 -- -- N_Variable_Declaration and
1373 -- -- N_Typed_Variable_Declaration
1374 -- -- Field3: next variable
1375 -- -- Field4: not used
1376 -- -- Value: not used
1379 -- -- Name: not used
1380 -- -- Path_Name: not used
1381 -- -- Expr_Kind: expression kind
1382 -- -- Field1: first term
1383 -- -- Field2: next expression in list
1384 -- -- Field3: not used
1385 -- -- Value: not used
1388 -- -- Name: not used
1389 -- -- Path_Name: not used
1390 -- -- Expr_Kind: term kind
1391 -- -- Field1: current term
1392 -- -- Field2: next term in the expression
1393 -- -- Field3: not used
1394 -- -- Field4: not used
1395 -- -- Value: not used
1397 -- N_Literal_String_List,
1398 -- -- Designates a list of string expressions between brackets
1399 -- -- separated by commas. The string expressions are not necessarily
1400 -- -- literal strings.
1401 -- -- Name: not used
1402 -- -- Path_Name: not used
1403 -- -- Expr_Kind: List
1404 -- -- Field1: first expression
1405 -- -- Field2: not used
1406 -- -- Field3: not used
1407 -- -- Field4: not used
1408 -- -- Value: not used
1410 -- N_Variable_Reference,
1411 -- -- Name: variable name
1412 -- -- Path_Name: not used
1413 -- -- Expr_Kind: variable kind
1414 -- -- Field1: project (if specified)
1415 -- -- Field2: package (if specified)
1416 -- -- Field3: type of variable (N_String_Type_Declaration), if any
1417 -- -- Field4: not used
1418 -- -- Value: not used
1420 -- N_External_Value,
1421 -- -- Name: not used
1422 -- -- Path_Name: not used
1423 -- -- Expr_Kind: Single
1424 -- -- Field1: Name of the external reference (literal string)
1425 -- -- Field2: Default (literal string)
1426 -- -- Field3: not used
1427 -- -- Value: not used
1429 -- N_Attribute_Reference,
1430 -- -- Name: attribute name
1431 -- -- Path_Name: not used
1432 -- -- Expr_Kind: attribute kind
1433 -- -- Field1: project
1434 -- -- Field2: package (if attribute of a package)
1435 -- -- Field3: not used
1436 -- -- Field4: not used
1437 -- -- Value: associative array index
1438 -- -- (if an associative array element)
1440 -- N_Case_Construction,
1441 -- -- Name: not used
1442 -- -- Path_Name: not used
1443 -- -- Expr_Kind: Undefined
1444 -- -- Field1: case variable reference
1445 -- -- Field2: first case item
1446 -- -- Field3: not used
1447 -- -- Field4: not used
1448 -- -- Value: not used
1451 -- -- Name: not used
1452 -- -- Path_Name: not used
1453 -- -- Expr_Kind: not used
1454 -- -- Field1: first choice (literal string), or Empty_Node
1455 -- -- for when others
1456 -- -- Field2: first declarative item
1457 -- -- Field3: next case item
1458 -- -- Field4: not used
1459 -- -- Value: not used
1462 -- -- Name: not used
1463 -- -- Path_Name: not used
1464 -- -- Expr_Kind: not used
1465 -- -- Field1: comment before the construct
1466 -- -- Field2: comment after the construct
1467 -- -- Field3: comment before the "end" of the construct
1468 -- -- Value: end of line comment
1469 -- -- Field4: not used
1470 -- -- Comments: comment after the "end" of the construct
1473 -- -- Name: not used
1474 -- -- Path_Name: not used
1475 -- -- Expr_Kind: not used
1476 -- -- Field1: not used
1477 -- -- Field2: not used
1478 -- -- Field3: not used
1479 -- -- Field4: not used
1480 -- -- Value: comment
1481 -- -- Flag1: comment is preceded by an empty line
1482 -- -- Flag2: comment is followed by an empty line
1483 -- -- Comments: next comment
1485 package Project_Node_Table
is new
1487 (Table_Component_Type
=> Project_Node_Record
,
1488 Table_Index_Type
=> Project_Node_Id
,
1489 Table_Low_Bound
=> First_Node_Id
,
1490 Table_Initial
=> Project_Nodes_Initial
,
1491 Table_Increment
=> Project_Nodes_Increment
);
1492 -- Table contains the syntactic tree of project data from project files
1494 type Project_Name_And_Node
is record
1496 -- Name of the project
1498 Node
: Project_Node_Id
;
1499 -- Node of the project in table Project_Nodes
1501 Resolved_Path
: Path_Name_Type
;
1502 -- Resolved and canonical path of a real project file.
1503 -- No_Name in case of virtual projects.
1506 -- True when the project is being extended by another project
1508 From_Extended
: Boolean;
1509 -- True when the project is only imported by projects that are
1512 Proj_Qualifier
: Project_Qualifier
;
1513 -- The project qualifier of the project, if any
1516 No_Project_Name_And_Node
: constant Project_Name_And_Node
:=
1519 Resolved_Path
=> No_Path
,
1521 From_Extended
=> False,
1522 Proj_Qualifier
=> Unspecified
);
1524 package Projects_Htable
is new GNAT
.Dynamic_HTables
.Simple_HTable
1525 (Header_Num
=> Header_Num
,
1526 Element
=> Project_Name_And_Node
,
1527 No_Element
=> No_Project_Name_And_Node
,
1531 -- This hash table contains a mapping of project names to project nodes.
1532 -- Note that this hash table contains only the nodes whose Kind is
1533 -- N_Project. It is used to find the node of a project from its name,
1534 -- and to verify if a project has already been parsed, knowing its name.
1536 end Tree_Private_Part
;
1538 type Project_Node_Tree_Data
is record
1539 Project_Nodes
: Tree_Private_Part
.Project_Node_Table
.Instance
;
1540 Projects_HT
: Tree_Private_Part
.Projects_Htable
.Instance
;
1542 Incomplete_With
: Boolean := False;
1543 -- Set to True if the projects were loaded with the flag
1544 -- Ignore_Missing_With set to True, and there were indeed some with
1545 -- statements that could not be resolved
1548 procedure Free
(Proj
: in out Project_Node_Tree_Ref
);
1549 -- Free memory used by Prj
1552 type Comment_Array
is array (Positive range <>) of Comment_Data
;
1553 type Comments_Ptr
is access Comment_Array
;
1555 type Comment_State
is record
1556 End_Of_Line_Node
: Project_Node_Id
:= Empty_Node
;
1557 Previous_Line_Node
: Project_Node_Id
:= Empty_Node
;
1558 Previous_End_Node
: Project_Node_Id
:= Empty_Node
;
1559 Unkept_Comments
: Boolean := False;
1560 Comments
: Comments_Ptr
:= null;