OSDN Git Service

* gimplify.c (gimplify_type_sizes) [POINTER_TYPE, REFERENCE_TYPE]:
[pf3gnuchains/gcc-fork.git] / gcc / ada / prj-tree.ads
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --                              P R J . T R E E                             --
6 --                                                                          --
7 --                                 S p e c                                  --
8 --                                                                          --
9 --          Copyright (C) 2001-2006, Free Software Foundation, Inc.         --
10 --                                                                          --
11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
12 -- terms of the  GNU General Public License as published  by the Free Soft- --
13 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17 -- for  more details.  You should have  received  a copy of the GNU General --
18 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
19 -- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
20 -- Boston, MA 02110-1301, USA.                                              --
21 --                                                                          --
22 -- GNAT was originally developed  by the GNAT team at  New York University. --
23 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
24 --                                                                          --
25 ------------------------------------------------------------------------------
26
27 --  This package defines the structure of the Project File tree
28
29 with GNAT.Dynamic_HTables;
30 with GNAT.Dynamic_Tables;
31
32 with Prj.Attr; use Prj.Attr;
33
34 package Prj.Tree is
35
36    type Project_Node_Tree_Data;
37    type Project_Node_Tree_Ref is access all Project_Node_Tree_Data;
38    --  Type to designate a project node tree, so that several project node
39    --  trees can coexist in memory.
40
41    Project_Nodes_Initial   : constant := 1_000;
42    Project_Nodes_Increment : constant := 100;
43    --  Allocation parameters for initializing and extending number
44    --  of nodes in table Tree_Private_Part.Project_Nodes
45
46    Project_Node_Low_Bound  : constant := 0;
47    Project_Node_High_Bound : constant := 099_999_999;
48    --  Range of values for project node id's (in practice infinite)
49
50    type Project_Node_Id is range
51      Project_Node_Low_Bound .. Project_Node_High_Bound;
52    --  The index of table Tree_Private_Part.Project_Nodes
53
54    Empty_Node : constant Project_Node_Id := Project_Node_Low_Bound;
55    --  Designates no node in table Project_Nodes
56
57    First_Node_Id : constant Project_Node_Id := Project_Node_Low_Bound + 1;
58
59    subtype Variable_Node_Id is Project_Node_Id;
60    --  Used to designate a node whose expected kind is one of
61    --  N_Typed_Variable_Declaration, N_Variable_Declaration or
62    --  N_Variable_Reference.
63
64    subtype Package_Declaration_Id is Project_Node_Id;
65    --  Used to designate a node whose expected kind is N_Proect_Declaration
66
67    type Project_Node_Kind is
68      (N_Project,
69       N_With_Clause,
70       N_Project_Declaration,
71       N_Declarative_Item,
72       N_Package_Declaration,
73       N_String_Type_Declaration,
74       N_Literal_String,
75       N_Attribute_Declaration,
76       N_Typed_Variable_Declaration,
77       N_Variable_Declaration,
78       N_Expression,
79       N_Term,
80       N_Literal_String_List,
81       N_Variable_Reference,
82       N_External_Value,
83       N_Attribute_Reference,
84       N_Case_Construction,
85       N_Case_Item,
86       N_Comment_Zones,
87       N_Comment);
88    --  Each node in the tree is of a Project_Node_Kind. For the signification
89    --  of the fields in each node of Project_Node_Kind, look at package
90    --  Tree_Private_Part.
91
92    procedure Initialize (Tree : Project_Node_Tree_Ref);
93    --  Initialize the Project File tree: empty the Project_Nodes table
94    --  and reset the Projects_Htable.
95
96    function Default_Project_Node
97      (In_Tree       : Project_Node_Tree_Ref;
98       Of_Kind       : Project_Node_Kind;
99       And_Expr_Kind : Variable_Kind := Undefined) return Project_Node_Id;
100    --  Returns a Project_Node_Record with the specified Kind and Expr_Kind. All
101    --  the other components have default nil values.
102
103    function Hash (N : Project_Node_Id) return Header_Num;
104    --  Used for hash tables where the key is a Project_Node_Id
105
106    function Imported_Or_Extended_Project_Of
107      (Project   : Project_Node_Id;
108       In_Tree   : Project_Node_Tree_Ref;
109       With_Name : Name_Id) return Project_Node_Id;
110    --  Return the node of a project imported or extended by project Project and
111    --  whose name is With_Name. Return Empty_Node if there is no such project.
112
113    --------------
114    -- Comments --
115    --------------
116
117    type Comment_State is private;
118    --  A type to store the values of several global variables related to
119    --  comments.
120
121    procedure Save (S : out Comment_State);
122    --  Save in variable S the comment state. Called before scanning a new
123    --  project file.
124
125    procedure Restore (S : Comment_State);
126    --  Restore the comment state to a previously saved value. Called after
127    --  scanning a project file.
128
129    procedure Reset_State;
130    --  Set the comment state to its initial value. Called before scanning a
131    --  new project file.
132
133    function There_Are_Unkept_Comments return Boolean;
134    --  Indicates that some of the comments in a project file could not be
135    --  stored in the parse tree.
136
137    procedure Set_Previous_Line_Node (To : Project_Node_Id);
138    --  Indicate the node on the previous line. If there are comments
139    --  immediately following this line, then they should be associated with
140    --  this node.
141
142    procedure Set_Previous_End_Node (To : Project_Node_Id);
143    --  Indicate that on the previous line the "end" belongs to node To.
144    --  If there are comments immediately following this "end" line, they
145    --  should be associated with this node.
146
147    procedure Set_End_Of_Line (To : Project_Node_Id);
148    --  Indicate the node on the current line. If there is an end of line
149    --  comment, then it should be associated with this node.
150
151    procedure Set_Next_End_Node (To : Project_Node_Id);
152    --  Put node To on the top of the end node stack. When an END line is found
153    --  with this node on the top of the end node stack, the comments, if any,
154    --  immediately preceding this "end" line will be associated with this node.
155
156    procedure Remove_Next_End_Node;
157    --  Remove the top of the end node stack
158
159    ------------------------
160    -- Comment Processing --
161    ------------------------
162
163    type Comment_Data is record
164       Value                     : Name_Id := No_Name;
165       Follows_Empty_Line        : Boolean := False;
166       Is_Followed_By_Empty_Line : Boolean := False;
167    end record;
168    --  Component type for Comments Table below
169
170    package Comments is new Table.Table
171      (Table_Component_Type => Comment_Data,
172       Table_Index_Type     => Natural,
173       Table_Low_Bound      => 1,
174       Table_Initial        => 10,
175       Table_Increment      => 100,
176       Table_Name           => "Prj.Tree.Comments");
177    --  A table to store the comments that may be stored is the tree
178
179    procedure Scan (In_Tree : Project_Node_Tree_Ref);
180    --  Scan the tokens and accumulate comments
181
182    type Comment_Location is
183      (Before, After, Before_End, After_End, End_Of_Line);
184    --  Used in call to Add_Comments below
185
186    procedure Add_Comments
187      (To      : Project_Node_Id;
188       In_Tree : Project_Node_Tree_Ref;
189       Where   : Comment_Location);
190    --  Add comments to this node
191
192    ----------------------
193    -- Access Functions --
194    ----------------------
195
196    --  The following query functions are part of the abstract interface
197    --  of the Project File tree. They provide access to fields of a project.
198
199    --  In the following, there are "valid if" comments, but no indication
200    --  of what happens if they are called with invalid arguments ???
201
202    function Name_Of
203      (Node    : Project_Node_Id;
204       In_Tree : Project_Node_Tree_Ref) return Name_Id;
205    pragma Inline (Name_Of);
206    --  Valid for all non empty nodes. May return No_Name for nodes that have
207    --  no names.
208
209    function Kind_Of
210      (Node    : Project_Node_Id;
211       In_Tree : Project_Node_Tree_Ref) return Project_Node_Kind;
212    pragma Inline (Kind_Of);
213    --  Valid for all non empty nodes
214
215    function Location_Of
216      (Node    : Project_Node_Id;
217       In_Tree : Project_Node_Tree_Ref) return Source_Ptr;
218    pragma Inline (Location_Of);
219    --  Valid for all non empty nodes
220
221    function First_Comment_After
222      (Node    : Project_Node_Id;
223       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
224    --  Valid only for N_Comment_Zones nodes
225
226    function First_Comment_After_End
227      (Node    : Project_Node_Id;
228       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
229    --  Valid only for N_Comment_Zones nodes
230
231    function First_Comment_Before
232      (Node    : Project_Node_Id;
233       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
234    --  Valid only for N_Comment_Zones nodes
235
236    function First_Comment_Before_End
237      (Node    : Project_Node_Id;
238       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
239    --  Valid only for N_Comment_Zones nodes
240
241    function Next_Comment
242      (Node    : Project_Node_Id;
243       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
244    --  Valid only for N_Comment nodes
245
246    function End_Of_Line_Comment
247      (Node    : Project_Node_Id;
248       In_Tree : Project_Node_Tree_Ref) return Name_Id;
249    --  Valid only for non empty nodes
250
251    function Follows_Empty_Line
252      (Node    : Project_Node_Id;
253       In_Tree : Project_Node_Tree_Ref) return Boolean;
254    --  Valid only for N_Comment nodes
255
256    function Is_Followed_By_Empty_Line
257      (Node    : Project_Node_Id;
258       In_Tree : Project_Node_Tree_Ref) return Boolean;
259    --  Valid only for N_Comment nodes
260
261    function Project_File_Includes_Unkept_Comments
262      (Node    : Project_Node_Id;
263       In_Tree : Project_Node_Tree_Ref)
264       return Boolean;
265    --  Valid only for N_Project nodes
266
267    function Directory_Of
268      (Node    : Project_Node_Id;
269       In_Tree : Project_Node_Tree_Ref) return Name_Id;
270    pragma Inline (Directory_Of);
271    --  Only valid for N_Project nodes
272
273    function Expression_Kind_Of
274      (Node    : Project_Node_Id;
275       In_Tree : Project_Node_Tree_Ref) return Variable_Kind;
276    pragma Inline (Expression_Kind_Of);
277    --  Only valid for N_Literal_String, N_Attribute_Declaration,
278    --  N_Variable_Declaration, N_Typed_Variable_Declaration, N_Expression,
279    --  N_Term, N_Variable_Reference or N_Attribute_Reference nodes.
280
281    function Is_Extending_All
282      (Node    : Project_Node_Id;
283       In_Tree : Project_Node_Tree_Ref) return Boolean;
284    pragma Inline (Is_Extending_All);
285    --  Only valid for N_Project and N_With_Clause
286
287    function Is_Not_Last_In_List
288      (Node    : Project_Node_Id;
289       In_Tree : Project_Node_Tree_Ref) return Boolean;
290    pragma Inline (Is_Not_Last_In_List);
291    --  Only valid for N_With_Clause
292
293    function First_Variable_Of
294      (Node    : Project_Node_Id;
295       In_Tree : Project_Node_Tree_Ref) return Variable_Node_Id;
296    pragma Inline (First_Variable_Of);
297    --  Only valid for N_Project or N_Package_Declaration nodes
298
299    function First_Package_Of
300      (Node    : Project_Node_Id;
301       In_Tree : Project_Node_Tree_Ref) return Package_Declaration_Id;
302    pragma Inline (First_Package_Of);
303    --  Only valid for N_Project nodes
304
305    function Package_Id_Of
306      (Node    : Project_Node_Id;
307       In_Tree : Project_Node_Tree_Ref) return Package_Node_Id;
308    pragma Inline (Package_Id_Of);
309    --  Only valid for N_Package_Declaration nodes
310
311    function Path_Name_Of
312      (Node    : Project_Node_Id;
313       In_Tree : Project_Node_Tree_Ref) return Name_Id;
314    pragma Inline (Path_Name_Of);
315    --  Only valid for N_Project and N_With_Clause nodes
316
317    function String_Value_Of
318      (Node    : Project_Node_Id;
319       In_Tree : Project_Node_Tree_Ref) return Name_Id;
320    pragma Inline (String_Value_Of);
321    --  Only valid for N_With_Clause, N_Literal_String nodes or N_Comment.
322    --  For a N_With_Clause created automatically for a virtual extending
323    --  project, No_Name is returned.
324
325    function Source_Index_Of
326      (Node    : Project_Node_Id;
327       In_Tree : Project_Node_Tree_Ref) return Int;
328    pragma Inline (Source_Index_Of);
329    --  Only valid for N_Literal_String and N_Attribute_Declaration nodes
330
331    function First_With_Clause_Of
332      (Node    : Project_Node_Id;
333       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
334    pragma Inline (First_With_Clause_Of);
335    --  Only valid for N_Project nodes
336
337    function Project_Declaration_Of
338      (Node    : Project_Node_Id;
339       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
340    pragma Inline (Project_Declaration_Of);
341    --  Only valid for N_Project nodes
342
343    function Extending_Project_Of
344      (Node    : Project_Node_Id;
345       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
346    pragma Inline (Extending_Project_Of);
347    --  Only valid for N_Project_Declaration nodes
348
349    function First_String_Type_Of
350      (Node    : Project_Node_Id;
351       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
352    pragma Inline (First_String_Type_Of);
353    --  Only valid for N_Project nodes
354
355    function Extended_Project_Path_Of
356      (Node    : Project_Node_Id;
357       In_Tree : Project_Node_Tree_Ref) return Name_Id;
358    pragma Inline (Extended_Project_Path_Of);
359    --  Only valid for N_With_Clause nodes
360
361    function Project_Node_Of
362      (Node    : Project_Node_Id;
363       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
364    pragma Inline (Project_Node_Of);
365    --  Only valid for N_With_Clause, N_Variable_Reference and
366    --  N_Attribute_Reference nodes.
367
368    function Non_Limited_Project_Node_Of
369      (Node    : Project_Node_Id;
370       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
371    pragma Inline (Non_Limited_Project_Node_Of);
372    --  Only valid for N_With_Clause nodes. Returns Empty_Node for limited
373    --  imported project files, otherwise returns the same result as
374    --  Project_Node_Of.
375
376    function Next_With_Clause_Of
377      (Node    : Project_Node_Id;
378       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
379    pragma Inline (Next_With_Clause_Of);
380    --  Only valid for N_With_Clause nodes
381
382    function First_Declarative_Item_Of
383      (Node    : Project_Node_Id;
384       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
385    pragma Inline (First_Declarative_Item_Of);
386    --  Only valid for N_With_Clause nodes
387
388    function Extended_Project_Of
389      (Node    : Project_Node_Id;
390       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
391    pragma Inline (Extended_Project_Of);
392    --  Only valid for N_Project_Declaration nodes
393
394    function Current_Item_Node
395      (Node    : Project_Node_Id;
396       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
397    pragma Inline (Current_Item_Node);
398    --  Only valid for N_Declarative_Item nodes
399
400    function Next_Declarative_Item
401      (Node    : Project_Node_Id;
402       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
403    pragma Inline (Next_Declarative_Item);
404    --  Only valid for N_Declarative_Item node
405
406    function Project_Of_Renamed_Package_Of
407      (Node    : Project_Node_Id;
408       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
409    pragma Inline (Project_Of_Renamed_Package_Of);
410    --  Only valid for N_Package_Declaration nodes.
411    --  May return Empty_Node.
412
413    function Next_Package_In_Project
414      (Node    : Project_Node_Id;
415       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
416    pragma Inline (Next_Package_In_Project);
417    --  Only valid for N_Package_Declaration nodes
418
419    function First_Literal_String
420      (Node    : Project_Node_Id;
421       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
422    pragma Inline (First_Literal_String);
423    --  Only valid for N_String_Type_Declaration nodes
424
425    function Next_String_Type
426      (Node    : Project_Node_Id;
427       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
428    pragma Inline (Next_String_Type);
429    --  Only valid for N_String_Type_Declaration nodes
430
431    function Next_Literal_String
432      (Node    : Project_Node_Id;
433       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
434    pragma Inline (Next_Literal_String);
435    --  Only valid for N_Literal_String nodes
436
437    function Expression_Of
438      (Node    : Project_Node_Id;
439       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
440    pragma Inline (Expression_Of);
441    --  Only valid for N_Attribute_Declaration, N_Typed_Variable_Declaration
442    --  or N_Variable_Declaration nodes
443
444    function Associative_Project_Of
445      (Node    : Project_Node_Id;
446       In_Tree : Project_Node_Tree_Ref)
447       return  Project_Node_Id;
448    pragma Inline (Associative_Project_Of);
449    --  Only valid for N_Attribute_Declaration nodes
450
451    function Associative_Package_Of
452      (Node    : Project_Node_Id;
453       In_Tree : Project_Node_Tree_Ref)
454       return  Project_Node_Id;
455    pragma Inline (Associative_Package_Of);
456    --  Only valid for N_Attribute_Declaration nodes
457
458    function Value_Is_Valid
459      (For_Typed_Variable : Project_Node_Id;
460       In_Tree            : Project_Node_Tree_Ref;
461       Value              : Name_Id) return Boolean;
462    pragma Inline (Value_Is_Valid);
463    --  Only valid for N_Typed_Variable_Declaration. Returns True if Value is
464    --  in the list of allowed strings for For_Typed_Variable. False otherwise.
465
466    function Associative_Array_Index_Of
467      (Node    : Project_Node_Id;
468       In_Tree : Project_Node_Tree_Ref) return Name_Id;
469    pragma Inline (Associative_Array_Index_Of);
470    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference.
471    --  Returns No_String for non associative array attributes.
472
473    function Next_Variable
474      (Node    : Project_Node_Id;
475       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
476    pragma Inline (Next_Variable);
477    --  Only valid for N_Typed_Variable_Declaration or N_Variable_Declaration
478    --  nodes.
479
480    function First_Term
481      (Node    : Project_Node_Id;
482       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
483    pragma Inline (First_Term);
484    --  Only valid for N_Expression nodes
485
486    function Next_Expression_In_List
487      (Node    : Project_Node_Id;
488       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
489    pragma Inline (Next_Expression_In_List);
490    --  Only valid for N_Expression nodes
491
492    function Current_Term
493      (Node    : Project_Node_Id;
494       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
495    pragma Inline (Current_Term);
496    --  Only valid for N_Term nodes
497
498    function Next_Term
499      (Node    : Project_Node_Id;
500       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
501    pragma Inline (Next_Term);
502    --  Only valid for N_Term nodes
503
504    function First_Expression_In_List
505      (Node    : Project_Node_Id;
506       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
507    pragma Inline (First_Expression_In_List);
508    --  Only valid for N_Literal_String_List nodes
509
510    function Package_Node_Of
511      (Node    : Project_Node_Id;
512       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
513    pragma Inline (Package_Node_Of);
514    --  Only valid for N_Variable_Reference or N_Attribute_Reference nodes.
515    --  May return Empty_Node.
516
517    function String_Type_Of
518      (Node    : Project_Node_Id;
519       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
520    pragma Inline (String_Type_Of);
521    --  Only valid for N_Variable_Reference or N_Typed_Variable_Declaration
522    --  nodes.
523
524    function External_Reference_Of
525      (Node    : Project_Node_Id;
526       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
527    pragma Inline (External_Reference_Of);
528    --  Only valid for N_External_Value nodes
529
530    function External_Default_Of
531      (Node    : Project_Node_Id;
532       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
533    pragma Inline (External_Default_Of);
534    --  Only valid for N_External_Value nodes
535
536    function Case_Variable_Reference_Of
537      (Node    : Project_Node_Id;
538       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
539    pragma Inline (Case_Variable_Reference_Of);
540    --  Only valid for N_Case_Construction nodes
541
542    function First_Case_Item_Of
543      (Node    : Project_Node_Id;
544       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
545    pragma Inline (First_Case_Item_Of);
546    --  Only valid for N_Case_Construction nodes
547
548    function First_Choice_Of
549      (Node    : Project_Node_Id;
550       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
551    pragma Inline (First_Choice_Of);
552    --  Return the first choice in a N_Case_Item, or Empty_Node if
553    --  this is when others.
554
555    function Next_Case_Item
556      (Node    : Project_Node_Id;
557       In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
558    pragma Inline (Next_Case_Item);
559    --  Only valid for N_Case_Item nodes
560
561    function Case_Insensitive
562      (Node    : Project_Node_Id;
563       In_Tree : Project_Node_Tree_Ref) return Boolean;
564    --  Only valid for N_Attribute_Declaration and N_Attribute_Reference nodes
565
566    --------------------
567    -- Set Procedures --
568    --------------------
569
570    --  The following procedures are part of the abstract interface of
571    --  the Project File tree.
572
573    --  Each Set_* procedure is valid only for the same Project_Node_Kind
574    --  nodes as the corresponding query function above.
575
576    procedure Set_Name_Of
577      (Node    : Project_Node_Id;
578       In_Tree : Project_Node_Tree_Ref;
579       To      : Name_Id);
580    pragma Inline (Set_Name_Of);
581
582    procedure Set_Kind_Of
583      (Node    : Project_Node_Id;
584       In_Tree : Project_Node_Tree_Ref;
585       To      : Project_Node_Kind);
586    pragma Inline (Set_Kind_Of);
587
588    procedure Set_Location_Of
589      (Node    : Project_Node_Id;
590       In_Tree : Project_Node_Tree_Ref;
591       To      : Source_Ptr);
592    pragma Inline (Set_Location_Of);
593
594    procedure Set_First_Comment_After
595      (Node    : Project_Node_Id;
596       In_Tree : Project_Node_Tree_Ref;
597       To      : Project_Node_Id);
598    pragma Inline (Set_First_Comment_After);
599
600    procedure Set_First_Comment_After_End
601      (Node    : Project_Node_Id;
602       In_Tree : Project_Node_Tree_Ref;
603       To      : Project_Node_Id);
604    pragma Inline (Set_First_Comment_After_End);
605
606    procedure Set_First_Comment_Before
607      (Node    : Project_Node_Id;
608       In_Tree : Project_Node_Tree_Ref;
609       To      : Project_Node_Id);
610    pragma Inline (Set_First_Comment_Before);
611
612    procedure Set_First_Comment_Before_End
613      (Node    : Project_Node_Id;
614       In_Tree : Project_Node_Tree_Ref;
615       To      : Project_Node_Id);
616    pragma Inline (Set_First_Comment_Before_End);
617
618    procedure Set_Next_Comment
619      (Node    : Project_Node_Id;
620       In_Tree : Project_Node_Tree_Ref;
621       To      : Project_Node_Id);
622    pragma Inline (Set_Next_Comment);
623
624    procedure Set_Project_File_Includes_Unkept_Comments
625      (Node    : Project_Node_Id;
626       In_Tree : Project_Node_Tree_Ref;
627       To      : Boolean);
628
629    procedure Set_Directory_Of
630      (Node    : Project_Node_Id;
631       In_Tree : Project_Node_Tree_Ref;
632       To      : Name_Id);
633    pragma Inline (Set_Directory_Of);
634
635    procedure Set_Expression_Kind_Of
636      (Node    : Project_Node_Id;
637       In_Tree : Project_Node_Tree_Ref;
638       To      : Variable_Kind);
639    pragma Inline (Set_Expression_Kind_Of);
640
641    procedure Set_Is_Extending_All
642      (Node    : Project_Node_Id;
643       In_Tree : Project_Node_Tree_Ref);
644    pragma Inline (Set_Is_Extending_All);
645
646    procedure Set_Is_Not_Last_In_List
647      (Node    : Project_Node_Id;
648       In_Tree : Project_Node_Tree_Ref);
649    pragma Inline (Set_Is_Not_Last_In_List);
650
651    procedure Set_First_Variable_Of
652      (Node    : Project_Node_Id;
653       In_Tree : Project_Node_Tree_Ref;
654       To      : Variable_Node_Id);
655    pragma Inline (Set_First_Variable_Of);
656
657    procedure Set_First_Package_Of
658      (Node    : Project_Node_Id;
659       In_Tree : Project_Node_Tree_Ref;
660       To      : Package_Declaration_Id);
661    pragma Inline (Set_First_Package_Of);
662
663    procedure Set_Package_Id_Of
664      (Node    : Project_Node_Id;
665       In_Tree : Project_Node_Tree_Ref;
666       To      : Package_Node_Id);
667    pragma Inline (Set_Package_Id_Of);
668
669    procedure Set_Path_Name_Of
670      (Node    : Project_Node_Id;
671       In_Tree : Project_Node_Tree_Ref;
672       To      : Name_Id);
673    pragma Inline (Set_Path_Name_Of);
674
675    procedure Set_String_Value_Of
676      (Node    : Project_Node_Id;
677       In_Tree : Project_Node_Tree_Ref;
678       To      : Name_Id);
679    pragma Inline (Set_String_Value_Of);
680
681    procedure Set_First_With_Clause_Of
682      (Node    : Project_Node_Id;
683       In_Tree : Project_Node_Tree_Ref;
684       To      : Project_Node_Id);
685    pragma Inline (Set_First_With_Clause_Of);
686
687    procedure Set_Project_Declaration_Of
688      (Node    : Project_Node_Id;
689       In_Tree : Project_Node_Tree_Ref;
690       To      : Project_Node_Id);
691    pragma Inline (Set_Project_Declaration_Of);
692
693    procedure Set_Extending_Project_Of
694      (Node    : Project_Node_Id;
695       In_Tree : Project_Node_Tree_Ref;
696       To      : Project_Node_Id);
697    pragma Inline (Set_Extending_Project_Of);
698
699    procedure Set_First_String_Type_Of
700      (Node    : Project_Node_Id;
701       In_Tree : Project_Node_Tree_Ref;
702       To      : Project_Node_Id);
703    pragma Inline (Set_First_String_Type_Of);
704
705    procedure Set_Extended_Project_Path_Of
706      (Node    : Project_Node_Id;
707       In_Tree : Project_Node_Tree_Ref;
708       To      : Name_Id);
709    pragma Inline (Set_Extended_Project_Path_Of);
710
711    procedure Set_Project_Node_Of
712      (Node         : Project_Node_Id;
713       In_Tree      : Project_Node_Tree_Ref;
714       To           : Project_Node_Id;
715       Limited_With : Boolean := False);
716    pragma Inline (Set_Project_Node_Of);
717
718    procedure Set_Next_With_Clause_Of
719      (Node    : Project_Node_Id;
720       In_Tree : Project_Node_Tree_Ref;
721       To      : Project_Node_Id);
722    pragma Inline (Set_Next_With_Clause_Of);
723
724    procedure Set_First_Declarative_Item_Of
725      (Node    : Project_Node_Id;
726       In_Tree : Project_Node_Tree_Ref;
727       To      : Project_Node_Id);
728    pragma Inline (Set_First_Declarative_Item_Of);
729
730    procedure Set_Extended_Project_Of
731      (Node    : Project_Node_Id;
732       In_Tree : Project_Node_Tree_Ref;
733       To      : Project_Node_Id);
734    pragma Inline (Set_Extended_Project_Of);
735
736    procedure Set_Current_Item_Node
737      (Node    : Project_Node_Id;
738       In_Tree : Project_Node_Tree_Ref;
739       To      : Project_Node_Id);
740    pragma Inline (Set_Current_Item_Node);
741
742    procedure Set_Next_Declarative_Item
743      (Node    : Project_Node_Id;
744       In_Tree : Project_Node_Tree_Ref;
745       To      : Project_Node_Id);
746    pragma Inline (Set_Next_Declarative_Item);
747
748    procedure Set_Project_Of_Renamed_Package_Of
749      (Node    : Project_Node_Id;
750       In_Tree : Project_Node_Tree_Ref;
751       To      : Project_Node_Id);
752    pragma Inline (Set_Project_Of_Renamed_Package_Of);
753
754    procedure Set_Next_Package_In_Project
755      (Node    : Project_Node_Id;
756       In_Tree : Project_Node_Tree_Ref;
757       To      : Project_Node_Id);
758    pragma Inline (Set_Next_Package_In_Project);
759
760    procedure Set_First_Literal_String
761      (Node    : Project_Node_Id;
762       In_Tree : Project_Node_Tree_Ref;
763       To      : Project_Node_Id);
764    pragma Inline (Set_First_Literal_String);
765
766    procedure Set_Next_String_Type
767      (Node    : Project_Node_Id;
768       In_Tree : Project_Node_Tree_Ref;
769       To      : Project_Node_Id);
770    pragma Inline (Set_Next_String_Type);
771
772    procedure Set_Next_Literal_String
773      (Node    : Project_Node_Id;
774       In_Tree : Project_Node_Tree_Ref;
775       To      : Project_Node_Id);
776    pragma Inline (Set_Next_Literal_String);
777
778    procedure Set_Expression_Of
779      (Node    : Project_Node_Id;
780       In_Tree : Project_Node_Tree_Ref;
781       To      : Project_Node_Id);
782    pragma Inline (Set_Expression_Of);
783
784    procedure Set_Associative_Project_Of
785      (Node    : Project_Node_Id;
786       In_Tree : Project_Node_Tree_Ref;
787       To      : Project_Node_Id);
788    pragma Inline (Set_Associative_Project_Of);
789
790    procedure Set_Associative_Package_Of
791      (Node    : Project_Node_Id;
792       In_Tree : Project_Node_Tree_Ref;
793       To      : Project_Node_Id);
794    pragma Inline (Set_Associative_Package_Of);
795
796    procedure Set_Associative_Array_Index_Of
797      (Node    : Project_Node_Id;
798       In_Tree : Project_Node_Tree_Ref;
799       To      : Name_Id);
800    pragma Inline (Set_Associative_Array_Index_Of);
801
802    procedure Set_Next_Variable
803      (Node    : Project_Node_Id;
804       In_Tree : Project_Node_Tree_Ref;
805       To      : Project_Node_Id);
806    pragma Inline (Set_Next_Variable);
807
808    procedure Set_First_Term
809      (Node    : Project_Node_Id;
810       In_Tree : Project_Node_Tree_Ref;
811       To      : Project_Node_Id);
812    pragma Inline (Set_First_Term);
813
814    procedure Set_Next_Expression_In_List
815      (Node    : Project_Node_Id;
816       In_Tree : Project_Node_Tree_Ref;
817       To      : Project_Node_Id);
818    pragma Inline (Set_Next_Expression_In_List);
819
820    procedure Set_Current_Term
821      (Node    : Project_Node_Id;
822       In_Tree : Project_Node_Tree_Ref;
823       To      : Project_Node_Id);
824    pragma Inline (Set_Current_Term);
825
826    procedure Set_Next_Term
827      (Node    : Project_Node_Id;
828       In_Tree : Project_Node_Tree_Ref;
829       To      : Project_Node_Id);
830    pragma Inline (Set_Next_Term);
831
832    procedure Set_First_Expression_In_List
833      (Node    : Project_Node_Id;
834       In_Tree : Project_Node_Tree_Ref;
835       To      : Project_Node_Id);
836    pragma Inline (Set_First_Expression_In_List);
837
838    procedure Set_Package_Node_Of
839      (Node    : Project_Node_Id;
840       In_Tree : Project_Node_Tree_Ref;
841       To      : Project_Node_Id);
842    pragma Inline (Set_Package_Node_Of);
843
844    procedure Set_Source_Index_Of
845      (Node    : Project_Node_Id;
846       In_Tree : Project_Node_Tree_Ref;
847       To      : Int);
848    pragma Inline (Set_Source_Index_Of);
849
850    procedure Set_String_Type_Of
851      (Node    : Project_Node_Id;
852       In_Tree : Project_Node_Tree_Ref;
853       To      : Project_Node_Id);
854    pragma Inline (Set_String_Type_Of);
855
856    procedure Set_External_Reference_Of
857      (Node    : Project_Node_Id;
858       In_Tree : Project_Node_Tree_Ref;
859       To      : Project_Node_Id);
860    pragma Inline (Set_External_Reference_Of);
861
862    procedure Set_External_Default_Of
863      (Node    : Project_Node_Id;
864       In_Tree : Project_Node_Tree_Ref;
865       To      : Project_Node_Id);
866    pragma Inline (Set_External_Default_Of);
867
868    procedure Set_Case_Variable_Reference_Of
869      (Node    : Project_Node_Id;
870       In_Tree : Project_Node_Tree_Ref;
871       To      : Project_Node_Id);
872    pragma Inline (Set_Case_Variable_Reference_Of);
873
874    procedure Set_First_Case_Item_Of
875      (Node    : Project_Node_Id;
876       In_Tree : Project_Node_Tree_Ref;
877       To      : Project_Node_Id);
878    pragma Inline (Set_First_Case_Item_Of);
879
880    procedure Set_First_Choice_Of
881      (Node    : Project_Node_Id;
882       In_Tree : Project_Node_Tree_Ref;
883       To      : Project_Node_Id);
884    pragma Inline (Set_First_Choice_Of);
885
886    procedure Set_Next_Case_Item
887      (Node    : Project_Node_Id;
888       In_Tree : Project_Node_Tree_Ref;
889       To      : Project_Node_Id);
890    pragma Inline (Set_Next_Case_Item);
891
892    procedure Set_Case_Insensitive
893      (Node    : Project_Node_Id;
894       In_Tree : Project_Node_Tree_Ref;
895       To      : Boolean);
896
897    -------------------------------
898    -- Restricted Access Section --
899    -------------------------------
900
901    package Tree_Private_Part is
902
903       --  This is conceptually in the private part.
904       --  However, for efficiency, some packages are accessing it directly.
905
906       type Project_Node_Record is record
907
908          Kind : Project_Node_Kind;
909
910          Location : Source_Ptr := No_Location;
911
912          Directory : Name_Id       := No_Name;
913          --  Only for N_Project
914
915          Expr_Kind : Variable_Kind := Undefined;
916          --  See below for what Project_Node_Kind it is used
917
918          Variables : Variable_Node_Id := Empty_Node;
919          --  First variable in a project or a package
920
921          Packages : Package_Declaration_Id := Empty_Node;
922          --  First package declaration in a project
923
924          Pkg_Id : Package_Node_Id := Empty_Package;
925          --  Only used for N_Package_Declaration
926          --  The component Pkg_Id is an entry into the table Package_Attributes
927          --  (in Prj.Attr). It is used to indicate all the attributes of the
928          --  package with their characteristics.
929          --
930          --  The tables Prj.Attr.Attributes and Prj.Attr.Package_Attributes
931          --  are built once and for all through a call (from Prj.Initialize)
932          --  to procedure Prj.Attr.Initialize. It is never modified after that.
933
934          Name : Name_Id := No_Name;
935          --  See below for what Project_Node_Kind it is used
936
937          Src_Index : Int := 0;
938          --  Index of a unit in a multi-unit source.
939          --  Onli for some N_Attribute_Declaration and N_Literal_String.
940
941          Path_Name : Name_Id := No_Name;
942          --  See below for what Project_Node_Kind it is used
943
944          Value : Name_Id := No_Name;
945          --  See below for what Project_Node_Kind it is used
946
947          Field1 : Project_Node_Id := Empty_Node;
948          --  See below the meaning for each Project_Node_Kind
949
950          Field2 : Project_Node_Id := Empty_Node;
951          --  See below the meaning for each Project_Node_Kind
952
953          Field3 : Project_Node_Id := Empty_Node;
954          --  See below the meaning for each Project_Node_Kind
955
956          Flag1 : Boolean := False;
957          --  This flag is significant only for:
958          --    N_Attribute_Declaration and N_Atribute_Reference
959          --      It indicates for an associative array attribute, that the
960          --      index is case insensitive.
961          --    N_Comment - it indicates that the comment is preceded by an
962          --                empty line.
963          --    N_Project - it indicates that there are comments in the project
964          --                source that cannot be kept in the tree.
965          --    N_Project_Declaration
966          --              - it indicates that there are unkept comments in the
967          --                project.
968          --    N_With_Clause
969          --              - it indicates that this is not the last with in a
970          --                with clause. It is set for "A", but not for "B" in
971          --                    with "B";
972          --                  and
973          --                    with "A", "B";
974
975          Flag2 : Boolean := False;
976          --  This flag is significant only for:
977          --    N_Project - it indicates that the project "extends all" another
978          --                project.
979          --    N_Comment - it indicates that the comment is followed by an
980          --                empty line.
981          --    N_With_Clause
982          --              - it indicates that the originally imported project
983          --                is an extending all project.
984
985          Comments : Project_Node_Id := Empty_Node;
986          --  For nodes other that N_Comment_Zones or N_Comment, designates the
987          --  comment zones associated with the node.
988          --  for N_Comment_Zones, designates the comment after the "end" of
989          --  the construct.
990          --  For N_Comment, designates the next comment, if any.
991
992       end record;
993
994       --  type Project_Node_Kind is
995
996       --   (N_Project,
997       --    --  Name:      project name
998       --    --  Path_Name: project path name
999       --    --  Expr_Kind: Undefined
1000       --    --  Field1:    first with clause
1001       --    --  Field2:    project declaration
1002       --    --  Field3:    first string type
1003       --    --  Value:     extended project path name (if any)
1004
1005       --    N_With_Clause,
1006       --    --  Name:      imported project name
1007       --    --  Path_Name: imported project path name
1008       --    --  Expr_Kind: Undefined
1009       --    --  Field1:    project node
1010       --    --  Field2:    next with clause
1011       --    --  Field3:    project node or empty if "limited with"
1012       --    --  Value:     literal string withed
1013
1014       --    N_Project_Declaration,
1015       --    --  Name:      not used
1016       --    --  Path_Name: not used
1017       --    --  Expr_Kind: Undefined
1018       --    --  Field1:    first declarative item
1019       --    --  Field2:    extended project
1020       --    --  Field3:    extending project
1021       --    --  Value:     not used
1022
1023       --    N_Declarative_Item,
1024       --    --  Name:      not used
1025       --    --  Path_Name: not used
1026       --    --  Expr_Kind: Undefined
1027       --    --  Field1:    current item node
1028       --    --  Field2:    next declarative item
1029       --    --  Field3:    not used
1030       --    --  Value:     not used
1031
1032       --    N_Package_Declaration,
1033       --    --  Name:      package name
1034       --    --  Path_Name: not used
1035       --    --  Expr_Kind: Undefined
1036       --    --  Field1:    project of renamed package (if any)
1037       --    --  Field2:    first declarative item
1038       --    --  Field3:    next package in project
1039       --    --  Value:     not used
1040
1041       --    N_String_Type_Declaration,
1042       --    --  Name:      type name
1043       --    --  Path_Name: not used
1044       --    --  Expr_Kind: Undefined
1045       --    --  Field1:    first literal string
1046       --    --  Field2:    next string type
1047       --    --  Field3:    not used
1048       --    --  Value:     not used
1049
1050       --    N_Literal_String,
1051       --    --  Name:      not used
1052       --    --  Path_Name: not used
1053       --    --  Expr_Kind: Single
1054       --    --  Field1:    next literal string
1055       --    --  Field2:    not used
1056       --    --  Field3:    not used
1057       --    --  Value:     string value
1058
1059       --    N_Attribute_Declaration,
1060       --    --  Name:      attribute name
1061       --    --  Path_Name: not used
1062       --    --  Expr_Kind: attribute kind
1063       --    --  Field1:    expression
1064       --    --  Field2:    project of full associative array
1065       --    --  Field3:    package of full associative array
1066       --    --  Value:     associative array index
1067       --    --             (if an associative array element)
1068
1069       --    N_Typed_Variable_Declaration,
1070       --    --  Name:      variable name
1071       --    --  Path_Name: not used
1072       --    --  Expr_Kind: Single
1073       --    --  Field1:    expression
1074       --    --  Field2:    type of variable (N_String_Type_Declaration)
1075       --    --  Field3:    next variable
1076       --    --  Value:     not used
1077
1078       --    N_Variable_Declaration,
1079       --    --  Name:      variable name
1080       --    --  Path_Name: not used
1081       --    --  Expr_Kind: variable kind
1082       --    --  Field1:    expression
1083       --    --  Field2:    not used
1084       --    --             Field3 is used for next variable, instead of Field2,
1085       --    --             so that it is the same field for
1086       --    --             N_Variable_Declaration and
1087       --    --             N_Typed_Variable_Declaration
1088       --    --  Field3:    next variable
1089       --    --  Value:     not used
1090
1091       --    N_Expression,
1092       --    --  Name:      not used
1093       --    --  Path_Name: not used
1094       --    --  Expr_Kind: expression kind
1095       --    --  Field1:    first term
1096       --    --  Field2:    next expression in list
1097       --    --  Field3:    not used
1098       --    --  Value:     not used
1099
1100       --    N_Term,
1101       --    --  Name:      not used
1102       --    --  Path_Name: not used
1103       --    --  Expr_Kind: term kind
1104       --    --  Field1:    current term
1105       --    --  Field2:    next term in the expression
1106       --    --  Field3:    not used
1107       --    --  Value:     not used
1108
1109       --    N_Literal_String_List,
1110       --    --  Designates a list of string expressions between brackets
1111       --    --  separated by commas. The string expressions are not necessarily
1112       --    --  literal strings.
1113       --    --  Name:      not used
1114       --    --  Path_Name: not used
1115       --    --  Expr_Kind: List
1116       --    --  Field1:    first expression
1117       --    --  Field2:    not used
1118       --    --  Field3:    not used
1119       --    --  Value:     not used
1120
1121       --    N_Variable_Reference,
1122       --    --  Name:      variable name
1123       --    --  Path_Name: not used
1124       --    --  Expr_Kind: variable kind
1125       --    --  Field1:    project (if specified)
1126       --    --  Field2:    package (if specified)
1127       --    --  Field3:    type of variable (N_String_Type_Declaration), if any
1128       --    --  Value:     not used
1129
1130       --    N_External_Value,
1131       --    --  Name:      not used
1132       --    --  Path_Name: not used
1133       --    --  Expr_Kind: Single
1134       --    --  Field1:    Name of the external reference (literal string)
1135       --    --  Field2:    Default (literal string)
1136       --    --  Field3:    not used
1137       --    --  Value:     not used
1138
1139       --    N_Attribute_Reference,
1140       --    --  Name:      attribute name
1141       --    --  Path_Name: not used
1142       --    --  Expr_Kind: attribute kind
1143       --    --  Field1:    project
1144       --    --  Field2:    package (if attribute of a package)
1145       --    --  Field3:    not used
1146       --    --  Value:     associative array index
1147       --    --             (if an associative array element)
1148
1149       --    N_Case_Construction,
1150       --    --  Name:      not used
1151       --    --  Path_Name: not used
1152       --    --  Expr_Kind: Undefined
1153       --    --  Field1:    case variable reference
1154       --    --  Field2:    first case item
1155       --    --  Field3:    not used
1156       --    --  Value:     not used
1157
1158       --    N_Case_Item
1159       --    --  Name:      not used
1160       --    --  Path_Name: not used
1161       --    --  Expr_Kind: not used
1162       --    --  Field1:    first choice (literal string), or Empty_Node
1163       --    --             for when others
1164       --    --  Field2:    first declarative item
1165       --    --  Field3:    next case item
1166       --    --  Value:     not used
1167
1168       --    N_Comment_zones
1169       --    --  Name:      not used
1170       --    --  Path_Name: not used
1171       --    --  Expr_Kind: not used
1172       --    --  Field1:    comment before the construct
1173       --    --  Field2:    comment after the construct
1174       --    --  Field3:    comment before the "end" of the construct
1175       --    --  Value:     end of line comment
1176       --    --  Comments:  comment after the "end" of the construct
1177
1178       --    N_Comment
1179       --    --  Name:      not used
1180       --    --  Path_Name: not used
1181       --    --  Expr_Kind: not used
1182       --    --  Field1:    not used
1183       --    --  Field2:    not used
1184       --    --  Field3:    not used
1185       --    --  Value:     comment
1186       --    --  Flag1:     comment is preceded by an empty line
1187       --    --  Flag2:     comment is followed by an empty line
1188       --    --  Comments:  next comment
1189
1190       package Project_Node_Table is
1191         new GNAT.Dynamic_Tables
1192           (Table_Component_Type => Project_Node_Record,
1193            Table_Index_Type     => Project_Node_Id,
1194            Table_Low_Bound      => First_Node_Id,
1195            Table_Initial        => Project_Nodes_Initial,
1196            Table_Increment      => Project_Nodes_Increment);
1197       --  This table contains the syntactic tree of project data
1198       --  from project files.
1199
1200       type Project_Name_And_Node is record
1201          Name : Name_Id;
1202          --  Name of the project
1203
1204          Node : Project_Node_Id;
1205          --  Node of the project in table Project_Nodes
1206
1207          Canonical_Path : Name_Id;
1208          --  Resolved and canonical path of the project file
1209
1210          Extended : Boolean;
1211          --  True when the project is being extended by another project
1212       end record;
1213
1214       No_Project_Name_And_Node : constant Project_Name_And_Node :=
1215         (Name           => No_Name,
1216          Node           => Empty_Node,
1217          Canonical_Path => No_Name,
1218          Extended       => True);
1219
1220       package Projects_Htable is new GNAT.Dynamic_HTables.Simple_HTable
1221         (Header_Num => Header_Num,
1222          Element    => Project_Name_And_Node,
1223          No_Element => No_Project_Name_And_Node,
1224          Key        => Name_Id,
1225          Hash       => Hash,
1226          Equal      => "=");
1227       --  This hash table contains a mapping of project names to project nodes.
1228       --  Note that this hash table contains only the nodes whose Kind is
1229       --  N_Project. It is used to find the node of a project from its
1230       --  name, and to verify if a project has already been parsed, knowing
1231       --  its name.
1232
1233    end Tree_Private_Part;
1234
1235    type Project_Node_Tree_Data is record
1236       Project_Nodes : Tree_Private_Part.Project_Node_Table.Instance;
1237       Projects_HT   : Tree_Private_Part.Projects_Htable.Instance;
1238    end record;
1239    --  The data for a project node tree
1240
1241 private
1242    type Comment_Array is array (Positive range <>) of Comment_Data;
1243    type Comments_Ptr is access Comment_Array;
1244
1245    type Comment_State is record
1246       End_Of_Line_Node   : Project_Node_Id := Empty_Node;
1247
1248       Previous_Line_Node : Project_Node_Id := Empty_Node;
1249
1250       Previous_End_Node  : Project_Node_Id := Empty_Node;
1251
1252       Unkept_Comments    : Boolean := False;
1253
1254       Comments           : Comments_Ptr := null;
1255    end record;
1256
1257 end Prj.Tree;