home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / style.adb < prev    next >
Text File  |  1996-09-28  |  18KB  |  584 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                                S T Y L E                                 --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.18 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  This version of the Style package implements the standard GNAT style
  26. --  checking rules. For documentation of these rules, see comments on the
  27. --  individual procedures.
  28.  
  29. with Atree;  use Atree;
  30. with Casing; use Casing;
  31. with Csets;  use Csets;
  32. with Errout; use Errout;
  33. with Namet;  use Namet;
  34. with Scn;    use Scn;
  35. with Scans;  use Scans;
  36. with Sinfo;  use Sinfo;
  37. with Sinput; use Sinput;
  38.  
  39. package body Style is
  40.  
  41.    Indentation : constant := 3;
  42.    --  Number of columns for each indentation level
  43.  
  44.    -----------------------
  45.    -- Local Subprograms --
  46.    -----------------------
  47.  
  48.    procedure Error_Space_Not_Allowed (S : Source_Ptr);
  49.    --  Posts an error message indicating that a space is not allowed
  50.    --  at the given source location.
  51.  
  52.    procedure Error_Space_Required (S : Source_Ptr);
  53.    --  Posts an error message indicating that a space is required at
  54.    --  the given source location.
  55.  
  56.    procedure Require_Following_Space;
  57.    pragma Inline (Require_Following_Space);
  58.    --  Require token to be followed by white space. Used only if in GNAT
  59.    --  style checking mode.
  60.  
  61.    procedure Require_Preceding_Space;
  62.    pragma Inline (Require_Preceding_Space);
  63.    --  Require token to be preceded by white space. Used only if in GNAT
  64.    --  style checking mode.
  65.  
  66.    -----------------------
  67.    -- Body_With_No_Spec --
  68.    -----------------------
  69.  
  70.    --  In GNAT style check mode, all subprograms must have specs
  71.  
  72.    procedure Body_With_No_Spec (N : Node_Id) is
  73.    begin
  74.       Error_Msg_N ("?(style): subprogram body has no previous spec", N);
  75.    end Body_With_No_Spec;
  76.  
  77.    ----------------------
  78.    -- Check_Abs_Or_Not --
  79.    ----------------------
  80.  
  81.    --  In GNAT style check mode, ABS or NOT must be followed by a space
  82.  
  83.    procedure Check_Abs_Not is
  84.    begin
  85.       if Source (Scan_Ptr) > ' ' then
  86.          Error_Space_Required (Scan_Ptr);
  87.       end if;
  88.    end Check_Abs_Not;
  89.  
  90.    -----------------
  91.    -- Check_Arrow --
  92.    -----------------
  93.  
  94.    --  In GNAT style check mode, an arrow must be surrounded by spaces
  95.  
  96.    procedure Check_Arrow is
  97.    begin
  98.       Require_Preceding_Space;
  99.       Require_Following_Space;
  100.    end Check_Arrow;
  101.  
  102.    --------------------------
  103.    -- Check_Attribute_Name --
  104.    --------------------------
  105.  
  106.    --  In GNAT style mode, attribute names must be mixed case, i.e. start
  107.    --  with an upper case letter, and otherwise lower case, except after
  108.    --  an underline character.
  109.  
  110.    procedure Check_Attribute_Name (Reserved : Boolean) is
  111.    begin
  112.       if Determine_Token_Casing /= Mixed_Case then
  113.  
  114.          --  For now, warning only in the reserved word case ???
  115.  
  116.          if Reserved then
  117.             Error_Msg_SC ("?(style) bad capitalization, mixed case required");
  118.          else
  119.             Error_Msg_SC ("(style) bad capitalization, mixed case required");
  120.          end if;
  121.       end if;
  122.    end Check_Attribute_Name;
  123.  
  124.    ---------------
  125.    -- Check_Box --
  126.    ---------------
  127.  
  128.    --  In GNAT style check mode, a box must be preceded by a space or by
  129.    --  a left parenthesis. Spacing checking on the surrounding tokens takes
  130.    --  care of the remaining checks.
  131.  
  132.    procedure Check_Box is
  133.    begin
  134.       if Prev_Token /= Tok_Left_Paren then
  135.          Require_Preceding_Space;
  136.       end if;
  137.    end Check_Box;
  138.  
  139.    ---------------------------
  140.    -- Check_Binary_Operator --
  141.    ---------------------------
  142.  
  143.    --  In GNAT style check mode, binary operators other than exponentiation
  144.    --  require a preceding and following space characters.
  145.  
  146.    procedure Check_Binary_Operator is
  147.    begin
  148.       Require_Preceding_Space;
  149.       Require_Following_Space;
  150.    end Check_Binary_Operator;
  151.  
  152.    -----------------
  153.    -- Check_Colon --
  154.    -----------------
  155.  
  156.    --  In GNAT style check mode, a colon must be surrounded by spaces
  157.  
  158.    procedure Check_Colon is
  159.    begin
  160.       Require_Preceding_Space;
  161.       Require_Following_Space;
  162.    end Check_Colon;
  163.  
  164.    -----------------------
  165.    -- Check_Colon_Equal --
  166.    -----------------------
  167.  
  168.    --  In GNAT style check mode, colon equal must be surrounded by spaces
  169.  
  170.    procedure Check_Colon_Equal is
  171.    begin
  172.       Require_Preceding_Space;
  173.       Require_Following_Space;
  174.    end Check_Colon_Equal;
  175.  
  176.    -----------------
  177.    -- Check_Comma --
  178.    -----------------
  179.  
  180.    --  In GNAT style check mode, a comma must be either the first
  181.    --  token on a line, or be preceded by a blank. It must also
  182.    --  always be followed by a blank.
  183.  
  184.    procedure Check_Comma is
  185.    begin
  186.       if Token_Ptr > First_Non_Blank_Location
  187.         and then Source (Token_Ptr - 1) = ' '
  188.       then
  189.          Error_Space_Not_Allowed (Token_Ptr - 1);
  190.       end if;
  191.  
  192.       if Source (Scan_Ptr) > ' ' then
  193.          Error_Space_Required (Scan_Ptr);
  194.       end if;
  195.    end Check_Comma;
  196.  
  197.    -------------------
  198.    -- Check_Comment --
  199.    -------------------
  200.  
  201.    --  In GNAT style check mode, we have several requirements on comments.
  202.    --  Comments that are not at the start of a line merely require at least
  203.    --  one space after the second minus, there is no other required. For
  204.    --  comments at the start of a line, either two blanks appear after the
  205.    --  second minus, or as special cases, a row of minuses, or a line starting
  206.    --  with two blanks and a minus and ending with a blank and two minuses is
  207.    --  permitted. To see the reason for these special exceptions, look at the
  208.    --  box that precedes this procedure!
  209.  
  210.    procedure Check_Comment is
  211.       S : Source_Ptr;
  212.  
  213.    begin
  214.       --  Can never have a non-blank character preceding the first minus
  215.  
  216.       if Scan_Ptr > Source_First (Current_Source_File)
  217.         and then Source (Scan_Ptr - 1) > ' '
  218.       then
  219.          Error_Msg_S ("(style) space required");
  220.          return;
  221.       end if;
  222.  
  223.       --  For a comment that is not at the start of the line, the only
  224.       --  requirement is that we cannot have a non-blank character after
  225.       --  the second minus sign.
  226.  
  227.       if Scan_Ptr /= First_Non_Blank_Location then
  228.          if Source (Scan_Ptr + 2) > ' ' then
  229.             Error_Msg ("(style) space required", Scan_Ptr + 2);
  230.          end if;
  231.  
  232.          return;
  233.  
  234.       --  Case of a comment that is at the start of a line
  235.  
  236.       else
  237.          --  First check, must be in appropriately indented column
  238.  
  239.          if Start_Column rem Indentation /= 0 then
  240.             Error_Msg_S ("(style) bad column");
  241.             return;
  242.          end if;
  243.  
  244.          --  If we are not followed by a blank, then the only allowed case is
  245.          --  when the entire line is made up of minus signs (case of a box
  246.          --  comment, or in the trivial case, of a -- comment all on its own
  247.          --  on a line, which is also permissible)
  248.  
  249.          if Source (Scan_Ptr + 2) /= ' ' then
  250.             S := Scan_Ptr + 2;
  251.  
  252.             while Source (S) >= ' ' loop
  253.                if Source (S) /= '-' then
  254.                   Error_Space_Required (Scan_Ptr + 2);
  255.                   return;
  256.                end if;
  257.  
  258.                S := S + 1;
  259.             end loop;
  260.  
  261.          --  If we are followed by a blank, then the comment is OK if the
  262.          --  character following this blank is another blank or a format
  263.          --  effector.
  264.  
  265.          elsif Source (Scan_Ptr + 3) <= ' ' then
  266.             return;
  267.  
  268.          --  Here is the case where we only have one blank after the two minus
  269.          --  signs, which is an error unless the line ends with two blanks, the
  270.          --  case of a box comment.
  271.  
  272.          else
  273.             S := Scan_Ptr + 3;
  274.  
  275.             while Source (S) not in Line_Terminator loop
  276.                S := S + 1;
  277.             end loop;
  278.  
  279.             if Source (S - 1) /= '-' or else Source (S - 2) /= '-' then
  280.                Error_Space_Required (Scan_Ptr + 3);
  281.             end if;
  282.          end if;
  283.       end if;
  284.    end Check_Comment;
  285.  
  286.    -------------------
  287.    -- Check_Dot_Dot --
  288.    -------------------
  289.  
  290.    --  In GNAT style check mode, dot dot must be surrounded by spaces
  291.  
  292.    procedure Check_Dot_Dot is
  293.    begin
  294.       Require_Preceding_Space;
  295.       Require_Following_Space;
  296.    end Check_Dot_Dot;
  297.  
  298.    -----------------------------------
  299.    -- Check_Exponentiation_Operator --
  300.    -----------------------------------
  301.  
  302.    --  No spaces are required for the ** operator in GNAT style check mode
  303.  
  304.    procedure Check_Exponentiation_Operator is
  305.    begin
  306.       null;
  307.    end Check_Exponentiation_Operator;
  308.  
  309.    --------------
  310.    -- Check_HT --
  311.    --------------
  312.  
  313.    --  Horizontal tab characters are not allowed in GNAT style check mode
  314.  
  315.    procedure Check_HT is
  316.    begin
  317.       Error_Msg_S ("(style) horizontal tab not allowed");
  318.    end Check_HT;
  319.  
  320.    ----------------------
  321.    -- Check_Identifier --
  322.    ----------------------
  323.  
  324.    procedure Check_Identifier (Ref : Node_Id; Def : Node_Id) is
  325.       SRef : Source_Ptr := Sloc (Ref);
  326.       SDef : Source_Ptr := Sloc (Def);
  327.       TRef : Source_Buffer_Ptr;
  328.       TDef : Source_Buffer_Ptr;
  329.  
  330.    begin
  331.       --  Only do the check if both identifiers come from the source
  332.  
  333.       if Comes_From_Source (Ref)
  334.         and then Comes_From_Source (Def)
  335.       then
  336.          TRef := Source_Text (Get_Source_File_Index (SRef));
  337.          TDef := Source_Text (Get_Source_File_Index (SDef));
  338.  
  339.          for J in 1 .. Length_Of_Name (Chars (Ref)) loop
  340.             if TRef (SRef) /= TDef (SDef) then
  341.                Error_Msg_Node_1 := Def;
  342.                Error_Msg
  343.                  ("(style) bad identifier casing, should be&", SRef);
  344.                return;
  345.             end if;
  346.  
  347.             SRef := SRef + 1;
  348.             SDef := SDef + 1;
  349.          end loop;
  350.       end if;
  351.    end Check_Identifier;
  352.  
  353.    -----------------------
  354.    -- Check_Indentation --
  355.    -----------------------
  356.  
  357.    --  In GNAT style check mode, a new statement or declaration is required
  358.    --  to start in a column that is a multiple of the indentiation amount.
  359.  
  360.    procedure Check_Indentation is
  361.    begin
  362.       if Token_Ptr = First_Non_Blank_Location
  363.         and then Start_Column rem Indentation /= 0
  364.       then
  365.          Error_Msg_SC ("(style) bad indentation");
  366.       end if;
  367.    end Check_Indentation;
  368.  
  369.    ----------------------
  370.    -- Check_Left_Paren --
  371.    ----------------------
  372.  
  373.    --  In GNAT style check mode, a left paren must not be preceded by an
  374.    --  identifier character or digit (a separating space is required) and
  375.    --  may never be followed by a space.
  376.  
  377.    procedure Check_Left_Paren is
  378.    begin
  379.       if Token_Ptr > Source_First (Current_Source_File)
  380.         and then Identifier_Char (Source (Token_Ptr - 1))
  381.       then
  382.          Error_Space_Required (Token_Ptr - 1);
  383.       end if;
  384.  
  385.       if Source (Scan_Ptr) = ' ' then
  386.          Error_Space_Not_Allowed (Scan_Ptr);
  387.       end if;
  388.    end Check_Left_Paren;
  389.  
  390.    ---------------------------
  391.    -- Check_Line_Terminator --
  392.    ---------------------------
  393.  
  394.    --  In GNAT style check mode, a line may not have trailing spaces
  395.  
  396.    procedure Check_Line_Terminator is
  397.       S : Source_Ptr;
  398.  
  399.    begin
  400.       if Scan_Ptr > First_Non_Blank_Location then
  401.          if Source (Scan_Ptr - 1) = ' ' then
  402.             S := Scan_Ptr - 1;
  403.  
  404.             while Source (S - 1) = ' ' loop
  405.                S := S - 1;
  406.             end loop;
  407.  
  408.             Error_Msg ("(style) trailing spaces not permitted", S);
  409.          end if;
  410.       end if;
  411.    end Check_Line_Terminator;
  412.  
  413.    -----------------------
  414.    -- Check_Pragma_Name --
  415.    -----------------------
  416.  
  417.    --  In GNAT style mode, pragma names must be mixed case, i.e. start
  418.    --  with an upper case letter, and otherwise lower case, except after
  419.    --  an underline character.
  420.  
  421.    procedure Check_Pragma_Name is
  422.    begin
  423.       if Determine_Token_Casing /= Mixed_Case then
  424.          Error_Msg_SC ("(style) bad capitalization, mixed case required");
  425.       end if;
  426.    end Check_Pragma_Name;
  427.  
  428.    -----------------------
  429.    -- Check_Right_Paren --
  430.    -----------------------
  431.  
  432.    --  In GNAT style check mode, a right paren must never be preceded by
  433.    --  a space unless it is the initial non-blank character on the line.
  434.  
  435.    procedure Check_Right_Paren is
  436.    begin
  437.       if Token_Ptr > First_Non_Blank_Location
  438.         and then Source (Token_Ptr - 1) = ' '
  439.       then
  440.          Error_Space_Not_Allowed (Token_Ptr - 1);
  441.       end if;
  442.    end Check_Right_Paren;
  443.  
  444.    ---------------------
  445.    -- Check_Semicolon --
  446.    ---------------------
  447.  
  448.    --  In GNAT style check mode, a preceding space is not permitted,
  449.    --  and a following space is required.
  450.  
  451.    procedure Check_Semicolon is
  452.    begin
  453.       if Scan_Ptr > Source_First (Current_Source_File)
  454.         and then Source (Token_Ptr - 1) = ' '
  455.       then
  456.          Error_Space_Not_Allowed (Token_Ptr - 1);
  457.  
  458.       elsif Source (Scan_Ptr) > ' ' then
  459.          Error_Space_Required (Scan_Ptr);
  460.       end if;
  461.    end Check_Semicolon;
  462.  
  463.    ----------------
  464.    -- Check_Then --
  465.    ----------------
  466.  
  467.    --  In GNAT style check mode, we do not permit a THEN to stand on its own
  468.    --  on a line unless the condition spreads over more than a single line,
  469.    --  i.e. the THEN may not appear on the line immediately after the IF.
  470.  
  471.    procedure Check_Then (If_Loc : Source_Ptr) is
  472.    begin
  473.       if Get_Line_Number (Token_Ptr) = Get_Line_Number (If_Loc) + 1 then
  474.          Error_Msg_SC ("(style) misplaced THEN");
  475.       end if;
  476.    end Check_Then;
  477.  
  478.    -------------------------------
  479.    -- Check_Unary_Plus_Or_Minus --
  480.    -------------------------------
  481.  
  482.    --  In GNAT style check mode, a unary plus or minus must not be followed
  483.    --  by a space.
  484.  
  485.    procedure Check_Unary_Plus_Or_Minus is
  486.    begin
  487.       if Source (Scan_Ptr) = ' ' then
  488.          Error_Space_Not_Allowed (Scan_Ptr);
  489.       end if;
  490.    end Check_Unary_Plus_Or_Minus;
  491.  
  492.    ------------------------
  493.    -- Check_Vertical_Bar --
  494.    ------------------------
  495.  
  496.    --  In GNAT style check mode, a vertical bar must be surrounded by spaces
  497.  
  498.    procedure Check_Vertical_Bar is
  499.    begin
  500.       Require_Preceding_Space;
  501.       Require_Following_Space;
  502.    end Check_Vertical_Bar;
  503.  
  504.    -----------------------------
  505.    -- Error_Space_Not_Allowed --
  506.    -----------------------------
  507.  
  508.    procedure Error_Space_Not_Allowed (S : Source_Ptr) is
  509.    begin
  510.       Error_Msg ("(style) space not allowed", S);
  511.    end Error_Space_Not_Allowed;
  512.  
  513.    --------------------------
  514.    -- Error_Space_Required --
  515.    --------------------------
  516.  
  517.    procedure Error_Space_Required (S : Source_Ptr) is
  518.    begin
  519.       Error_Msg ("(style) space required", S);
  520.    end Error_Space_Required;
  521.  
  522.    ------------
  523.    -- No_End --
  524.    ------------
  525.  
  526.    --  In GNAT style check mode, we always require the name of a subprogram
  527.    --  or package to be present on the END, so this is an unconditional error.
  528.  
  529.    procedure No_End (Name : Node_Id) is
  530.    begin
  531.       Error_Msg_Node_1 := Name;
  532.       Error_Msg_SP ("(style) `END &` required");
  533.    end No_End;
  534.  
  535.    ----------------------------
  536.    -- Non_Lower_Case_Keyword --
  537.    ----------------------------
  538.  
  539.    --  In GNAT style check mode, reserved keywords must be be spelled in all
  540.    --  lower case (excluding keywords range, access, delta and digits used as
  541.    --  attribute designators). This is therefore an unconditional error.
  542.  
  543.    procedure Non_Lower_Case_Keyword is
  544.    begin
  545.       Error_Msg_SC ("(style) reserved words must be all lower case");
  546.    end Non_Lower_Case_Keyword;
  547.  
  548.    -----------------------------
  549.    -- Require_Following_Space --
  550.    -----------------------------
  551.  
  552.    procedure Require_Following_Space is
  553.    begin
  554.       if Source (Scan_Ptr) > ' ' then
  555.          Error_Space_Required (Scan_Ptr);
  556.       end if;
  557.    end Require_Following_Space;
  558.  
  559.    -----------------------------
  560.    -- Require_Preceding_Space --
  561.    -----------------------------
  562.  
  563.    procedure Require_Preceding_Space is
  564.    begin
  565.       if Token_Ptr > Source_First (Current_Source_File)
  566.         and then Source (Token_Ptr - 1) > ' '
  567.       then
  568.          Error_Space_Required (Token_Ptr - 1);
  569.       end if;
  570.    end Require_Preceding_Space;
  571.  
  572.    -------------------------
  573.    -- Set_Max_Line_Length --
  574.    -------------------------
  575.  
  576.    --  In GNAT style check mode, the maximum line length is 79
  577.  
  578.    procedure Set_Max_Line_Length (N : in out Nat) is
  579.    begin
  580.       N := 79;
  581.    end Set_Max_Line_Length;
  582.  
  583. end Style;
  584.