OSDN Git Service

./:
[pf3gnuchains/gcc-fork.git] / gcc / ada / prj-tree.adb
index e8603c6..e2f7f2d 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---             Copyright (C) 2001-2004 Free Software Foundation, Inc.       --
+--          Copyright (C) 2001-2007, Free Software Foundation, Inc.         --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -16,8 +16,8 @@
 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
 -- for  more details.  You should have  received  a copy of the GNU General --
 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
--- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
--- MA 02111-1307, USA.                                                      --
+-- to  the  Free Software Foundation,  51  Franklin  Street,  Fifth  Floor, --
+-- Boston, MA 02110-1301, USA.                                              --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
@@ -76,7 +76,8 @@ package body Prj.Tree is
    --  Set to True when some comments may not be associated with any node
 
    function Comment_Zones_Of
-     (Node : Project_Node_Id) return Project_Node_Id;
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id;
    --  Returns the ID of the N_Comment_Zones node associated with node Node.
    --  If there is not already an N_Comment_Zones node, create one and
    --  associate it with node Node.
@@ -85,7 +86,10 @@ package body Prj.Tree is
    -- Add_Comments --
    ------------------
 
-   procedure Add_Comments (To : Project_Node_Id; Where : Comment_Location) is
+   procedure Add_Comments
+     (To       : Project_Node_Id;
+      In_Tree  : Project_Node_Tree_Ref;
+      Where    : Comment_Location) is
       Zone     : Project_Node_Id := Empty_Node;
       Previous : Project_Node_Id := Empty_Node;
 
@@ -93,25 +97,27 @@ package body Prj.Tree is
       pragma Assert
         (To /= Empty_Node
           and then
-         Project_Nodes.Table (To).Kind /= N_Comment);
+         In_Tree.Project_Nodes.Table (To).Kind /= N_Comment);
 
-      Zone := Project_Nodes.Table (To).Comments;
+      Zone := In_Tree.Project_Nodes.Table (To).Comments;
 
       if Zone = Empty_Node then
 
          --  Create new N_Comment_Zones node
 
-         Project_Nodes.Increment_Last;
-         Project_Nodes.Table (Project_Nodes.Last) :=
+         Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
+         In_Tree.Project_Nodes.Table
+           (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
            (Kind             => N_Comment_Zones,
             Expr_Kind        => Undefined,
             Location         => No_Location,
-            Directory        => No_Name,
+            Directory        => No_Path,
             Variables        => Empty_Node,
             Packages         => Empty_Node,
             Pkg_Id           => Empty_Package,
             Name             => No_Name,
-            Path_Name        => No_Name,
+            Src_Index        => 0,
+            Path_Name        => No_Path,
             Value            => No_Name,
             Field1           => Empty_Node,
             Field2           => Empty_Node,
@@ -120,12 +126,12 @@ package body Prj.Tree is
             Flag2            => False,
             Comments         => Empty_Node);
 
-         Zone := Project_Nodes.Last;
-         Project_Nodes.Table (To).Comments := Zone;
+         Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
+         In_Tree.Project_Nodes.Table (To).Comments := Zone;
       end if;
 
       if Where = End_Of_Line then
-         Project_Nodes.Table (Zone).Value := Comments.Table (1).Value;
+         In_Tree.Project_Nodes.Table (Zone).Value := Comments.Table (1).Value;
 
       else
          --  Get each comments in the Comments table and link them to node To
@@ -144,20 +150,22 @@ package body Prj.Tree is
                return;
             end if;
 
-            Project_Nodes.Increment_Last;
-            Project_Nodes.Table (Project_Nodes.Last) :=
+            Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
+            In_Tree.Project_Nodes.Table
+              (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
               (Kind             => N_Comment,
                Expr_Kind        => Undefined,
                Flag1            => Comments.Table (J).Follows_Empty_Line,
                Flag2            =>
                  Comments.Table (J).Is_Followed_By_Empty_Line,
                Location         => No_Location,
-               Directory        => No_Name,
+               Directory        => No_Path,
                Variables        => Empty_Node,
                Packages         => Empty_Node,
                Pkg_Id           => Empty_Package,
                Name             => No_Name,
-               Path_Name        => No_Name,
+               Src_Index        => 0,
+               Path_Name        => No_Path,
                Value            => Comments.Table (J).Value,
                Field1           => Empty_Node,
                Field2           => Empty_Node,
@@ -170,16 +178,20 @@ package body Prj.Tree is
             if Previous = Empty_Node then
                case Where is
                   when Before =>
-                     Project_Nodes.Table (Zone).Field1 := Project_Nodes.Last;
+                     In_Tree.Project_Nodes.Table (Zone).Field1 :=
+                       Project_Node_Table.Last (In_Tree.Project_Nodes);
 
                   when After =>
-                     Project_Nodes.Table (Zone).Field2 := Project_Nodes.Last;
+                     In_Tree.Project_Nodes.Table (Zone).Field2 :=
+                       Project_Node_Table.Last (In_Tree.Project_Nodes);
 
                   when Before_End =>
-                     Project_Nodes.Table (Zone).Field3 := Project_Nodes.Last;
+                     In_Tree.Project_Nodes.Table (Zone).Field3 :=
+                       Project_Node_Table.Last (In_Tree.Project_Nodes);
 
                   when After_End =>
-                     Project_Nodes.Table (Zone).Comments := Project_Nodes.Last;
+                     In_Tree.Project_Nodes.Table (Zone).Comments :=
+                       Project_Node_Table.Last (In_Tree.Project_Nodes);
 
                   when End_Of_Line =>
                      null;
@@ -188,13 +200,14 @@ package body Prj.Tree is
             else
                --  When it is not the first, link it to the previous one
 
-               Project_Nodes.Table (Previous).Comments := Project_Nodes.Last;
+               In_Tree.Project_Nodes.Table (Previous).Comments :=
+                 Project_Node_Table.Last (In_Tree.Project_Nodes);
             end if;
 
             --  This node becomes the previous one for the next comment, if
             --  there is one.
 
-            Previous := Project_Nodes.Last;
+            Previous := Project_Node_Table.Last (In_Tree.Project_Nodes);
          end loop;
       end if;
 
@@ -204,22 +217,22 @@ package body Prj.Tree is
       Comments.Set_Last (0);
    end Add_Comments;
 
-
    --------------------------------
    -- Associative_Array_Index_Of --
    --------------------------------
 
    function Associative_Array_Index_Of
-     (Node : Project_Node_Id) return Name_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Name_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      return Project_Nodes.Table (Node).Value;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      return In_Tree.Project_Nodes.Table (Node).Value;
    end Associative_Array_Index_Of;
 
    ----------------------------
@@ -227,14 +240,15 @@ package body Prj.Tree is
    ----------------------------
 
    function Associative_Package_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
-      return Project_Nodes.Table (Node).Field3;
+          (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end Associative_Package_Of;
 
    ----------------------------
@@ -242,29 +256,32 @@ package body Prj.Tree is
    ----------------------------
 
    function Associative_Project_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
-      return Project_Nodes.Table (Node).Field2;
+          (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Associative_Project_Of;
 
    ----------------------
    -- Case_Insensitive --
    ----------------------
 
-   function Case_Insensitive (Node : Project_Node_Id) return Boolean is
+   function Case_Insensitive
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Boolean is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      return Project_Nodes.Table (Node).Flag1;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      return In_Tree.Project_Nodes.Table (Node).Flag1;
    end Case_Insensitive;
 
    --------------------------------
@@ -272,14 +289,15 @@ package body Prj.Tree is
    --------------------------------
 
    function Case_Variable_Reference_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Construction);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Case_Variable_Reference_Of;
 
    ----------------------
@@ -287,30 +305,32 @@ package body Prj.Tree is
    ----------------------
 
    function Comment_Zones_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
       Zone : Project_Node_Id;
 
    begin
       pragma Assert (Node /= Empty_Node);
-      Zone := Project_Nodes.Table (Node).Comments;
+      Zone := In_Tree.Project_Nodes.Table (Node).Comments;
 
       --  If there is not already an N_Comment_Zones associated, create a new
       --  one and associate it with node Node.
 
       if Zone = Empty_Node then
-         Project_Nodes.Increment_Last;
-         Zone := Project_Nodes.Last;
-         Project_Nodes.Table (Zone) :=
+         Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
+         Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
+         In_Tree.Project_Nodes.Table (Zone) :=
         (Kind             => N_Comment_Zones,
          Location         => No_Location,
-         Directory        => No_Name,
+         Directory        => No_Path,
          Expr_Kind        => Undefined,
          Variables        => Empty_Node,
          Packages         => Empty_Node,
          Pkg_Id           => Empty_Package,
          Name             => No_Name,
-         Path_Name        => No_Name,
+         Src_Index        => 0,
+         Path_Name        => No_Path,
          Value            => No_Name,
          Field1           => Empty_Node,
          Field2           => Empty_Node,
@@ -318,7 +338,7 @@ package body Prj.Tree is
          Flag1            => False,
          Flag2            => False,
          Comments         => Empty_Node);
-         Project_Nodes.Table (Node).Comments := Zone;
+         In_Tree.Project_Nodes.Table (Node).Comments := Zone;
       end if;
 
       return Zone;
@@ -329,14 +349,15 @@ package body Prj.Tree is
    -----------------------
 
    function Current_Item_Node
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Declarative_Item);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Current_Item_Node;
 
    ------------------
@@ -344,14 +365,15 @@ package body Prj.Tree is
    ------------------
 
    function Current_Term
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Term);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Current_Term;
 
    --------------------------
@@ -359,7 +381,8 @@ package body Prj.Tree is
    --------------------------
 
    function Default_Project_Node
-     (Of_Kind       : Project_Node_Kind;
+     (In_Tree       : Project_Node_Tree_Ref;
+      Of_Kind       : Project_Node_Kind;
       And_Expr_Kind : Variable_Kind := Undefined) return Project_Node_Id
    is
       Result   : Project_Node_Id;
@@ -369,17 +392,19 @@ package body Prj.Tree is
    begin
       --  Create new node with specified kind and expression kind
 
-      Project_Nodes.Increment_Last;
-      Project_Nodes.Table (Project_Nodes.Last) :=
+      Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
+      In_Tree.Project_Nodes.Table
+        (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
         (Kind             => Of_Kind,
          Location         => No_Location,
-         Directory        => No_Name,
+         Directory        => No_Path,
          Expr_Kind        => And_Expr_Kind,
          Variables        => Empty_Node,
          Packages         => Empty_Node,
          Pkg_Id           => Empty_Package,
          Name             => No_Name,
-         Path_Name        => No_Name,
+         Src_Index        => 0,
+         Path_Name        => No_Path,
          Value            => No_Name,
          Field1           => Empty_Node,
          Field2           => Empty_Node,
@@ -390,7 +415,7 @@ package body Prj.Tree is
 
       --  Save the new node for the returned value
 
-      Result := Project_Nodes.Last;
+      Result := Project_Node_Table.Last (In_Tree.Project_Nodes);
 
       if Comments.Last > 0 then
 
@@ -401,17 +426,19 @@ package body Prj.Tree is
 
          elsif Of_Kind /= N_Comment and then Of_Kind /= N_Comment_Zones then
 
-            Project_Nodes.Increment_Last;
-            Project_Nodes.Table (Project_Nodes.Last) :=
+            Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
+            In_Tree.Project_Nodes.Table
+              (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
               (Kind             => N_Comment_Zones,
                Expr_Kind        => Undefined,
                Location         => No_Location,
-               Directory        => No_Name,
+               Directory        => No_Path,
                Variables        => Empty_Node,
                Packages         => Empty_Node,
                Pkg_Id           => Empty_Package,
                Name             => No_Name,
-               Path_Name        => No_Name,
+               Src_Index        => 0,
+               Path_Name        => No_Path,
                Value            => No_Name,
                Field1           => Empty_Node,
                Field2           => Empty_Node,
@@ -420,28 +447,30 @@ package body Prj.Tree is
                Flag2            => False,
                Comments         => Empty_Node);
 
-            Zone := Project_Nodes.Last;
-            Project_Nodes.Table (Result).Comments := Zone;
+            Zone := Project_Node_Table.Last (In_Tree.Project_Nodes);
+            In_Tree.Project_Nodes.Table (Result).Comments := Zone;
             Previous := Empty_Node;
 
             for J in 1 .. Comments.Last loop
 
                --  Create a new N_Comment node
 
-               Project_Nodes.Increment_Last;
-               Project_Nodes.Table (Project_Nodes.Last) :=
+               Project_Node_Table.Increment_Last (In_Tree.Project_Nodes);
+               In_Tree.Project_Nodes.Table
+                 (Project_Node_Table.Last (In_Tree.Project_Nodes)) :=
                  (Kind             => N_Comment,
                   Expr_Kind        => Undefined,
                   Flag1            => Comments.Table (J).Follows_Empty_Line,
                   Flag2            =>
                     Comments.Table (J).Is_Followed_By_Empty_Line,
                   Location         => No_Location,
-                  Directory        => No_Name,
+                  Directory        => No_Path,
                   Variables        => Empty_Node,
                   Packages         => Empty_Node,
                   Pkg_Id           => Empty_Package,
                   Name             => No_Name,
-                  Path_Name        => No_Name,
+                  Src_Index        => 0,
+                  Path_Name        => No_Path,
                   Value            => Comments.Table (J).Value,
                   Field1           => Empty_Node,
                   Field2           => Empty_Node,
@@ -452,17 +481,18 @@ package body Prj.Tree is
                --  otherwise to the previous one.
 
                if Previous = Empty_Node then
-                  Project_Nodes.Table (Zone).Field1 := Project_Nodes.Last;
+                  In_Tree.Project_Nodes.Table (Zone).Field1 :=
+                    Project_Node_Table.Last (In_Tree.Project_Nodes);
 
                else
-                  Project_Nodes.Table (Previous).Comments :=
-                    Project_Nodes.Last;
+                  In_Tree.Project_Nodes.Table (Previous).Comments :=
+                    Project_Node_Table.Last (In_Tree.Project_Nodes);
                end if;
 
                --  This new node will be the previous one for the next
                --  N_Comment node, if there is one.
 
-               Previous := Project_Nodes.Last;
+               Previous := Project_Node_Table.Last (In_Tree.Project_Nodes);
             end loop;
 
             --  Empty the Comments table after all comments have been processed
@@ -478,30 +508,34 @@ package body Prj.Tree is
    -- Directory_Of --
    ------------------
 
-   function Directory_Of (Node : Project_Node_Id) return Name_Id is
+   function Directory_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Path_Name_Type is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      return Project_Nodes.Table (Node).Directory;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      return In_Tree.Project_Nodes.Table (Node).Directory;
    end Directory_Of;
 
    -------------------------
    -- End_Of_Line_Comment --
    -------------------------
 
-   function End_Of_Line_Comment (Node : Project_Node_Id) return Name_Id is
+   function End_Of_Line_Comment
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Name_Id is
       Zone : Project_Node_Id := Empty_Node;
 
    begin
       pragma Assert (Node /= Empty_Node);
-      Zone := Project_Nodes.Table (Node).Comments;
+      Zone := In_Tree.Project_Nodes.Table (Node).Comments;
 
       if Zone = Empty_Node then
          return No_Name;
       else
-         return Project_Nodes.Table (Zone).Value;
+         return In_Tree.Project_Nodes.Table (Zone).Value;
       end if;
    end End_Of_Line_Comment;
 
@@ -509,30 +543,34 @@ package body Prj.Tree is
    -- Expression_Kind_Of --
    ------------------------
 
-   function Expression_Kind_Of (Node : Project_Node_Id) return Variable_Kind is
+   function Expression_Kind_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Variable_Kind is
    begin
       pragma Assert
         (Node /= Empty_Node
            and then
-             (Project_Nodes.Table (Node).Kind = N_Literal_String
+             (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
                 or else
-              Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Variable_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind =
+                       N_Typed_Variable_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Package_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Expression
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
                 or else
-              Project_Nodes.Table (Node).Kind = N_Term
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Term
                 or else
-              Project_Nodes.Table (Node).Kind = N_Variable_Reference
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
                 or else
-              Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+              In_Tree.Project_Nodes.Table (Node).Kind =
+                        N_Attribute_Reference));
 
-      return Project_Nodes.Table (Node).Expr_Kind;
+      return In_Tree.Project_Nodes.Table (Node).Expr_Kind;
    end Expression_Kind_Of;
 
    -------------------
@@ -540,19 +578,23 @@ package body Prj.Tree is
    -------------------
 
    function Expression_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Attribute_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Typed_Variable_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Variable_Declaration));
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Variable_Declaration));
 
-      return Project_Nodes.Table (Node).Field1;
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Expression_Of;
 
    -------------------------
@@ -560,14 +602,15 @@ package body Prj.Tree is
    -------------------------
 
    function Extended_Project_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project_Declaration);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Extended_Project_Of;
 
    ------------------------------
@@ -575,28 +618,30 @@ package body Prj.Tree is
    ------------------------------
 
    function Extended_Project_Path_Of
-     (Node : Project_Node_Id) return Name_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Path_Name_Type
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      return Project_Nodes.Table (Node).Value;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      return Path_Name_Type (In_Tree.Project_Nodes.Table (Node).Value);
    end Extended_Project_Path_Of;
 
    --------------------------
    -- Extending_Project_Of --
    --------------------------
    function Extending_Project_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project_Declaration);
-      return Project_Nodes.Table (Node).Field3;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end Extending_Project_Of;
 
    ---------------------------
@@ -604,14 +649,15 @@ package body Prj.Tree is
    ---------------------------
 
    function External_Reference_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_External_Value);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end External_Reference_Of;
 
    -------------------------
@@ -619,15 +665,16 @@ package body Prj.Tree is
    -------------------------
 
    function External_Default_Of
-     (Node : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
       return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_External_Value);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end External_Default_Of;
 
    ------------------------
@@ -635,14 +682,15 @@ package body Prj.Tree is
    ------------------------
 
    function First_Case_Item_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Construction);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end First_Case_Item_Of;
 
    ---------------------
@@ -650,15 +698,16 @@ package body Prj.Tree is
    ---------------------
 
    function First_Choice_Of
-     (Node : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
       return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Item);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end First_Choice_Of;
 
    -------------------------
@@ -666,18 +715,19 @@ package body Prj.Tree is
    -------------------------
 
    function First_Comment_After
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
       Zone : Project_Node_Id := Empty_Node;
    begin
       pragma Assert (Node /= Empty_Node);
-      Zone := Project_Nodes.Table (Node).Comments;
+      Zone := In_Tree.Project_Nodes.Table (Node).Comments;
 
       if Zone = Empty_Node then
          return Empty_Node;
 
       else
-         return Project_Nodes.Table (Zone).Field2;
+         return In_Tree.Project_Nodes.Table (Zone).Field2;
       end if;
    end First_Comment_After;
 
@@ -686,20 +736,21 @@ package body Prj.Tree is
    -----------------------------
 
    function First_Comment_After_End
-     (Node : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
       return Project_Node_Id
    is
       Zone : Project_Node_Id := Empty_Node;
 
    begin
       pragma Assert (Node /= Empty_Node);
-      Zone := Project_Nodes.Table (Node).Comments;
+      Zone := In_Tree.Project_Nodes.Table (Node).Comments;
 
       if Zone = Empty_Node then
          return Empty_Node;
 
       else
-         return Project_Nodes.Table (Zone).Comments;
+         return In_Tree.Project_Nodes.Table (Zone).Comments;
       end if;
    end First_Comment_After_End;
 
@@ -708,19 +759,20 @@ package body Prj.Tree is
    --------------------------
 
    function First_Comment_Before
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
       Zone : Project_Node_Id := Empty_Node;
 
    begin
       pragma Assert (Node /= Empty_Node);
-      Zone := Project_Nodes.Table (Node).Comments;
+      Zone := In_Tree.Project_Nodes.Table (Node).Comments;
 
       if Zone = Empty_Node then
          return Empty_Node;
 
       else
-         return Project_Nodes.Table (Zone).Field1;
+         return In_Tree.Project_Nodes.Table (Zone).Field1;
       end if;
    end First_Comment_Before;
 
@@ -729,19 +781,20 @@ package body Prj.Tree is
    ------------------------------
 
    function First_Comment_Before_End
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
       Zone : Project_Node_Id := Empty_Node;
 
    begin
       pragma Assert (Node /= Empty_Node);
-      Zone := Project_Nodes.Table (Node).Comments;
+      Zone := In_Tree.Project_Nodes.Table (Node).Comments;
 
       if Zone = Empty_Node then
          return Empty_Node;
 
       else
-         return Project_Nodes.Table (Zone).Field3;
+         return In_Tree.Project_Nodes.Table (Zone).Field3;
       end if;
    end First_Comment_Before_End;
 
@@ -750,22 +803,23 @@ package body Prj.Tree is
    -------------------------------
 
    function First_Declarative_Item_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project_Declaration
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Case_Item
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
                or else
-             Project_Nodes.Table (Node).Kind = N_Package_Declaration));
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
 
-      if Project_Nodes.Table (Node).Kind = N_Project_Declaration then
-         return Project_Nodes.Table (Node).Field1;
+      if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
+         return In_Tree.Project_Nodes.Table (Node).Field1;
       else
-         return Project_Nodes.Table (Node).Field2;
+         return In_Tree.Project_Nodes.Table (Node).Field2;
       end if;
    end First_Declarative_Item_Of;
 
@@ -774,14 +828,15 @@ package body Prj.Tree is
    ------------------------------
 
    function First_Expression_In_List
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Literal_String_List);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end First_Expression_In_List;
 
    --------------------------
@@ -789,14 +844,16 @@ package body Prj.Tree is
    --------------------------
 
    function First_Literal_String
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_String_Type_Declaration);
-      return Project_Nodes.Table (Node).Field1;
+         In_Tree.Project_Nodes.Table (Node).Kind =
+           N_String_Type_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end First_Literal_String;
 
    ----------------------
@@ -804,14 +861,15 @@ package body Prj.Tree is
    ----------------------
 
    function First_Package_Of
-     (Node : Project_Node_Id) return Package_Declaration_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Package_Declaration_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      return Project_Nodes.Table (Node).Packages;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      return In_Tree.Project_Nodes.Table (Node).Packages;
    end First_Package_Of;
 
    --------------------------
@@ -819,14 +877,15 @@ package body Prj.Tree is
    --------------------------
 
    function First_String_Type_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      return Project_Nodes.Table (Node).Field3;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end First_String_Type_Of;
 
    ----------------
@@ -834,14 +893,15 @@ package body Prj.Tree is
    ----------------
 
    function First_Term
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Expression);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end First_Term;
 
    -----------------------
@@ -849,17 +909,18 @@ package body Prj.Tree is
    -----------------------
 
    function First_Variable_Of
-     (Node : Project_Node_Id) return Variable_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Variable_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
                or else
-             Project_Nodes.Table (Node).Kind = N_Package_Declaration));
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
 
-      return Project_Nodes.Table (Node).Variables;
+      return In_Tree.Project_Nodes.Table (Node).Variables;
    end First_Variable_Of;
 
    --------------------------
@@ -867,27 +928,30 @@ package body Prj.Tree is
    --------------------------
 
    function First_With_Clause_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end First_With_Clause_Of;
 
    ------------------------
    -- Follows_Empty_Line --
    ------------------------
 
-   function Follows_Empty_Line (Node : Project_Node_Id) return Boolean is
+   function Follows_Empty_Line
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Boolean is
    begin
       pragma Assert
         (Node /= Empty_Node
          and then
-         Project_Nodes.Table (Node).Kind = N_Comment);
-      return Project_Nodes.Table (Node).Flag1;
+         In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
+      return In_Tree.Project_Nodes.Table (Node).Flag1;
    end Follows_Empty_Line;
 
    ----------
@@ -903,10 +967,10 @@ package body Prj.Tree is
    -- Initialize --
    ----------------
 
-   procedure Initialize is
+   procedure Initialize (Tree : Project_Node_Tree_Ref) is
    begin
-      Project_Nodes.Set_Last (Empty_Node);
-      Projects_Htable.Reset;
+      Project_Node_Table.Init (Tree.Project_Nodes);
+      Projects_Htable.Reset (Tree.Projects_HT);
    end Initialize;
 
    -------------------------------
@@ -914,40 +978,60 @@ package body Prj.Tree is
    -------------------------------
 
    function Is_Followed_By_Empty_Line
-     (Node : Project_Node_Id) return Boolean
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Boolean
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Comment);
-      return Project_Nodes.Table (Node).Flag2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
+      return In_Tree.Project_Nodes.Table (Node).Flag2;
    end Is_Followed_By_Empty_Line;
 
    ----------------------
    -- Is_Extending_All --
    ----------------------
 
-   function Is_Extending_All (Node  : Project_Node_Id) return Boolean is
+   function Is_Extending_All
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Boolean is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-           (Project_Nodes.Table (Node).Kind = N_Project
+           (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
               or else
-            Project_Nodes.Table (Node).Kind = N_With_Clause));
-      return Project_Nodes.Table (Node).Flag2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
+      return In_Tree.Project_Nodes.Table (Node).Flag2;
    end Is_Extending_All;
 
+   -------------------------
+   -- Is_Not_Last_In_List --
+   -------------------------
+
+   function Is_Not_Last_In_List
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Boolean is
+   begin
+      pragma Assert
+        (Node /= Empty_Node
+          and then
+            In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
+      return In_Tree.Project_Nodes.Table (Node).Flag1;
+   end Is_Not_Last_In_List;
+
    -------------------------------------
    -- Imported_Or_Extended_Project_Of --
    -------------------------------------
 
    function Imported_Or_Extended_Project_Of
      (Project   : Project_Node_Id;
+      In_Tree   : Project_Node_Tree_Ref;
       With_Name : Name_Id) return Project_Node_Id
    is
-      With_Clause : Project_Node_Id := First_With_Clause_Of (Project);
+      With_Clause : Project_Node_Id :=
+        First_With_Clause_Of (Project, In_Tree);
       Result      : Project_Node_Id := Empty_Node;
 
    begin
@@ -958,18 +1042,21 @@ package body Prj.Tree is
          --  Only non limited imported project may be used as prefix
          --  of variable or attributes.
 
-         Result := Non_Limited_Project_Node_Of (With_Clause);
-         exit when Result /= Empty_Node and then Name_Of (Result) = With_Name;
-         With_Clause := Next_With_Clause_Of (With_Clause);
+         Result := Non_Limited_Project_Node_Of (With_Clause, In_Tree);
+         exit when Result /= Empty_Node
+           and then Name_Of (Result, In_Tree) = With_Name;
+         With_Clause := Next_With_Clause_Of (With_Clause, In_Tree);
       end loop;
 
       --  If it is not an imported project, it might be the imported project
 
       if With_Clause = Empty_Node then
-         Result := Extended_Project_Of (Project_Declaration_Of (Project));
+         Result :=
+           Extended_Project_Of
+             (Project_Declaration_Of (Project, In_Tree), In_Tree);
 
          if Result /= Empty_Node
-           and then Name_Of (Result) /= With_Name
+           and then Name_Of (Result, In_Tree) /= With_Name
          then
             Result := Empty_Node;
          end if;
@@ -982,30 +1069,36 @@ package body Prj.Tree is
    -- Kind_Of --
    -------------
 
-   function Kind_Of (Node : Project_Node_Id) return Project_Node_Kind is
+   function Kind_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Kind is
    begin
       pragma Assert (Node /= Empty_Node);
-      return Project_Nodes.Table (Node).Kind;
+      return In_Tree.Project_Nodes.Table (Node).Kind;
    end Kind_Of;
 
    -----------------
    -- Location_Of --
    -----------------
 
-   function Location_Of (Node : Project_Node_Id) return Source_Ptr is
+   function Location_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Source_Ptr is
    begin
       pragma Assert (Node /= Empty_Node);
-      return Project_Nodes.Table (Node).Location;
+      return In_Tree.Project_Nodes.Table (Node).Location;
    end Location_Of;
 
    -------------
    -- Name_Of --
    -------------
 
-   function Name_Of (Node : Project_Node_Id) return Name_Id is
+   function Name_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Name_Id is
    begin
       pragma Assert (Node /= Empty_Node);
-      return Project_Nodes.Table (Node).Name;
+      return In_Tree.Project_Nodes.Table (Node).Name;
    end Name_Of;
 
    --------------------
@@ -1013,27 +1106,30 @@ package body Prj.Tree is
    --------------------
 
    function Next_Case_Item
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Item);
-      return Project_Nodes.Table (Node).Field3;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end Next_Case_Item;
 
    ------------------
    -- Next_Comment --
    ------------------
 
-   function Next_Comment (Node : Project_Node_Id) return Project_Node_Id is
+   function Next_Comment
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Comment);
-      return Project_Nodes.Table (Node).Comments;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
+      return In_Tree.Project_Nodes.Table (Node).Comments;
    end Next_Comment;
 
    ---------------------------
@@ -1041,14 +1137,15 @@ package body Prj.Tree is
    ---------------------------
 
    function Next_Declarative_Item
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Declarative_Item);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Next_Declarative_Item;
 
    -----------------------------
@@ -1056,14 +1153,15 @@ package body Prj.Tree is
    -----------------------------
 
    function Next_Expression_In_List
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Expression);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Next_Expression_In_List;
 
    -------------------------
@@ -1071,15 +1169,16 @@ package body Prj.Tree is
    -------------------------
 
    function Next_Literal_String
-     (Node : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
       return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Literal_String);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Next_Literal_String;
 
    -----------------------------
@@ -1087,14 +1186,15 @@ package body Prj.Tree is
    -----------------------------
 
    function Next_Package_In_Project
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Package_Declaration);
-      return Project_Nodes.Table (Node).Field3;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end Next_Package_In_Project;
 
    ----------------------
@@ -1102,15 +1202,17 @@ package body Prj.Tree is
    ----------------------
 
    function Next_String_Type
-     (Node : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
       return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_String_Type_Declaration);
-      return Project_Nodes.Table (Node).Field2;
+         In_Tree.Project_Nodes.Table (Node).Kind =
+           N_String_Type_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Next_String_Type;
 
    ---------------
@@ -1118,14 +1220,15 @@ package body Prj.Tree is
    ---------------
 
    function Next_Term
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Term);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Next_Term;
 
    -------------------
@@ -1133,18 +1236,21 @@ package body Prj.Tree is
    -------------------
 
    function Next_Variable
-     (Node : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
       return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Typed_Variable_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Variable_Declaration));
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Variable_Declaration));
 
-      return Project_Nodes.Table (Node).Field3;
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end Next_Variable;
 
    -------------------------
@@ -1152,14 +1258,15 @@ package body Prj.Tree is
    -------------------------
 
    function Next_With_Clause_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_With_Clause);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Next_With_Clause_Of;
 
    ---------------------------------
@@ -1167,27 +1274,31 @@ package body Prj.Tree is
    ---------------------------------
 
    function Non_Limited_Project_Node_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-           (Project_Nodes.Table (Node).Kind = N_With_Clause));
-      return Project_Nodes.Table (Node).Field3;
+           (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
+      return In_Tree.Project_Nodes.Table (Node).Field3;
    end Non_Limited_Project_Node_Of;
 
    -------------------
    -- Package_Id_Of --
    -------------------
 
-   function Package_Id_Of (Node : Project_Node_Id) return Package_Node_Id is
+   function Package_Id_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Package_Node_Id
+   is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Package_Declaration);
-      return Project_Nodes.Table (Node).Pkg_Id;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Pkg_Id;
    end Package_Id_Of;
 
    ---------------------
@@ -1195,31 +1306,35 @@ package body Prj.Tree is
    ---------------------
 
    function Package_Node_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Variable_Reference
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
                or else
-             Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      return Project_Nodes.Table (Node).Field2;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Package_Node_Of;
 
    ------------------
    -- Path_Name_Of --
    ------------------
 
-   function Path_Name_Of (Node : Project_Node_Id) return Name_Id is
+   function Path_Name_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Path_Name_Type
+   is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
                or else
-             Project_Nodes.Table (Node).Kind = N_With_Clause));
-      return Project_Nodes.Table (Node).Path_Name;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
+      return In_Tree.Project_Nodes.Table (Node).Path_Name;
    end Path_Name_Of;
 
    ----------------------------
@@ -1227,14 +1342,15 @@ package body Prj.Tree is
    ----------------------------
 
    function Project_Declaration_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      return Project_Nodes.Table (Node).Field2;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      return In_Tree.Project_Nodes.Table (Node).Field2;
    end Project_Declaration_Of;
 
    -------------------------------------------
@@ -1242,11 +1358,13 @@ package body Prj.Tree is
    -------------------------------------------
 
    function Project_File_Includes_Unkept_Comments
-     (Node : Project_Node_Id) return Boolean
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Boolean
    is
-      Declaration : constant Project_Node_Id := Project_Declaration_Of (Node);
+      Declaration : constant Project_Node_Id :=
+                      Project_Declaration_Of (Node, In_Tree);
    begin
-      return Project_Nodes.Table (Declaration).Flag1;
+      return In_Tree.Project_Nodes.Table (Declaration).Flag1;
    end Project_File_Includes_Unkept_Comments;
 
    ---------------------
@@ -1254,18 +1372,19 @@ package body Prj.Tree is
    ---------------------
 
    function Project_Node_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-           (Project_Nodes.Table (Node).Kind = N_With_Clause
+           (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
               or else
-            Project_Nodes.Table (Node).Kind = N_Variable_Reference
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
               or else
-            Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Project_Node_Of;
 
    -----------------------------------
@@ -1273,14 +1392,15 @@ package body Prj.Tree is
    -----------------------------------
 
    function Project_Of_Renamed_Package_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Package_Declaration);
-      return Project_Nodes.Table (Node).Field1;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
+      return In_Tree.Project_Nodes.Table (Node).Field1;
    end Project_Of_Renamed_Package_Of;
 
    --------------------------
@@ -1309,7 +1429,7 @@ package body Prj.Tree is
    -- Restore --
    -------------
 
-   procedure Restore (S : in Comment_State) is
+   procedure Restore (S : Comment_State) is
    begin
       End_Of_Line_Node   := S.End_Of_Line_Node;
       Previous_Line_Node := S.Previous_Line_Node;
@@ -1349,8 +1469,9 @@ package body Prj.Tree is
    -- Scan --
    ----------
 
-   procedure Scan is
+   procedure Scan (In_Tree : Project_Node_Tree_Ref) is
       Empty_Line : Boolean := False;
+
    begin
       --  If there are comments, then they will not be kept. Set the flag and
       --  clear the comments.
@@ -1395,9 +1516,9 @@ package body Prj.Tree is
                elsif End_Of_Line_Node /= Empty_Node then
                   declare
                      Zones : constant Project_Node_Id :=
-                               Comment_Zones_Of (End_Of_Line_Node);
+                               Comment_Zones_Of (End_Of_Line_Node, In_Tree);
                   begin
-                     Project_Nodes.Table (Zones).Value := Comment_Id;
+                     In_Tree.Project_Nodes.Table (Zones).Value := Comment_Id;
                   end;
 
                --  Otherwise, this end of line node cannot be kept
@@ -1419,11 +1540,15 @@ package body Prj.Tree is
                  not Comments.Table (1).Follows_Empty_Line then
                   if Previous_Line_Node /= Empty_Node then
                      Add_Comments
-                       (To => Previous_Line_Node, Where => After);
+                       (To      => Previous_Line_Node,
+                        Where   => After,
+                        In_Tree => In_Tree);
 
                   elsif Previous_End_Node /= Empty_Node then
                      Add_Comments
-                       (To => Previous_End_Node, Where => After_End);
+                       (To      => Previous_End_Node,
+                        Where   => After_End,
+                        In_Tree => In_Tree);
                   end if;
                end if;
 
@@ -1435,8 +1560,9 @@ package body Prj.Tree is
                if Comments.Last > 0 and then Token = Tok_End then
                   if Next_End_Nodes.Last > 0 then
                      Add_Comments
-                       (To => Next_End_Nodes.Table (Next_End_Nodes.Last),
-                        Where => Before_End);
+                       (To      => Next_End_Nodes.Table (Next_End_Nodes.Last),
+                        Where   => Before_End,
+                        In_Tree => In_Tree);
 
                   else
                      Unkept_Comments := True;
@@ -1464,17 +1590,18 @@ package body Prj.Tree is
    ------------------------------------
 
    procedure Set_Associative_Array_Index_Of
-     (Node : Project_Node_Id;
-      To   : Name_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Name_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      Project_Nodes.Table (Node).Value := To;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      In_Tree.Project_Nodes.Table (Node).Value := To;
    end Set_Associative_Array_Index_Of;
 
    --------------------------------
@@ -1482,15 +1609,16 @@ package body Prj.Tree is
    --------------------------------
 
    procedure Set_Associative_Package_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
          (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Attribute_Declaration);
-      Project_Nodes.Table (Node).Field3 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field3 := To;
    end Set_Associative_Package_Of;
 
    --------------------------------
@@ -1498,15 +1626,17 @@ package body Prj.Tree is
    --------------------------------
 
    procedure Set_Associative_Project_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration));
-      Project_Nodes.Table (Node).Field2 := To;
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Attribute_Declaration));
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Associative_Project_Of;
 
    --------------------------
@@ -1514,17 +1644,18 @@ package body Prj.Tree is
    --------------------------
 
    procedure Set_Case_Insensitive
-     (Node : Project_Node_Id;
-      To   : Boolean)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Boolean)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-           (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+           (In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
                or else
-            Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      Project_Nodes.Table (Node).Flag1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      In_Tree.Project_Nodes.Table (Node).Flag1 := To;
    end Set_Case_Insensitive;
 
    ------------------------------------
@@ -1532,15 +1663,16 @@ package body Prj.Tree is
    ------------------------------------
 
    procedure Set_Case_Variable_Reference_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Construction);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_Case_Variable_Reference_Of;
 
    ---------------------------
@@ -1548,15 +1680,16 @@ package body Prj.Tree is
    ---------------------------
 
    procedure Set_Current_Item_Node
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Declarative_Item);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_Current_Item_Node;
 
    ----------------------
@@ -1564,15 +1697,16 @@ package body Prj.Tree is
    ----------------------
 
    procedure Set_Current_Term
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Term);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_Current_Term;
 
    ----------------------
@@ -1580,15 +1714,16 @@ package body Prj.Tree is
    ----------------------
 
    procedure Set_Directory_Of
-     (Node : Project_Node_Id;
-      To   : Name_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Path_Name_Type)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      Project_Nodes.Table (Node).Directory := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      In_Tree.Project_Nodes.Table (Node).Directory := To;
    end Set_Directory_Of;
 
    ---------------------
@@ -1605,31 +1740,34 @@ package body Prj.Tree is
    ----------------------------
 
    procedure Set_Expression_Kind_Of
-     (Node : Project_Node_Id;
-      To   : Variable_Kind)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Variable_Kind)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
            and then
-             (Project_Nodes.Table (Node).Kind = N_Literal_String
+             (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
                 or else
-              Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Variable_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind =
+                N_Typed_Variable_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Package_Declaration
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration
                 or else
-              Project_Nodes.Table (Node).Kind = N_Expression
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Expression
                 or else
-              Project_Nodes.Table (Node).Kind = N_Term
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Term
                 or else
-              Project_Nodes.Table (Node).Kind = N_Variable_Reference
+              In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
                 or else
-              Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      Project_Nodes.Table (Node).Expr_Kind := To;
+              In_Tree.Project_Nodes.Table (Node).Kind =
+                N_Attribute_Reference));
+      In_Tree.Project_Nodes.Table (Node).Expr_Kind := To;
    end Set_Expression_Kind_Of;
 
    -----------------------
@@ -1637,19 +1775,23 @@ package body Prj.Tree is
    -----------------------
 
    procedure Set_Expression_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Attribute_Declaration
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Attribute_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Typed_Variable_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Variable_Declaration));
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Variable_Declaration));
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_Expression_Of;
 
    -------------------------------
@@ -1657,15 +1799,16 @@ package body Prj.Tree is
    -------------------------------
 
    procedure Set_External_Reference_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_External_Value);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_External_Reference_Of;
 
    -----------------------------
@@ -1673,15 +1816,16 @@ package body Prj.Tree is
    -----------------------------
 
    procedure Set_External_Default_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_External_Value);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_External_Value);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_External_Default_Of;
 
    ----------------------------
@@ -1689,15 +1833,16 @@ package body Prj.Tree is
    ----------------------------
 
    procedure Set_First_Case_Item_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Construction);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Construction);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_First_Case_Item_Of;
 
    -------------------------
@@ -1705,15 +1850,16 @@ package body Prj.Tree is
    -------------------------
 
    procedure Set_First_Choice_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Item);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_First_Choice_Of;
 
    -----------------------------
@@ -1721,12 +1867,13 @@ package body Prj.Tree is
    -----------------------------
 
    procedure Set_First_Comment_After
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
-      Zone : constant Project_Node_Id := Comment_Zones_Of (Node);
+      Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
    begin
-      Project_Nodes.Table (Zone).Field2 := To;
+      In_Tree.Project_Nodes.Table (Zone).Field2 := To;
    end Set_First_Comment_After;
 
    ---------------------------------
@@ -1734,12 +1881,13 @@ package body Prj.Tree is
    ---------------------------------
 
    procedure Set_First_Comment_After_End
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
-      Zone : constant Project_Node_Id := Comment_Zones_Of (Node);
+      Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
    begin
-      Project_Nodes.Table (Zone).Comments := To;
+      In_Tree.Project_Nodes.Table (Zone).Comments := To;
    end Set_First_Comment_After_End;
 
    ------------------------------
@@ -1747,13 +1895,14 @@ package body Prj.Tree is
    ------------------------------
 
    procedure Set_First_Comment_Before
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
 
    is
-      Zone : constant Project_Node_Id := Comment_Zones_Of (Node);
+      Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
    begin
-      Project_Nodes.Table (Zone).Field1 := To;
+      In_Tree.Project_Nodes.Table (Zone).Field1 := To;
    end Set_First_Comment_Before;
 
    ----------------------------------
@@ -1761,12 +1910,13 @@ package body Prj.Tree is
    ----------------------------------
 
    procedure Set_First_Comment_Before_End
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
-      Zone : constant Project_Node_Id := Comment_Zones_Of (Node);
+      Zone : constant Project_Node_Id := Comment_Zones_Of (Node, In_Tree);
    begin
-      Project_Nodes.Table (Zone).Field2 := To;
+      In_Tree.Project_Nodes.Table (Zone).Field2 := To;
    end Set_First_Comment_Before_End;
 
    ------------------------
@@ -1774,15 +1924,16 @@ package body Prj.Tree is
    ------------------------
 
    procedure Set_Next_Case_Item
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Case_Item);
-      Project_Nodes.Table (Node).Field3 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item);
+      In_Tree.Project_Nodes.Table (Node).Field3 := To;
    end Set_Next_Case_Item;
 
    ----------------------
@@ -1790,15 +1941,16 @@ package body Prj.Tree is
    ----------------------
 
    procedure Set_Next_Comment
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Comment);
-      Project_Nodes.Table (Node).Comments := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Comment);
+      In_Tree.Project_Nodes.Table (Node).Comments := To;
    end Set_Next_Comment;
 
    -----------------------------------
@@ -1806,23 +1958,24 @@ package body Prj.Tree is
    -----------------------------------
 
    procedure Set_First_Declarative_Item_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project_Declaration
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Case_Item
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Case_Item
                or else
-             Project_Nodes.Table (Node).Kind = N_Package_Declaration));
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
 
-      if Project_Nodes.Table (Node).Kind = N_Project_Declaration then
-         Project_Nodes.Table (Node).Field1 := To;
+      if In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration then
+         In_Tree.Project_Nodes.Table (Node).Field1 := To;
       else
-         Project_Nodes.Table (Node).Field2 := To;
+         In_Tree.Project_Nodes.Table (Node).Field2 := To;
       end if;
    end Set_First_Declarative_Item_Of;
 
@@ -1831,15 +1984,16 @@ package body Prj.Tree is
    ----------------------------------
 
    procedure Set_First_Expression_In_List
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Literal_String_List);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String_List);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_First_Expression_In_List;
 
    ------------------------------
@@ -1847,15 +2001,17 @@ package body Prj.Tree is
    ------------------------------
 
    procedure Set_First_Literal_String
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_String_Type_Declaration);
-      Project_Nodes.Table (Node).Field1 := To;
+         In_Tree.Project_Nodes.Table (Node).Kind =
+           N_String_Type_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_First_Literal_String;
 
    --------------------------
@@ -1863,15 +2019,16 @@ package body Prj.Tree is
    --------------------------
 
    procedure Set_First_Package_Of
-     (Node : Project_Node_Id;
-      To   : Package_Declaration_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Package_Declaration_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      Project_Nodes.Table (Node).Packages := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      In_Tree.Project_Nodes.Table (Node).Packages := To;
    end Set_First_Package_Of;
 
    ------------------------------
@@ -1879,15 +2036,16 @@ package body Prj.Tree is
    ------------------------------
 
    procedure Set_First_String_Type_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      Project_Nodes.Table (Node).Field3 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      In_Tree.Project_Nodes.Table (Node).Field3 := To;
    end Set_First_String_Type_Of;
 
    --------------------
@@ -1895,15 +2053,16 @@ package body Prj.Tree is
    --------------------
 
    procedure Set_First_Term
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Expression);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_First_Term;
 
    ---------------------------
@@ -1911,17 +2070,18 @@ package body Prj.Tree is
    ---------------------------
 
    procedure Set_First_Variable_Of
-     (Node : Project_Node_Id;
-      To   : Variable_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Variable_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
                or else
-             Project_Nodes.Table (Node).Kind = N_Package_Declaration));
-      Project_Nodes.Table (Node).Variables := To;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration));
+      In_Tree.Project_Nodes.Table (Node).Variables := To;
    end Set_First_Variable_Of;
 
    ------------------------------
@@ -1929,43 +2089,64 @@ package body Prj.Tree is
    ------------------------------
 
    procedure Set_First_With_Clause_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_First_With_Clause_Of;
 
    --------------------------
    -- Set_Is_Extending_All --
    --------------------------
 
-   procedure Set_Is_Extending_All (Node  : Project_Node_Id) is
+   procedure Set_Is_Extending_All
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
+   is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
                or else
-             Project_Nodes.Table (Node).Kind = N_With_Clause));
-      Project_Nodes.Table (Node).Flag2 := True;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
+      In_Tree.Project_Nodes.Table (Node).Flag2 := True;
    end Set_Is_Extending_All;
 
+   -----------------------------
+   -- Set_Is_Not_Last_In_List --
+   -----------------------------
+
+   procedure Set_Is_Not_Last_In_List
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref)
+   is
+   begin
+      pragma Assert
+        (Node /= Empty_Node
+          and then
+             In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
+      In_Tree.Project_Nodes.Table (Node).Flag1 := True;
+   end Set_Is_Not_Last_In_List;
+
    -----------------
    -- Set_Kind_Of --
    -----------------
 
    procedure Set_Kind_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Kind)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Kind)
    is
    begin
       pragma Assert (Node /= Empty_Node);
-      Project_Nodes.Table (Node).Kind := To;
+      In_Tree.Project_Nodes.Table (Node).Kind := To;
    end Set_Kind_Of;
 
    ---------------------
@@ -1973,12 +2154,13 @@ package body Prj.Tree is
    ---------------------
 
    procedure Set_Location_Of
-     (Node : Project_Node_Id;
-      To   : Source_Ptr)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Source_Ptr)
    is
    begin
       pragma Assert (Node /= Empty_Node);
-      Project_Nodes.Table (Node).Location := To;
+      In_Tree.Project_Nodes.Table (Node).Location := To;
    end Set_Location_Of;
 
    -----------------------------
@@ -1986,15 +2168,16 @@ package body Prj.Tree is
    -----------------------------
 
    procedure Set_Extended_Project_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project_Declaration);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Extended_Project_Of;
 
    ----------------------------------
@@ -2002,15 +2185,16 @@ package body Prj.Tree is
    ----------------------------------
 
    procedure Set_Extended_Project_Path_Of
-     (Node : Project_Node_Id;
-      To   : Name_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Path_Name_Type)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project);
-      Project_Nodes.Table (Node).Value := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      In_Tree.Project_Nodes.Table (Node).Value := Name_Id (To);
    end Set_Extended_Project_Path_Of;
 
    ------------------------------
@@ -2018,15 +2202,16 @@ package body Prj.Tree is
    ------------------------------
 
    procedure Set_Extending_Project_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Project_Declaration);
-      Project_Nodes.Table (Node).Field3 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Project_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field3 := To;
    end Set_Extending_Project_Of;
 
    -----------------
@@ -2034,12 +2219,13 @@ package body Prj.Tree is
    -----------------
 
    procedure Set_Name_Of
-     (Node : Project_Node_Id;
-      To   : Name_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Name_Id)
    is
    begin
       pragma Assert (Node /= Empty_Node);
-      Project_Nodes.Table (Node).Name := To;
+      In_Tree.Project_Nodes.Table (Node).Name := To;
    end Set_Name_Of;
 
    -------------------------------
@@ -2047,15 +2233,16 @@ package body Prj.Tree is
    -------------------------------
 
    procedure Set_Next_Declarative_Item
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Declarative_Item);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Declarative_Item);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Next_Declarative_Item;
 
    -----------------------
@@ -2073,15 +2260,16 @@ package body Prj.Tree is
    ---------------------------------
 
    procedure Set_Next_Expression_In_List
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Expression);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Expression);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Next_Expression_In_List;
 
    -----------------------------
@@ -2089,15 +2277,16 @@ package body Prj.Tree is
    -----------------------------
 
    procedure Set_Next_Literal_String
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Literal_String);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_Next_Literal_String;
 
    ---------------------------------
@@ -2105,15 +2294,16 @@ package body Prj.Tree is
    ---------------------------------
 
    procedure Set_Next_Package_In_Project
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Package_Declaration);
-      Project_Nodes.Table (Node).Field3 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field3 := To;
    end Set_Next_Package_In_Project;
 
    --------------------------
@@ -2121,15 +2311,17 @@ package body Prj.Tree is
    --------------------------
 
    procedure Set_Next_String_Type
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_String_Type_Declaration);
-      Project_Nodes.Table (Node).Field2 := To;
+         In_Tree.Project_Nodes.Table (Node).Kind =
+           N_String_Type_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Next_String_Type;
 
    -------------------
@@ -2137,15 +2329,16 @@ package body Prj.Tree is
    -------------------
 
    procedure Set_Next_Term
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Term);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Term);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Next_Term;
 
    -----------------------
@@ -2153,17 +2346,20 @@ package body Prj.Tree is
    -----------------------
 
    procedure Set_Next_Variable
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Typed_Variable_Declaration
                or else
-             Project_Nodes.Table (Node).Kind = N_Variable_Declaration));
-      Project_Nodes.Table (Node).Field3 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Variable_Declaration));
+      In_Tree.Project_Nodes.Table (Node).Field3 := To;
    end Set_Next_Variable;
 
    -----------------------------
@@ -2171,15 +2367,16 @@ package body Prj.Tree is
    -----------------------------
 
    procedure Set_Next_With_Clause_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_With_Clause);
-      Project_Nodes.Table (Node).Field2 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Next_With_Clause_Of;
 
    -----------------------
@@ -2187,15 +2384,16 @@ package body Prj.Tree is
    -----------------------
 
    procedure Set_Package_Id_Of
-     (Node : Project_Node_Id;
-      To   : Package_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Package_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Package_Declaration);
-      Project_Nodes.Table (Node).Pkg_Id := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Pkg_Id := To;
    end Set_Package_Id_Of;
 
    -------------------------
@@ -2203,17 +2401,18 @@ package body Prj.Tree is
    -------------------------
 
    procedure Set_Package_Node_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Variable_Reference
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
                or else
-             Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      Project_Nodes.Table (Node).Field2 := To;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Package_Node_Of;
 
    ----------------------
@@ -2221,17 +2420,18 @@ package body Prj.Tree is
    ----------------------
 
    procedure Set_Path_Name_Of
-     (Node : Project_Node_Id;
-      To   : Name_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Path_Name_Type)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Project
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Project
                or else
-             Project_Nodes.Table (Node).Kind = N_With_Clause));
-      Project_Nodes.Table (Node).Path_Name := To;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause));
+      In_Tree.Project_Nodes.Table (Node).Path_Name := To;
    end Set_Path_Name_Of;
 
    ---------------------------
@@ -2256,15 +2456,16 @@ package body Prj.Tree is
    --------------------------------
 
    procedure Set_Project_Declaration_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
          and then
-           Project_Nodes.Table (Node).Kind = N_Project);
-      Project_Nodes.Table (Node).Field2 := To;
+           In_Tree.Project_Nodes.Table (Node).Kind = N_Project);
+      In_Tree.Project_Nodes.Table (Node).Field2 := To;
    end Set_Project_Declaration_Of;
 
    -----------------------------------------------
@@ -2272,12 +2473,14 @@ package body Prj.Tree is
    -----------------------------------------------
 
    procedure Set_Project_File_Includes_Unkept_Comments
-     (Node : Project_Node_Id;
-      To   : Boolean)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Boolean)
    is
-      Declaration : constant Project_Node_Id := Project_Declaration_Of (Node);
+      Declaration : constant Project_Node_Id :=
+                      Project_Declaration_Of (Node, In_Tree);
    begin
-      Project_Nodes.Table (Declaration).Flag1 := To;
+      In_Tree.Project_Nodes.Table (Declaration).Flag1 := To;
    end Set_Project_File_Includes_Unkept_Comments;
 
    -------------------------
@@ -2286,6 +2489,7 @@ package body Prj.Tree is
 
    procedure Set_Project_Node_Of
      (Node         : Project_Node_Id;
+      In_Tree      : Project_Node_Tree_Ref;
       To           : Project_Node_Id;
       Limited_With : Boolean := False)
    is
@@ -2293,17 +2497,17 @@ package body Prj.Tree is
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_With_Clause
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
                or else
-             Project_Nodes.Table (Node).Kind = N_Variable_Reference
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference
                or else
-             Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
-      Project_Nodes.Table (Node).Field1 := To;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Attribute_Reference));
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
 
-      if Project_Nodes.Table (Node).Kind = N_With_Clause
+      if In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
         and then not Limited_With
       then
-         Project_Nodes.Table (Node).Field3 := To;
+         In_Tree.Project_Nodes.Table (Node).Field3 := To;
       end if;
    end Set_Project_Node_Of;
 
@@ -2312,39 +2516,63 @@ package body Prj.Tree is
    ---------------------------------------
 
    procedure Set_Project_Of_Renamed_Package_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            Project_Nodes.Table (Node).Kind = N_Package_Declaration);
-      Project_Nodes.Table (Node).Field1 := To;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Package_Declaration);
+      In_Tree.Project_Nodes.Table (Node).Field1 := To;
    end Set_Project_Of_Renamed_Package_Of;
 
+   -------------------------
+   -- Set_Source_Index_Of --
+   -------------------------
+
+   procedure Set_Source_Index_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Int)
+   is
+   begin
+      pragma Assert
+        (Node /= Empty_Node
+          and then
+           (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
+            or else
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Attribute_Declaration));
+      In_Tree.Project_Nodes.Table (Node).Src_Index := To;
+   end Set_Source_Index_Of;
+
    ------------------------
    -- Set_String_Type_Of --
    ------------------------
 
    procedure Set_String_Type_Of
-     (Node : Project_Node_Id;
-      To   : Project_Node_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Project_Node_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Variable_Reference
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Variable_Reference
                or else
-             Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration)
-           and then
-            Project_Nodes.Table (To).Kind    = N_String_Type_Declaration);
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Typed_Variable_Declaration)
+          and then
+            In_Tree.Project_Nodes.Table (To).Kind = N_String_Type_Declaration);
 
-      if Project_Nodes.Table (Node).Kind = N_Variable_Reference then
-         Project_Nodes.Table (Node).Field3 := To;
+      if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
+         In_Tree.Project_Nodes.Table (Node).Field3 := To;
       else
-         Project_Nodes.Table (Node).Field2 := To;
+         In_Tree.Project_Nodes.Table (Node).Field2 := To;
       end if;
    end Set_String_Type_Of;
 
@@ -2353,40 +2581,63 @@ package body Prj.Tree is
    -------------------------
 
    procedure Set_String_Value_Of
-     (Node : Project_Node_Id;
-      To   : Name_Id)
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref;
+      To      : Name_Id)
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_With_Clause
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
                or else
-             Project_Nodes.Table (Node).Kind = N_Comment
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
                or else
-             Project_Nodes.Table (Node).Kind = N_Literal_String));
-      Project_Nodes.Table (Node).Value := To;
+             In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
+      In_Tree.Project_Nodes.Table (Node).Value := To;
    end Set_String_Value_Of;
 
+   ---------------------
+   -- Source_Index_Of --
+   ---------------------
+
+   function Source_Index_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Int
+   is
+   begin
+      pragma Assert
+        (Node /= Empty_Node
+          and then
+            (In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String
+              or else
+             In_Tree.Project_Nodes.Table (Node).Kind =
+               N_Attribute_Declaration));
+      return In_Tree.Project_Nodes.Table (Node).Src_Index;
+   end Source_Index_Of;
+
    --------------------
    -- String_Type_Of --
    --------------------
 
    function String_Type_Of
-     (Node : Project_Node_Id) return Project_Node_Id
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Project_Node_Id
    is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-            (Project_Nodes.Table (Node).Kind = N_Variable_Reference
+           (In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Variable_Reference
                or else
-             Project_Nodes.Table (Node).Kind = N_Typed_Variable_Declaration));
+            In_Tree.Project_Nodes.Table (Node).Kind =
+              N_Typed_Variable_Declaration));
 
-      if Project_Nodes.Table (Node).Kind = N_Variable_Reference then
-         return Project_Nodes.Table (Node).Field3;
+      if In_Tree.Project_Nodes.Table (Node).Kind = N_Variable_Reference then
+         return In_Tree.Project_Nodes.Table (Node).Field3;
       else
-         return Project_Nodes.Table (Node).Field2;
+         return In_Tree.Project_Nodes.Table (Node).Field2;
       end if;
    end String_Type_Of;
 
@@ -2394,17 +2645,20 @@ package body Prj.Tree is
    -- String_Value_Of --
    ---------------------
 
-   function String_Value_Of (Node : Project_Node_Id) return Name_Id is
+   function String_Value_Of
+     (Node    : Project_Node_Id;
+      In_Tree : Project_Node_Tree_Ref) return Name_Id
+   is
    begin
       pragma Assert
         (Node /= Empty_Node
           and then
-           (Project_Nodes.Table (Node).Kind = N_With_Clause
+           (In_Tree.Project_Nodes.Table (Node).Kind = N_With_Clause
               or else
-            Project_Nodes.Table (Node).Kind = N_Comment
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Comment
                or else
-            Project_Nodes.Table (Node).Kind = N_Literal_String));
-      return Project_Nodes.Table (Node).Value;
+            In_Tree.Project_Nodes.Table (Node).Kind = N_Literal_String));
+      return In_Tree.Project_Nodes.Table (Node).Value;
    end String_Value_Of;
 
    --------------------
@@ -2413,27 +2667,29 @@ package body Prj.Tree is
 
    function Value_Is_Valid
      (For_Typed_Variable : Project_Node_Id;
+      In_Tree            : Project_Node_Tree_Ref;
       Value              : Name_Id) return Boolean
    is
    begin
       pragma Assert
         (For_Typed_Variable /= Empty_Node
           and then
-           (Project_Nodes.Table (For_Typed_Variable).Kind =
+           (In_Tree.Project_Nodes.Table (For_Typed_Variable).Kind =
                                      N_Typed_Variable_Declaration));
 
       declare
          Current_String : Project_Node_Id :=
                             First_Literal_String
-                              (String_Type_Of (For_Typed_Variable));
+                              (String_Type_Of (For_Typed_Variable, In_Tree),
+                               In_Tree);
 
       begin
          while Current_String /= Empty_Node
            and then
-             String_Value_Of (Current_String) /= Value
+             String_Value_Of (Current_String, In_Tree) /= Value
          loop
             Current_String :=
-              Next_Literal_String (Current_String);
+              Next_Literal_String (Current_String, In_Tree);
          end loop;
 
          return Current_String /= Empty_Node;
@@ -2450,5 +2706,4 @@ package body Prj.Tree is
       return Unkept_Comments;
    end There_Are_Unkept_Comments;
 
-
 end Prj.Tree;