------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                               T R E E P R                                --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 1992-2021, 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- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- 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 COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

with Types; use Types;
package Treepr is

--  This package provides printing routines for the abstract syntax tree
--  These routines are intended only for debugging use.

   procedure Tree_Dump;
   --  This routine is called from the GNAT main program to dump trees as
   --  requested by debug options (including tree of Standard if requested).

   procedure Print_Tree_Node (N : Node_Id; Label : String := "");
   --  Prints a single tree node, without printing descendants. The Label
   --  string is used to preface each line of the printed output.

   procedure Print_Node_Briefly (N : Node_Id);
   --  Terse version of Print_Tree_Node

   procedure Print_Tree_List (L : List_Id);
   --  Prints a single node list, without printing the descendants of any
   --  of the nodes in the list

   procedure Print_Tree_Elist (E : Elist_Id);
   --  Prints a single node list, without printing the descendants of any
   --  of the nodes in the list

   procedure Print_Node_Subtree (N : Node_Id);
   --  Prints the subtree rooted at a specified tree node, including all
   --  referenced descendants.

   procedure Print_List_Subtree (L : List_Id);
   --  Prints the subtree consisting of the given node list and all its
   --  referenced descendants.

   procedure Print_Elist_Subtree (E : Elist_Id);
   --  Prints the subtree consisting of the given element list and all its
   --  referenced descendants.

   --  The following debugging procedures are intended to be called from gdb.
   --  Note that in several cases there are synonyms which represent historical
   --  development, and we keep them because some people are used to them!

   function p   (N : Union_Id) return Node_Or_Entity_Id;
   function par (N : Union_Id) return Node_Or_Entity_Id;
   pragma Export (Ada, p);
   pragma Export (Ada, par);
   --  Return parent of a list or node (depending on the value of N). If N
   --  is neither a list nor a node id, then prints a message to that effect
   --  and returns Empty.

   procedure pn (N : Union_Id);
   procedure pp (N : Union_Id);
   procedure pe (N : Union_Id);
   pragma Export (Ada, pn);
   pragma Export (Ada, pp);
   pragma Export (Ada, pe);
   --  Print a node, node list, uint, or anything else that falls under
   --  the definition of Union_Id. Historically this was only for printing
   --  nodes, hence the name pn. These are all the same, but the renamings
   --  need to be in the body, or else the debugger can't find them.

   procedure ppar (N : Union_Id);
   pragma Export (Ada, ppar);
   --  Print the node, its parent, its parent's parent, and so on

   procedure pt  (N : Union_Id);
   procedure ppp (N : Union_Id);
   pragma Export (Ada, pt);
   pragma Export (Ada, ppp);
   --  Same as pn/pp, except prints subtrees. For Nodes, it is exactly the same
   --  as Print_Node_Subtree. For Elists it is the same as Print_Elist_Subtree.
   --  For Lists, it is the same as Print_Tree_List. If given anything other
   --  than a Node, List, or Elist, same effect as pn.

   procedure pl (L : Int);
   pragma Export (Ada, pl);
   --  Same as Print_Tree_List, except that you can use e.g. 66 instead of
   --  -99999966. In other words for the positive case we fill out to 8 digits
   --  on the left and add a minus sign. This just saves some typing in the
   --  debugger.

end Treepr;
