------------------------------------------------------------------------------

--                                                                          --

--                      DISPLAY_SOURCE COMPONENTS                           --

--                                                                          --

--                         S O U R C E _ T R A V                            --

--                                                                          --

--                                 S p e c                                  --

--                                                                          --

--            Copyright (c) 1995-2000, Free Software Foundation, Inc.       --

--                                                                          --

-- Display_Source is free software; you can redistribute it and/or modify it--

-- under terms of the  GNU General Public License  as published by the Free --

-- Software Foundation;  either version 2,  or  (at your option)  any later --

-- version. Display_Source is distributed in the hope  that it will be use- --

-- ful, but WITHOUT ANY WARRANTY; without even the implied warranty of MER- --

-- CHANTABILITY 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.                                              --

--                                                                          --

-- Display_Source is distributed as a part of the ASIS implementation for   --

-- GNAT (ASIS-for-GNAT).                                                     --

--                                                                          --

-- The   original   version   of  Display_Source  has  been  developed  by  --

-- Jean-Charles  Marteau and Serge Reboul,  ENSIMAG  High School Graduates  --

-- (Computer sciences)  Grenoble,  France  in  Sema Group Grenoble, France. --

--                                                                          --

-- Display_Source is now maintained by Ada Core Technologies Inc            --

-- (http://www.gnat.com).                                                   --

------------------------------------------------------------------------------


-----------------------------------------------------------------

-- This package is part of the ASIS application display_source --

-----------------------------------------------------------------

-- It contains procedures to instantiate Traverse_Element with --

-- in order to make a redisplay of the given source.           --

-- This functionality is used for test purpose, but it could   --

-- be basis for an Asis application.                           --

-- In fact it is not finished yet, because some pretty features--

-- could be added in order to have something nicer ...         --

-----------------------------------------------------------------

with Asis;
with Stacks;

package Source_Trav is

   ------------------------------------

   -- Some type definitions required --

   ------------------------------------


   --  The different kinds of lists of elements

   type List_Kinds is
     (Not_In_A_List,
      Is_Comma_List,
      Is_Comma_Range_List,
      Is_Semi_Colon_List,
      Is_Comma_No_Parenthesis_List,
      Is_Vertical_Line_List);

   subtype Parenthesized_List is List_Kinds range
     Is_Comma_List .. Is_Semi_Colon_List;

   type String_Access is access String;
   --  added to fix the problem with 309


   Separator : array (List_Kinds) of String_Access :=
     (new String'("<<NO ! We're not in a list !>>"),
       new String'(","),
       new String'(","), -- we add "range <>" after each element

       new String'(";"),
       new String'(","),
       new String'("|"));

   -------------------------------------------------------------------

   --  Lexical Node :

   --  Normaly, only the first 3 parameters are to be known of the user

   --  the others are here for other procedures to deal with.

   type Lexical_Node is
      record
         --  Lexem is a string that the program will display after having

         --  finished to process the current lexical node.


--         Lexem : Ada.Strings.Unbounded.Unbounded_String :=

--           Ada.Strings.Unbounded.Null_Unbounded_String;


         Lexem : String_Access;

         --  This is the kind of the list we are currently in.

         --  use Not_In_A_List if you have a single element.

         List_Kind : List_Kinds := Not_In_A_List;

         --  This is the number of elements that remain to be processed in the

         --  list single elements are represented by a Number_Of_Elements

         --  equal to 1

         Number_Of_Elements : Natural := 1;

         ---------------------------------------------------------------------

         --  The boolean First_Passed is true when the first element of a list

         --  has been passed (used to know if the separarator and the

         --  parenthesis is to be displayed) cannot be set or read

         First_Passed : Boolean := False;

         --  Indentation is the number of space to be put after a return.

         --  This is the real indentation that will be used for the string

         --  contained in Lexem.

         --  cannot be set or read

         Indentation : Natural := 0;

         --  This is the indentation reference for children.

         --  This will become the new Indentation for childs element

         --  of this node. That is because Pass_Element turns this

         --  value into the Current_Indentation_Reference.

         --  It is set by the Indent procedure.

         --  cannot be read

         Indentation_Reference : Natural := 0;

         --  No_Space is used to specify that one's mustn't print a space

         --  before a selector for instance (A.B  or  A'First ...)

         --  It is set by the No_Space procedure

         --  cannot be read

         No_Space : Boolean := False;

         --  Return_list is used to specify that we should return after each

         --  element of a list ...

         --  It is set by procedure Check_If_Return_Separator

         --  cannot be read

         Return_List : Boolean := False;

         --  The problem in function calls is that the things don't appear in

         --  the order they should be displayed, so we must have this flag ...

         --  It is used to make the difference between

         --   1 + 2   and  "+" (1, 2)

         --  It is set by Infix procedure.

         --  And read by Is_Infix function.

         Infixed_Operator : Boolean := False;
      end record;
   -------------------------------------------------------------------


   type A_Lexical_Node is access all Lexical_Node;

   package Node_Stack is new Stacks (Lexical_Node, A_Lexical_Node);

   type Info_Source is record
      --  Default_Indentation_Element is the default number of spaces to add

      --  when you use the Indent function (note that Indent also accepts

      --  an optional parameter telling the number of spaces needed)

      Default_Indentation_Element : Natural := 2;

      --  When a list element sizes more than this number of

      --  space there a return between each element. (Not Implemented)

      Max_Size_Of_List_Elem_Before_Return : Natural := 10;

      --  Declaration of the stacks needed ...

      Lexical_Stack, Tmp_Stack : Node_Stack.Stack := Node_Stack.Empty_Stack;

      --  That is the reference for the current traversed element.

      --  it means that this is the value pushed by the function push.

      --  In Pass_Element, this value is reset with the Indentation_Reference

      --  of the Upper lexical node.

      Current_Indentation_Reference : Natural := 0;

      --  Last_Commented_Line is a counter that helps displaying the

      --  comments. It says that all comments from line 1 to

      --  Last_Commented_Line have already been displayed. 0 means that no

      --  line was displayed. It is a number of line in the original file.

      Last_Commented_Line : Natural := 0;

      --  Horizontal_Position and Vertical_Position are the current

      --  positions in the generated file.

      Horizontal_Position : Natural := 0;
      Vertical_Position   : Natural := 1;

      --  Is a limit to avoid line too long errors...

      --  In fact we should not need this ... but knowing

      --  when to put a new_line in lists is not that easy...

      Max_Line_Length : Positive := 100;

      --  Last_Char_Was_Return and Last_Char_Was_Space are used

      --  for smart display. In fact returns and spaces are not

      --  writen immediately, but just before writing something

      --  else, so these boolean are used to keep the trace of

      --  the corresponding characters.

      Last_Char_Was_Return : Boolean := False;
      Last_Char_Was_Space : Boolean := False;

      --  At the end of the display source ... the stack may not be

      --  empty, so we need this boolean to say that we don't want

      --  any element to be processed but only the stack to be poured.

      Finishing_Traversal : Boolean := False;
   end record;

   procedure Pre_Source
   (Element : in     Asis.Element;
    Control : in out Asis.Traverse_Control;
    State   : in out Info_Source);

   procedure Post_Source
   (Element : in     Asis.Element;
    Control : in out Asis.Traverse_Control;
    State   : in out Info_Source);

   procedure Initiate_Source
     (Unit    : in    Asis.Compilation_Unit;
      Name    : in    String;
      Control : in out Asis.Traverse_Control;
      State   : in out Info_Source);

   procedure Terminate_Source
     (Control : in out Asis.Traverse_Control;
      State   : in out Info_Source);

end Source_Trav;

syntax highlighted by Code2HTML, v. 0.9.1