1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2015, Free Software Foundation, Inc. --
11 -- GNAT is free software; you can redistribute it and/or modify it under --
12 -- terms of the GNU General Public License as published by the Free Soft- --
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
17 -- for more details. You should have received a copy of the GNU General --
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Aspects
; use Aspects
;
27 with Atree
; use Atree
;
28 with Casing
; use Casing
;
29 with Csets
; use Csets
;
30 with Debug
; use Debug
;
31 with Einfo
; use Einfo
;
32 with Fname
; use Fname
;
34 with Namet
; use Namet
;
35 with Nlists
; use Nlists
;
37 with Output
; use Output
;
38 with Rtsfind
; use Rtsfind
;
39 with Sem_Eval
; use Sem_Eval
;
40 with Sem_Util
; use Sem_Util
;
41 with Sinfo
; use Sinfo
;
42 with Sinput
; use Sinput
;
43 with Sinput
.D
; use Sinput
.D
;
44 with Snames
; use Snames
;
45 with Stand
; use Stand
;
46 with Stringt
; use Stringt
;
47 with Uintp
; use Uintp
;
48 with Uname
; use Uname
;
49 with Urealp
; use Urealp
;
51 package body Sprint
is
52 Current_Source_File
: Source_File_Index
;
53 -- Index of source file whose generated code is being dumped
55 Dump_Node
: Node_Id
:= Empty
;
56 -- This is set to the current node, used for printing line numbers. In
57 -- Debug_Generated_Code mode, Dump_Node is set to the current node
58 -- requiring Sloc fixup, until Set_Debug_Sloc is called to set the proper
59 -- value. The call clears it back to Empty.
61 First_Debug_Sloc
: Source_Ptr
;
62 -- Sloc of first byte of the current output file if we are generating a
65 Debug_Sloc
: Source_Ptr
;
66 -- Sloc of first byte of line currently being written if we are
67 -- generating a source debug file.
69 Dump_Original_Only
: Boolean;
70 -- Set True if the -gnatdo (dump original tree) flag is set
72 Dump_Generated_Only
: Boolean;
73 -- Set True if the -gnatdG (dump generated tree) debug flag is set
74 -- or for Print_Generated_Code (-gnatG) or Dump_Generated_Code (-gnatD).
76 Dump_Freeze_Null
: Boolean;
77 -- Set True if empty freeze nodes and non-source null statements output.
78 -- Note that freeze nodes containing freeze actions are always output,
79 -- as are freeze nodes for itypes, which in general have the effect of
80 -- causing elaboration of the itype.
82 Freeze_Indent
: Int
:= 0;
83 -- Keep track of freeze indent level (controls output of blank lines before
84 -- procedures within expression freeze actions). Relevant only if we are
85 -- not in Dump_Source_Text mode, since in Dump_Source_Text mode we don't
86 -- output these blank lines in any case.
89 -- Number of columns for current line output indentation
91 Indent_Annull_Flag
: Boolean := False;
92 -- Set True if subsequent Write_Indent call to be ignored, gets reset
93 -- by this call, so it is only active to suppress a single indent call.
95 Last_Line_Printed
: Physical_Line_Number
;
96 -- This keeps track of the physical line number of the last source line
97 -- that has been output. The value is only valid in Dump_Source_Text mode.
99 -------------------------------
100 -- Operator Precedence Table --
101 -------------------------------
103 -- This table is used to decide whether a subexpression needs to be
104 -- parenthesized. The rule is that if an operand of an operator (which
105 -- for this purpose includes AND THEN and OR ELSE) is itself an operator
106 -- with a lower precedence than the operator (or equal precedence if
107 -- appearing as the right operand), then parentheses are required.
109 Op_Prec
: constant array (N_Subexpr
) of Short_Short_Integer :=
142 procedure Sprint_Left_Opnd
(N
: Node_Id
);
143 -- Print left operand of operator, parenthesizing if necessary
145 procedure Sprint_Right_Opnd
(N
: Node_Id
);
146 -- Print right operand of operator, parenthesizing if necessary
148 -----------------------
149 -- Local Subprograms --
150 -----------------------
152 procedure Col_Check
(N
: Nat
);
153 -- Check that at least N characters remain on current line, and if not,
154 -- then start an extra line with two characters extra indentation for
155 -- continuing text on the next line.
157 procedure Extra_Blank_Line
;
158 -- In some situations we write extra blank lines to separate the generated
159 -- code to make it more readable. However, these extra blank lines are not
160 -- generated in Dump_Source_Text mode, since there the source text lines
161 -- output with preceding blank lines are quite sufficient as separators.
162 -- This procedure writes a blank line if Dump_Source_Text is False.
164 procedure Indent_Annull
;
165 -- Causes following call to Write_Indent to be ignored. This is used when
166 -- a higher level node wants to stop a lower level node from starting a
167 -- new line, when it would otherwise be inclined to do so (e.g. the case
168 -- of an accept statement called from an accept alternative with a guard)
170 procedure Indent_Begin
;
171 -- Increase indentation level
173 procedure Indent_End
;
174 -- Decrease indentation level
176 procedure Print_Debug_Line
(S
: String);
177 -- Used to print output lines in Debug_Generated_Code mode (this is used
178 -- as the argument for a call to Set_Special_Output in package Output).
180 procedure Process_TFAI_RR_Flags
(Nod
: Node_Id
);
181 -- Given a divide, multiplication or division node, check the flags
182 -- Treat_Fixed_As_Integer and Rounded_Flags, and if set, output the
183 -- appropriate special syntax characters (# and @).
185 procedure Set_Debug_Sloc
;
186 -- If Dump_Node is non-empty, this routine sets the appropriate value
187 -- in its Sloc field, from the current location in the debug source file
188 -- that is currently being written.
190 procedure Sprint_And_List
(List
: List_Id
);
191 -- Print the given list with items separated by vertical "and"
193 procedure Sprint_Aspect_Specifications
195 Semicolon
: Boolean);
196 -- Node is a declaration node that has aspect specifications (Has_Aspects
197 -- flag set True). It outputs the aspect specifications. For the case
198 -- of Semicolon = True, it is called after outputting the terminating
199 -- semicolon for the related node. The effect is to remove the semicolon
200 -- and print the aspect specifications followed by a terminating semicolon.
201 -- For the case of Semicolon False, no semicolon is removed or output, and
202 -- all the aspects are printed on a single line.
204 procedure Sprint_Bar_List
(List
: List_Id
);
205 -- Print the given list with items separated by vertical bars
207 procedure Sprint_End_Label
210 -- Print the end label for a Handled_Sequence_Of_Statements in a body.
211 -- If there is no end label, use the defining identifier of the enclosing
212 -- construct. If the end label is present, treat it as a reference to the
213 -- defining entity of the construct: this guarantees that it carries the
214 -- proper sloc information for debugging purposes.
216 procedure Sprint_Node_Actual
(Node
: Node_Id
);
217 -- This routine prints its node argument. It is a lower level routine than
218 -- Sprint_Node, in that it does not bother about rewritten trees.
220 procedure Sprint_Node_Sloc
(Node
: Node_Id
);
221 -- Like Sprint_Node, but in addition, in Debug_Generated_Code mode,
222 -- sets the Sloc of the current debug node to be a copy of the Sloc
223 -- of the sprinted node Node. Note that this is done after printing
224 -- Node, so that the Sloc is the proper updated value for the debug file.
226 procedure Update_Itype
(Node
: Node_Id
);
227 -- Update the Sloc of an itype that is not attached to the tree, when
228 -- debugging expanded code. This routine is called from nodes whose
229 -- type can be an Itype, such as defining_identifiers that may be of
230 -- an anonymous access type, or ranges in slices.
232 procedure Write_Char_Sloc
(C
: Character);
233 -- Like Write_Char, except that if C is non-blank, Set_Debug_Sloc is
234 -- called to ensure that the current node has a proper Sloc set.
236 procedure Write_Condition_And_Reason
(Node
: Node_Id
);
237 -- Write Condition and Reason codes of Raise_xxx_Error node
239 procedure Write_Corresponding_Source
(S
: String);
240 -- If S is a string with a single keyword (possibly followed by a space),
241 -- and if the next non-comment non-blank source line matches this keyword,
242 -- then output all source lines up to this matching line.
244 procedure Write_Discr_Specs
(N
: Node_Id
);
245 -- Output discriminant specification for node, which is any of the type
246 -- declarations that can have discriminants.
248 procedure Write_Ekind
(E
: Entity_Id
);
249 -- Write the String corresponding to the Ekind without "E_"
251 procedure Write_Id
(N
: Node_Id
);
252 -- N is a node with a Chars field. This procedure writes the name that
253 -- will be used in the generated code associated with the name. For a
254 -- node with no associated entity, this is simply the Chars field. For
255 -- the case where there is an entity associated with the node, we print
256 -- the name associated with the entity (since it may have been encoded).
257 -- One other special case is that an entity has an active external name
258 -- (i.e. an external name present with no address clause), then this
259 -- external name is output. This procedure also deals with outputting
260 -- declarations of referenced itypes, if not output earlier.
262 function Write_Identifiers
(Node
: Node_Id
) return Boolean;
263 -- Handle node where the grammar has a list of defining identifiers, but
264 -- the tree has a separate declaration for each identifier. Handles the
265 -- printing of the defining identifier, and returns True if the type and
266 -- initialization information is to be printed, False if it is to be
267 -- skipped (the latter case happens when printing defining identifiers
268 -- other than the first in the original tree output case).
270 procedure Write_Implicit_Def
(E
: Entity_Id
);
271 pragma Warnings
(Off
, Write_Implicit_Def
);
272 -- Write the definition of the implicit type E according to its Ekind
273 -- For now a debugging procedure, but might be used in the future.
275 procedure Write_Indent
;
276 -- Start a new line and write indentation spacing
278 function Write_Indent_Identifiers
(Node
: Node_Id
) return Boolean;
279 -- Like Write_Identifiers except that each new printed declaration
280 -- is at the start of a new line.
282 function Write_Indent_Identifiers_Sloc
(Node
: Node_Id
) return Boolean;
283 -- Like Write_Indent_Identifiers except that in Debug_Generated_Code
284 -- mode, the Sloc of the current debug node is set to point to the
285 -- first output identifier.
287 procedure Write_Indent_Str
(S
: String);
288 -- Start a new line and write indent spacing followed by given string
290 procedure Write_Indent_Str_Sloc
(S
: String);
291 -- Like Write_Indent_Str, but in addition, in Debug_Generated_Code mode,
292 -- the Sloc of the current node is set to the first non-blank character
295 procedure Write_Itype
(Typ
: Entity_Id
);
296 -- If Typ is an Itype that has not been written yet, write it. If Typ is
297 -- any other kind of entity or tree node, the call is ignored.
299 procedure Write_Name_With_Col_Check
(N
: Name_Id
);
300 -- Write name (using Write_Name) with initial column check, and possible
301 -- initial Write_Indent (to get new line) if current line is too full.
303 procedure Write_Name_With_Col_Check_Sloc
(N
: Name_Id
);
304 -- Like Write_Name_With_Col_Check but in addition, in Debug_Generated_Code
305 -- mode, sets Sloc of current debug node to first character of name.
307 procedure Write_Operator
(N
: Node_Id
; S
: String);
308 -- Like Write_Str_Sloc, used for operators, encloses the string in
309 -- characters {} if the Do_Overflow flag is set on the node N.
311 procedure Write_Param_Specs
(N
: Node_Id
);
312 -- Output parameter specifications for node N (which is a subprogram, or
313 -- entry or entry family or access-subprogram-definition, all of which
314 -- have a Parameter_Specificatioons field).
316 procedure Write_Rewrite_Str
(S
: String);
317 -- Writes out a string (typically containing <<< or >>>}) for a node
318 -- created by rewriting the tree. Suppressed if we are outputting the
319 -- generated code only, since in this case we don't specially mark nodes
320 -- created by rewriting).
322 procedure Write_Source_Line
(L
: Physical_Line_Number
);
323 -- If writing of interspersed source lines is enabled, then write the given
324 -- line from the source file, preceded by Eol, then an extra blank line if
325 -- the line has at least one blank, is not a comment and is not line one,
326 -- then "--" and the line number followed by period followed by text of the
327 -- source line (without terminating Eol). If interspersed source line
328 -- output not enabled, then the call has no effect.
330 procedure Write_Source_Lines
(L
: Physical_Line_Number
);
331 -- If writing of interspersed source lines is enabled, then writes source
332 -- lines Last_Line_Printed + 1 .. L, and updates Last_Line_Printed. If
333 -- interspersed source line output not enabled, then call has no effect.
335 procedure Write_Str_Sloc
(S
: String);
336 -- Like Write_Str, but sets debug Sloc of current debug node to first
337 -- non-blank character if a current debug node is active.
339 procedure Write_Str_With_Col_Check
(S
: String);
340 -- Write string (using Write_Str) with initial column check, and possible
341 -- initial Write_Indent (to get new line) if current line is too full.
343 procedure Write_Str_With_Col_Check_Sloc
(S
: String);
344 -- Like Write_Str_With_Col_Check, but sets debug Sloc of current debug
345 -- node to first non-blank character if a current debug node is active.
347 procedure Write_Subprogram_Name
(N
: Node_Id
);
348 -- N is the Name field of a function call or procedure statement call.
349 -- The effect of the call is to output the name, preceded by a $ if the
350 -- call is identified as an implicit call to a run time routine.
352 procedure Write_Uint_With_Col_Check
(U
: Uint
; Format
: UI_Format
);
353 -- Write Uint (using UI_Write) with initial column check, and possible
354 -- initial Write_Indent (to get new line) if current line is too full.
355 -- The format parameter determines the output format (see UI_Write).
357 procedure Write_Uint_With_Col_Check_Sloc
(U
: Uint
; Format
: UI_Format
);
358 -- Write Uint (using UI_Write) with initial column check, and possible
359 -- initial Write_Indent (to get new line) if current line is too full.
360 -- The format parameter determines the output format (see UI_Write).
361 -- In addition, in Debug_Generated_Code mode, sets the current node
362 -- Sloc to the first character of the output value.
364 procedure Write_Ureal_With_Col_Check_Sloc
(U
: Ureal
);
365 -- Write Ureal (using same output format as UR_Write) with column checks
366 -- and a possible initial Write_Indent (to get new line) if current line
367 -- is too full. In addition, in Debug_Generated_Code mode, sets the
368 -- current node Sloc to the first character of the output value.
374 procedure Col_Check
(N
: Nat
) is
376 if N
+ Column
> Sprint_Line_Limit
then
377 Write_Indent_Str
(" ");
381 ----------------------
382 -- Extra_Blank_Line --
383 ----------------------
385 procedure Extra_Blank_Line
is
387 if not Dump_Source_Text
then
390 end Extra_Blank_Line
;
396 procedure Indent_Annull
is
398 Indent_Annull_Flag
:= True;
405 procedure Indent_Begin
is
407 Indent
:= Indent
+ 3;
414 procedure Indent_End
is
416 Indent
:= Indent
- 3;
423 procedure pg
(Arg
: Union_Id
) is
425 Dump_Generated_Only
:= True;
426 Dump_Original_Only
:= False;
427 Dump_Freeze_Null
:= True;
428 Current_Source_File
:= No_Source_File
;
430 if Arg
in List_Range
then
431 Sprint_Node_List
(List_Id
(Arg
), New_Lines
=> True);
433 elsif Arg
in Node_Range
then
434 Sprint_Node
(Node_Id
(Arg
));
447 procedure po
(Arg
: Union_Id
) is
449 Dump_Generated_Only
:= False;
450 Dump_Original_Only
:= True;
451 Current_Source_File
:= No_Source_File
;
453 if Arg
in List_Range
then
454 Sprint_Node_List
(List_Id
(Arg
), New_Lines
=> True);
456 elsif Arg
in Node_Range
then
457 Sprint_Node
(Node_Id
(Arg
));
466 ----------------------
467 -- Print_Debug_Line --
468 ----------------------
470 procedure Print_Debug_Line
(S
: String) is
472 Write_Debug_Line
(S
, Debug_Sloc
);
473 end Print_Debug_Line
;
475 ---------------------------
476 -- Process_TFAI_RR_Flags --
477 ---------------------------
479 procedure Process_TFAI_RR_Flags
(Nod
: Node_Id
) is
481 if Treat_Fixed_As_Integer
(Nod
) then
485 if Rounded_Result
(Nod
) then
488 end Process_TFAI_RR_Flags
;
494 procedure ps
(Arg
: Union_Id
) is
496 Dump_Generated_Only
:= False;
497 Dump_Original_Only
:= False;
498 Current_Source_File
:= No_Source_File
;
500 if Arg
in List_Range
then
501 Sprint_Node_List
(List_Id
(Arg
), New_Lines
=> True);
503 elsif Arg
in Node_Range
then
504 Sprint_Node
(Node_Id
(Arg
));
517 procedure Set_Debug_Sloc
is
519 if Debug_Generated_Code
and then Present
(Dump_Node
) then
521 Loc
: constant Source_Ptr
:= Sloc
(Dump_Node
);
524 -- Do not change the location of nodes defined in package Standard
525 -- and nodes of pragmas scanned by Targparm.
527 if Loc
<= Standard_Location
then
530 -- Update the location of a node which is part of the current .dg
531 -- output. This situation occurs in comma separated parameter
532 -- declarations since each parameter references the same parameter
533 -- type node (ie. obj1, obj2 : <param-type>).
535 -- Note: This case is needed here since we cannot use the routine
536 -- In_Extended_Main_Code_Unit with nodes whose location is a .dg
539 elsif Loc
>= First_Debug_Sloc
then
540 Set_Sloc
(Dump_Node
, Debug_Sloc
+ Source_Ptr
(Column
- 1));
542 -- Do not change the location of nodes which are not part of the
545 elsif not In_Extended_Main_Code_Unit
(Loc
) then
549 Set_Sloc
(Dump_Node
, Debug_Sloc
+ Source_Ptr
(Column
- 1));
553 -- We do not know the actual end location in the generated code and
554 -- it could be much closer than in the source code, so play safe.
556 if Nkind_In
(Dump_Node
, N_Case_Statement
, N_If_Statement
) then
557 Set_End_Location
(Dump_Node
, Debug_Sloc
+ Source_Ptr
(Column
- 1));
568 procedure Source_Dump
is
571 -- Put underline under string we just printed
577 procedure Underline
is
578 Col
: constant Int
:= Column
;
583 while Col
> Column
loop
590 -- Start of processing for Source_Dump
593 Dump_Generated_Only
:= Debug_Flag_G
or
594 Print_Generated_Code
or
595 Debug_Generated_Code
;
596 Dump_Original_Only
:= Debug_Flag_O
;
597 Dump_Freeze_Null
:= Debug_Flag_S
or Debug_Flag_G
;
599 -- Note that we turn off the tree dump flags immediately, before
600 -- starting the dump. This avoids generating two copies of the dump
601 -- if an abort occurs after printing the dump, and more importantly,
602 -- avoids an infinite loop if an abort occurs during the dump.
605 Current_Source_File
:= No_Source_File
;
606 Debug_Flag_Z
:= False;
609 Write_Str
("Source recreated from tree of Standard (spec)");
611 Sprint_Node
(Standard_Package_Node
);
616 if Debug_Flag_S
or Dump_Generated_Only
or Dump_Original_Only
then
617 Debug_Flag_G
:= False;
618 Debug_Flag_O
:= False;
619 Debug_Flag_S
:= False;
620 First_Debug_Sloc
:= No_Location
;
622 -- Dump requested units
624 for U
in Main_Unit
.. Last_Unit
loop
625 Current_Source_File
:= Source_Index
(U
);
627 -- Dump all units if -gnatdf set, otherwise we dump only
628 -- the source files that are in the extended main source.
631 or else In_Extended_Main_Source_Unit
(Cunit_Entity
(U
))
633 -- If we are generating debug files, setup to write them
635 if Debug_Generated_Code
then
636 Set_Special_Output
(Print_Debug_Line
'Access);
637 Create_Debug_Source
(Source_Index
(U
), Debug_Sloc
);
638 First_Debug_Sloc
:= Debug_Sloc
;
639 Write_Source_Line
(1);
640 Last_Line_Printed
:= 1;
641 Sprint_Node
(Cunit
(U
));
642 Write_Source_Lines
(Last_Source_Line
(Current_Source_File
));
645 Set_Special_Output
(null);
647 -- Normal output to standard output file
650 Write_Str
("Source recreated from tree for ");
651 Write_Unit_Name
(Unit_Name
(U
));
653 Write_Source_Line
(1);
654 Last_Line_Printed
:= 1;
655 Sprint_Node
(Cunit
(U
));
656 Write_Source_Lines
(Last_Source_Line
(Current_Source_File
));
665 ---------------------
666 -- Sprint_And_List --
667 ---------------------
669 procedure Sprint_And_List
(List
: List_Id
) is
672 if Is_Non_Empty_List
(List
) then
673 Node
:= First
(List
);
677 exit when Node
= Empty
;
683 ----------------------------------
684 -- Sprint_Aspect_Specifications --
685 ----------------------------------
687 procedure Sprint_Aspect_Specifications
691 AS
: constant List_Id
:= Aspect_Specifications
(Node
);
696 Write_Erase_Char
(';');
697 Indent
:= Indent
+ 2;
700 Indent
:= Indent
+ 5;
703 Write_Str
(" with ");
708 Sprint_Node
(Identifier
(A
));
710 if Class_Present
(A
) then
711 Write_Str
("'Class");
714 if Present
(Expression
(A
)) then
716 Sprint_Node
(Expression
(A
));
730 Indent
:= Indent
- 7;
733 end Sprint_Aspect_Specifications
;
735 ---------------------
736 -- Sprint_Bar_List --
737 ---------------------
739 procedure Sprint_Bar_List
(List
: List_Id
) is
742 if Is_Non_Empty_List
(List
) then
743 Node
:= First
(List
);
747 exit when Node
= Empty
;
753 ----------------------
754 -- Sprint_End_Label --
755 ----------------------
757 procedure Sprint_End_Label
763 and then Present
(End_Label
(Node
))
764 and then Is_Entity_Name
(End_Label
(Node
))
766 Set_Entity
(End_Label
(Node
), Default
);
768 -- For a function whose name is an operator, use the qualified name
769 -- created for the defining entity.
771 if Nkind
(End_Label
(Node
)) = N_Operator_Symbol
then
772 Set_Chars
(End_Label
(Node
), Chars
(Default
));
775 Sprint_Node
(End_Label
(Node
));
777 Sprint_Node
(Default
);
779 end Sprint_End_Label
;
781 -----------------------
782 -- Sprint_Comma_List --
783 -----------------------
785 procedure Sprint_Comma_List
(List
: List_Id
) is
789 if Is_Non_Empty_List
(List
) then
790 Node
:= First
(List
);
794 exit when Node
= Empty
;
796 if not Is_Rewrite_Insertion
(Node
)
797 or else not Dump_Original_Only
803 end Sprint_Comma_List
;
805 --------------------------
806 -- Sprint_Indented_List --
807 --------------------------
809 procedure Sprint_Indented_List
(List
: List_Id
) is
812 Sprint_Node_List
(List
);
814 end Sprint_Indented_List
;
816 ---------------------
817 -- Sprint_Left_Opnd --
818 ---------------------
820 procedure Sprint_Left_Opnd
(N
: Node_Id
) is
821 Opnd
: constant Node_Id
:= Left_Opnd
(N
);
824 if Paren_Count
(Opnd
) /= 0
825 or else Op_Prec
(Nkind
(Opnd
)) >= Op_Prec
(Nkind
(N
))
834 end Sprint_Left_Opnd
;
840 procedure Sprint_Node
(Node
: Node_Id
) is
842 if Is_Rewrite_Insertion
(Node
) then
843 if not Dump_Original_Only
then
845 -- For special cases of nodes that always output <<< >>>
846 -- do not duplicate the output at this point.
848 if Nkind
(Node
) = N_Freeze_Entity
849 or else Nkind
(Node
) = N_Freeze_Generic_Entity
850 or else Nkind
(Node
) = N_Implicit_Label_Declaration
852 Sprint_Node_Actual
(Node
);
854 -- Normal case where <<< >>> may be required
857 Write_Rewrite_Str
("<<<");
858 Sprint_Node_Actual
(Node
);
859 Write_Rewrite_Str
(">>>");
863 elsif Is_Rewrite_Substitution
(Node
) then
865 -- Case of dump generated only
867 if Dump_Generated_Only
then
868 Sprint_Node_Actual
(Node
);
870 -- Case of dump original only
872 elsif Dump_Original_Only
then
873 Sprint_Node_Actual
(Original_Node
(Node
));
875 -- Case of both being dumped
878 Sprint_Node_Actual
(Original_Node
(Node
));
879 Write_Rewrite_Str
("<<<");
880 Sprint_Node_Actual
(Node
);
881 Write_Rewrite_Str
(">>>");
885 Sprint_Node_Actual
(Node
);
889 ------------------------
890 -- Sprint_Node_Actual --
891 ------------------------
893 procedure Sprint_Node_Actual
(Node
: Node_Id
) is
894 Save_Dump_Node
: constant Node_Id
:= Dump_Node
;
901 for J
in 1 .. Paren_Count
(Node
) loop
902 Write_Str_With_Col_Check
("(");
905 -- Setup current dump node
909 if Nkind
(Node
) in N_Subexpr
910 and then Do_Range_Check
(Node
)
912 Write_Str_With_Col_Check
("{");
915 -- Select print circuit based on node kind
918 when N_Abort_Statement
=>
919 Write_Indent_Str_Sloc
("abort ");
920 Sprint_Comma_List
(Names
(Node
));
923 when N_Abortable_Part
=>
925 Write_Str_Sloc
("abort ");
926 Sprint_Indented_List
(Statements
(Node
));
928 when N_Abstract_Subprogram_Declaration
=>
930 Sprint_Node
(Specification
(Node
));
931 Write_Str_With_Col_Check
(" is ");
932 Write_Str_Sloc
("abstract;");
934 when N_Accept_Alternative
=>
935 Sprint_Node_List
(Pragmas_Before
(Node
));
937 if Present
(Condition
(Node
)) then
938 Write_Indent_Str
("when ");
939 Sprint_Node
(Condition
(Node
));
944 Sprint_Node_Sloc
(Accept_Statement
(Node
));
945 Sprint_Node_List
(Statements
(Node
));
947 when N_Accept_Statement
=>
948 Write_Indent_Str_Sloc
("accept ");
949 Write_Id
(Entry_Direct_Name
(Node
));
951 if Present
(Entry_Index
(Node
)) then
952 Write_Str_With_Col_Check
(" (");
953 Sprint_Node
(Entry_Index
(Node
));
957 Write_Param_Specs
(Node
);
959 if Present
(Handled_Statement_Sequence
(Node
)) then
960 Write_Str_With_Col_Check
(" do");
961 Sprint_Node
(Handled_Statement_Sequence
(Node
));
962 Write_Indent_Str
("end ");
963 Write_Id
(Entry_Direct_Name
(Node
));
968 when N_Access_Definition
=>
972 if Present
(Access_To_Subprogram_Definition
(Node
)) then
973 Sprint_Node
(Access_To_Subprogram_Definition
(Node
));
977 if Null_Exclusion_Present
(Node
) then
978 Write_Str
("not null ");
981 Write_Str_With_Col_Check_Sloc
("access ");
983 if All_Present
(Node
) then
985 elsif Constant_Present
(Node
) then
986 Write_Str
("constant ");
989 Sprint_Node
(Subtype_Mark
(Node
));
992 when N_Access_Function_Definition
=>
996 if Null_Exclusion_Present
(Node
) then
997 Write_Str
("not null ");
1000 Write_Str_With_Col_Check_Sloc
("access ");
1002 if Protected_Present
(Node
) then
1003 Write_Str_With_Col_Check
("protected ");
1006 Write_Str_With_Col_Check
("function");
1007 Write_Param_Specs
(Node
);
1008 Write_Str_With_Col_Check
(" return ");
1009 Sprint_Node
(Result_Definition
(Node
));
1011 when N_Access_Procedure_Definition
=>
1013 -- Ada 2005 (AI-231)
1015 if Null_Exclusion_Present
(Node
) then
1016 Write_Str
("not null ");
1019 Write_Str_With_Col_Check_Sloc
("access ");
1021 if Protected_Present
(Node
) then
1022 Write_Str_With_Col_Check
("protected ");
1025 Write_Str_With_Col_Check
("procedure");
1026 Write_Param_Specs
(Node
);
1028 when N_Access_To_Object_Definition
=>
1029 Write_Str_With_Col_Check_Sloc
("access ");
1031 if All_Present
(Node
) then
1032 Write_Str_With_Col_Check
("all ");
1033 elsif Constant_Present
(Node
) then
1034 Write_Str_With_Col_Check
("constant ");
1037 -- Ada 2005 (AI-231)
1039 if Null_Exclusion_Present
(Node
) then
1040 Write_Str
("not null ");
1043 Sprint_Node
(Subtype_Indication
(Node
));
1046 if Null_Record_Present
(Node
) then
1047 Write_Str_With_Col_Check_Sloc
("(null record)");
1050 Write_Str_With_Col_Check_Sloc
("(");
1052 if Present
(Expressions
(Node
)) then
1053 Sprint_Comma_List
(Expressions
(Node
));
1055 if Present
(Component_Associations
(Node
))
1056 and then not Is_Empty_List
(Component_Associations
(Node
))
1062 if Present
(Component_Associations
(Node
))
1063 and then not Is_Empty_List
(Component_Associations
(Node
))
1071 Nd
:= First
(Component_Associations
(Node
));
1079 if not Is_Rewrite_Insertion
(Nd
)
1080 or else not Dump_Original_Only
1094 Write_Str_With_Col_Check_Sloc
("new ");
1096 -- Ada 2005 (AI-231)
1098 if Null_Exclusion_Present
(Node
) then
1099 Write_Str
("not null ");
1102 Sprint_Node
(Expression
(Node
));
1104 if Present
(Storage_Pool
(Node
)) then
1105 Write_Str_With_Col_Check
("[storage_pool = ");
1106 Sprint_Node
(Storage_Pool
(Node
));
1111 Sprint_Left_Opnd
(Node
);
1112 Write_Str_Sloc
(" and then ");
1113 Sprint_Right_Opnd
(Node
);
1115 -- Note: the following code for N_Aspect_Specification is not
1116 -- normally used, since we deal with aspects as part of a
1117 -- declaration, but it is here in case we deliberately try
1118 -- to print an N_Aspect_Speficiation node (e.g. from GDB).
1120 when N_Aspect_Specification
=>
1121 Sprint_Node
(Identifier
(Node
));
1123 Sprint_Node
(Expression
(Node
));
1125 when N_Assignment_Statement
=>
1127 Sprint_Node
(Name
(Node
));
1128 Write_Str_Sloc
(" := ");
1129 Sprint_Node
(Expression
(Node
));
1132 when N_Asynchronous_Select
=>
1133 Write_Indent_Str_Sloc
("select");
1135 Sprint_Node
(Triggering_Alternative
(Node
));
1138 -- Note: let the printing of Abortable_Part handle outputting
1139 -- the ABORT keyword, so that the Sloc can be set correctly.
1141 Write_Indent_Str
("then ");
1142 Sprint_Node
(Abortable_Part
(Node
));
1143 Write_Indent_Str
("end select;");
1146 Write_Indent_Str_Sloc
("for ");
1147 Write_Id
(Identifier
(Node
));
1148 Write_Str_With_Col_Check
(" use at ");
1149 Sprint_Node
(Expression
(Node
));
1152 when N_Attribute_Definition_Clause
=>
1153 Write_Indent_Str_Sloc
("for ");
1154 Sprint_Node
(Name
(Node
));
1156 Write_Name_With_Col_Check
(Chars
(Node
));
1157 Write_Str_With_Col_Check
(" use ");
1158 Sprint_Node
(Expression
(Node
));
1161 when N_Attribute_Reference
=>
1162 if Is_Procedure_Attribute_Name
(Attribute_Name
(Node
)) then
1166 Sprint_Node
(Prefix
(Node
));
1167 Write_Char_Sloc
(''');
1168 Write_Name_With_Col_Check
(Attribute_Name
(Node
));
1169 Sprint_Paren_Comma_List
(Expressions
(Node
));
1171 if Is_Procedure_Attribute_Name
(Attribute_Name
(Node
)) then
1175 when N_Block_Statement
=>
1178 if Present
(Identifier
(Node
))
1179 and then (not Has_Created_Identifier
(Node
)
1180 or else not Dump_Original_Only
)
1182 Write_Rewrite_Str
("<<<");
1183 Write_Id
(Identifier
(Node
));
1185 Write_Rewrite_Str
(">>>");
1188 if Present
(Declarations
(Node
)) then
1189 Write_Str_With_Col_Check_Sloc
("declare");
1190 Sprint_Indented_List
(Declarations
(Node
));
1194 Write_Str_With_Col_Check_Sloc
("begin");
1195 Sprint_Node
(Handled_Statement_Sequence
(Node
));
1196 Write_Indent_Str
("end");
1198 if Present
(Identifier
(Node
))
1199 and then (not Has_Created_Identifier
(Node
)
1200 or else not Dump_Original_Only
)
1202 Write_Rewrite_Str
("<<<");
1204 Write_Id
(Identifier
(Node
));
1205 Write_Rewrite_Str
(">>>");
1210 when N_Case_Expression
=>
1212 Has_Parens
: constant Boolean := Paren_Count
(Node
) > 0;
1216 -- The syntax for case_expression does not include parentheses,
1217 -- but sometimes parentheses are required, so unconditionally
1218 -- generate them here unless already present.
1220 if not Has_Parens
then
1224 Write_Str_With_Col_Check_Sloc
("case ");
1225 Sprint_Node
(Expression
(Node
));
1226 Write_Str_With_Col_Check
(" is");
1228 Alt
:= First
(Alternatives
(Node
));
1236 if not Has_Parens
then
1241 when N_Case_Expression_Alternative
=>
1242 Write_Str_With_Col_Check
(" when ");
1243 Sprint_Bar_List
(Discrete_Choices
(Node
));
1245 Sprint_Node
(Expression
(Node
));
1247 when N_Case_Statement
=>
1248 Write_Indent_Str_Sloc
("case ");
1249 Sprint_Node
(Expression
(Node
));
1251 Sprint_Indented_List
(Alternatives
(Node
));
1252 Write_Indent_Str
("end case;");
1254 when N_Case_Statement_Alternative
=>
1255 Write_Indent_Str_Sloc
("when ");
1256 Sprint_Bar_List
(Discrete_Choices
(Node
));
1258 Sprint_Indented_List
(Statements
(Node
));
1260 when N_Character_Literal
=>
1261 if Column
> Sprint_Line_Limit
- 2 then
1262 Write_Indent_Str
(" ");
1265 Write_Char_Sloc
(''');
1266 Write_Char_Code
(UI_To_CC
(Char_Literal_Value
(Node
)));
1269 when N_Code_Statement
=>
1272 Sprint_Node
(Expression
(Node
));
1275 when N_Compilation_Unit
=>
1276 Sprint_Node_List
(Context_Items
(Node
));
1277 Sprint_Opt_Node_List
(Declarations
(Aux_Decls_Node
(Node
)));
1279 if Private_Present
(Node
) then
1280 Write_Indent_Str
("private ");
1284 Sprint_Node_Sloc
(Unit
(Node
));
1286 if Present
(Actions
(Aux_Decls_Node
(Node
)))
1288 Present
(Pragmas_After
(Aux_Decls_Node
(Node
)))
1293 Sprint_Opt_Node_List
(Actions
(Aux_Decls_Node
(Node
)));
1294 Sprint_Opt_Node_List
(Pragmas_After
(Aux_Decls_Node
(Node
)));
1296 when N_Compilation_Unit_Aux
=>
1297 null; -- nothing to do, never used, see above
1299 when N_Component_Association
=>
1301 Sprint_Bar_List
(Choices
(Node
));
1304 -- Ada 2005 (AI-287): Print the box if present
1306 if Box_Present
(Node
) then
1307 Write_Str_With_Col_Check
("<>");
1309 Sprint_Node
(Expression
(Node
));
1312 when N_Component_Clause
=>
1314 Sprint_Node
(Component_Name
(Node
));
1315 Write_Str_Sloc
(" at ");
1316 Sprint_Node
(Position
(Node
));
1318 Write_Str_With_Col_Check
("range ");
1319 Sprint_Node
(First_Bit
(Node
));
1321 Sprint_Node
(Last_Bit
(Node
));
1324 when N_Component_Definition
=>
1327 -- Ada 2005 (AI-230): Access definition components
1329 if Present
(Access_Definition
(Node
)) then
1330 Sprint_Node
(Access_Definition
(Node
));
1332 elsif Present
(Subtype_Indication
(Node
)) then
1333 if Aliased_Present
(Node
) then
1334 Write_Str_With_Col_Check
("aliased ");
1337 -- Ada 2005 (AI-231)
1339 if Null_Exclusion_Present
(Node
) then
1340 Write_Str
(" not null ");
1343 Sprint_Node
(Subtype_Indication
(Node
));
1346 Write_Str
(" ??? ");
1349 when N_Component_Declaration
=>
1350 if Write_Indent_Identifiers_Sloc
(Node
) then
1352 Sprint_Node
(Component_Definition
(Node
));
1354 if Present
(Expression
(Node
)) then
1356 Sprint_Node
(Expression
(Node
));
1362 when N_Component_List
=>
1363 if Null_Present
(Node
) then
1365 Write_Indent_Str_Sloc
("null");
1371 Sprint_Indented_List
(Component_Items
(Node
));
1372 Sprint_Node
(Variant_Part
(Node
));
1375 when N_Compound_Statement
=>
1376 Write_Indent_Str
("do");
1378 Sprint_Node_List
(Actions
(Node
));
1380 Write_Indent_Str
("end;");
1382 when N_Conditional_Entry_Call
=>
1383 Write_Indent_Str_Sloc
("select");
1385 Sprint_Node
(Entry_Call_Alternative
(Node
));
1387 Write_Indent_Str
("else");
1388 Sprint_Indented_List
(Else_Statements
(Node
));
1389 Write_Indent_Str
("end select;");
1391 when N_Constrained_Array_Definition
=>
1392 Write_Str_With_Col_Check_Sloc
("array ");
1393 Sprint_Paren_Comma_List
(Discrete_Subtype_Definitions
(Node
));
1396 Sprint_Node
(Component_Definition
(Node
));
1398 -- A contract node should not appear in the tree. It is a semantic
1399 -- node attached to entry and [generic] subprogram entities. But we
1400 -- still provide meaningful output, in case called from the debugger.
1408 Write_Str
("N_Contract node");
1411 Write_Indent_Str
("Pre_Post_Conditions");
1414 P
:= Pre_Post_Conditions
(Node
);
1415 while Present
(P
) loop
1417 P
:= Next_Pragma
(P
);
1423 Write_Indent_Str
("Contract_Test_Cases");
1426 P
:= Contract_Test_Cases
(Node
);
1427 while Present
(P
) loop
1429 P
:= Next_Pragma
(P
);
1435 Write_Indent_Str
("Classifications");
1438 P
:= Classifications
(Node
);
1439 while Present
(P
) loop
1441 P
:= Next_Pragma
(P
);
1449 when N_Decimal_Fixed_Point_Definition
=>
1450 Write_Str_With_Col_Check_Sloc
(" delta ");
1451 Sprint_Node
(Delta_Expression
(Node
));
1452 Write_Str_With_Col_Check
("digits ");
1453 Sprint_Node
(Digits_Expression
(Node
));
1454 Sprint_Opt_Node
(Real_Range_Specification
(Node
));
1456 when N_Defining_Character_Literal
=>
1457 Write_Name_With_Col_Check_Sloc
(Chars
(Node
));
1459 when N_Defining_Identifier
=>
1463 when N_Defining_Operator_Symbol
=>
1464 Write_Name_With_Col_Check_Sloc
(Chars
(Node
));
1466 when N_Defining_Program_Unit_Name
=>
1468 Sprint_Node
(Name
(Node
));
1470 Write_Id
(Defining_Identifier
(Node
));
1472 when N_Delay_Alternative
=>
1473 Sprint_Node_List
(Pragmas_Before
(Node
));
1475 if Present
(Condition
(Node
)) then
1477 Write_Str_With_Col_Check
("when ");
1478 Sprint_Node
(Condition
(Node
));
1483 Sprint_Node_Sloc
(Delay_Statement
(Node
));
1484 Sprint_Node_List
(Statements
(Node
));
1486 when N_Delay_Relative_Statement
=>
1487 Write_Indent_Str_Sloc
("delay ");
1488 Sprint_Node
(Expression
(Node
));
1491 when N_Delay_Until_Statement
=>
1492 Write_Indent_Str_Sloc
("delay until ");
1493 Sprint_Node
(Expression
(Node
));
1496 when N_Delta_Constraint
=>
1497 Write_Str_With_Col_Check_Sloc
("delta ");
1498 Sprint_Node
(Delta_Expression
(Node
));
1499 Sprint_Opt_Node
(Range_Constraint
(Node
));
1501 when N_Derived_Type_Definition
=>
1502 if Abstract_Present
(Node
) then
1503 Write_Str_With_Col_Check
("abstract ");
1506 Write_Str_With_Col_Check
("new ");
1508 -- Ada 2005 (AI-231)
1510 if Null_Exclusion_Present
(Node
) then
1511 Write_Str_With_Col_Check
("not null ");
1514 Sprint_Node
(Subtype_Indication
(Node
));
1516 if Present
(Interface_List
(Node
)) then
1517 Write_Str_With_Col_Check
(" and ");
1518 Sprint_And_List
(Interface_List
(Node
));
1519 Write_Str_With_Col_Check
(" with ");
1522 if Present
(Record_Extension_Part
(Node
)) then
1523 if No
(Interface_List
(Node
)) then
1524 Write_Str_With_Col_Check
(" with ");
1527 Sprint_Node
(Record_Extension_Part
(Node
));
1530 when N_Designator
=>
1531 Sprint_Node
(Name
(Node
));
1532 Write_Char_Sloc
('.');
1533 Write_Id
(Identifier
(Node
));
1535 when N_Digits_Constraint
=>
1536 Write_Str_With_Col_Check_Sloc
("digits ");
1537 Sprint_Node
(Digits_Expression
(Node
));
1538 Sprint_Opt_Node
(Range_Constraint
(Node
));
1540 when N_Discriminant_Association
=>
1543 if Present
(Selector_Names
(Node
)) then
1544 Sprint_Bar_List
(Selector_Names
(Node
));
1549 Sprint_Node
(Expression
(Node
));
1551 when N_Discriminant_Specification
=>
1554 if Write_Identifiers
(Node
) then
1557 if Null_Exclusion_Present
(Node
) then
1558 Write_Str
("not null ");
1561 Sprint_Node
(Discriminant_Type
(Node
));
1563 if Present
(Expression
(Node
)) then
1565 Sprint_Node
(Expression
(Node
));
1571 when N_Elsif_Part
=>
1572 Write_Indent_Str_Sloc
("elsif ");
1573 Sprint_Node
(Condition
(Node
));
1574 Write_Str_With_Col_Check
(" then");
1575 Sprint_Indented_List
(Then_Statements
(Node
));
1580 when N_Entry_Body
=>
1581 Write_Indent_Str_Sloc
("entry ");
1582 Write_Id
(Defining_Identifier
(Node
));
1583 Sprint_Node
(Entry_Body_Formal_Part
(Node
));
1584 Write_Str_With_Col_Check
(" is");
1585 Sprint_Indented_List
(Declarations
(Node
));
1586 Write_Indent_Str
("begin");
1587 Sprint_Node
(Handled_Statement_Sequence
(Node
));
1588 Write_Indent_Str
("end ");
1589 Write_Id
(Defining_Identifier
(Node
));
1592 when N_Entry_Body_Formal_Part
=>
1593 if Present
(Entry_Index_Specification
(Node
)) then
1594 Write_Str_With_Col_Check_Sloc
(" (");
1595 Sprint_Node
(Entry_Index_Specification
(Node
));
1599 Write_Param_Specs
(Node
);
1600 Write_Str_With_Col_Check_Sloc
(" when ");
1601 Sprint_Node
(Condition
(Node
));
1603 when N_Entry_Call_Alternative
=>
1604 Sprint_Node_List
(Pragmas_Before
(Node
));
1605 Sprint_Node_Sloc
(Entry_Call_Statement
(Node
));
1606 Sprint_Node_List
(Statements
(Node
));
1608 when N_Entry_Call_Statement
=>
1610 Sprint_Node_Sloc
(Name
(Node
));
1611 Sprint_Opt_Paren_Comma_List
(Parameter_Associations
(Node
));
1614 when N_Entry_Declaration
=>
1615 Write_Indent_Str_Sloc
("entry ");
1616 Write_Id
(Defining_Identifier
(Node
));
1618 if Present
(Discrete_Subtype_Definition
(Node
)) then
1619 Write_Str_With_Col_Check
(" (");
1620 Sprint_Node
(Discrete_Subtype_Definition
(Node
));
1624 Write_Param_Specs
(Node
);
1627 when N_Entry_Index_Specification
=>
1628 Write_Str_With_Col_Check_Sloc
("for ");
1629 Write_Id
(Defining_Identifier
(Node
));
1630 Write_Str_With_Col_Check
(" in ");
1631 Sprint_Node
(Discrete_Subtype_Definition
(Node
));
1633 when N_Enumeration_Representation_Clause
=>
1634 Write_Indent_Str_Sloc
("for ");
1635 Write_Id
(Identifier
(Node
));
1636 Write_Str_With_Col_Check
(" use ");
1637 Sprint_Node
(Array_Aggregate
(Node
));
1640 when N_Enumeration_Type_Definition
=>
1643 -- Skip attempt to print Literals field if it's not there and
1644 -- we are in package Standard (case of Character, which is
1645 -- handled specially (without an explicit literals list).
1647 if Sloc
(Node
) > Standard_Location
1648 or else Present
(Literals
(Node
))
1650 Sprint_Paren_Comma_List
(Literals
(Node
));
1654 Write_Str_With_Col_Check_Sloc
("<error>");
1656 when N_Exception_Declaration
=>
1657 if Write_Indent_Identifiers
(Node
) then
1658 Write_Str_With_Col_Check
(" : ");
1660 if Is_Statically_Allocated
(Defining_Identifier
(Node
)) then
1661 Write_Str_With_Col_Check
("static ");
1664 Write_Str_Sloc
("exception");
1666 if Present
(Expression
(Node
)) then
1668 Sprint_Node
(Expression
(Node
));
1674 when N_Exception_Handler
=>
1675 Write_Indent_Str_Sloc
("when ");
1677 if Present
(Choice_Parameter
(Node
)) then
1678 Sprint_Node
(Choice_Parameter
(Node
));
1682 Sprint_Bar_List
(Exception_Choices
(Node
));
1684 Sprint_Indented_List
(Statements
(Node
));
1686 when N_Exception_Renaming_Declaration
=>
1689 Sprint_Node
(Defining_Identifier
(Node
));
1690 Write_Str_With_Col_Check
(" : exception renames ");
1691 Sprint_Node
(Name
(Node
));
1694 when N_Exit_Statement
=>
1695 Write_Indent_Str_Sloc
("exit");
1696 Sprint_Opt_Node
(Name
(Node
));
1698 if Present
(Condition
(Node
)) then
1699 Write_Str_With_Col_Check
(" when ");
1700 Sprint_Node
(Condition
(Node
));
1705 when N_Expanded_Name
=>
1706 Sprint_Node
(Prefix
(Node
));
1707 Write_Char_Sloc
('.');
1708 Sprint_Node
(Selector_Name
(Node
));
1710 when N_Explicit_Dereference
=>
1711 Sprint_Node
(Prefix
(Node
));
1712 Write_Char_Sloc
('.');
1713 Write_Str_Sloc
("all");
1715 when N_Expression_With_Actions
=>
1717 Write_Indent_Str_Sloc
("do ");
1719 Sprint_Node_List
(Actions
(Node
));
1722 Write_Str_With_Col_Check_Sloc
("in ");
1723 Sprint_Node
(Expression
(Node
));
1724 Write_Str_With_Col_Check
(" end");
1728 when N_Expression_Function
=>
1730 Sprint_Node_Sloc
(Specification
(Node
));
1734 Sprint_Node
(Expression
(Node
));
1738 when N_Extended_Return_Statement
=>
1739 Write_Indent_Str_Sloc
("return ");
1740 Sprint_Node_List
(Return_Object_Declarations
(Node
));
1742 if Present
(Handled_Statement_Sequence
(Node
)) then
1743 Write_Str_With_Col_Check
(" do");
1744 Sprint_Node
(Handled_Statement_Sequence
(Node
));
1745 Write_Indent_Str
("end return;");
1747 Write_Indent_Str
(";");
1750 when N_Extension_Aggregate
=>
1751 Write_Str_With_Col_Check_Sloc
("(");
1752 Sprint_Node
(Ancestor_Part
(Node
));
1753 Write_Str_With_Col_Check
(" with ");
1755 if Null_Record_Present
(Node
) then
1756 Write_Str_With_Col_Check
("null record");
1758 if Present
(Expressions
(Node
)) then
1759 Sprint_Comma_List
(Expressions
(Node
));
1761 if Present
(Component_Associations
(Node
)) then
1766 if Present
(Component_Associations
(Node
)) then
1767 Sprint_Comma_List
(Component_Associations
(Node
));
1773 when N_Floating_Point_Definition
=>
1774 Write_Str_With_Col_Check_Sloc
("digits ");
1775 Sprint_Node
(Digits_Expression
(Node
));
1776 Sprint_Opt_Node
(Real_Range_Specification
(Node
));
1778 when N_Formal_Decimal_Fixed_Point_Definition
=>
1779 Write_Str_With_Col_Check_Sloc
("delta <> digits <>");
1781 when N_Formal_Derived_Type_Definition
=>
1782 Write_Str_With_Col_Check_Sloc
("new ");
1783 Sprint_Node
(Subtype_Mark
(Node
));
1785 if Present
(Interface_List
(Node
)) then
1786 Write_Str_With_Col_Check
(" and ");
1787 Sprint_And_List
(Interface_List
(Node
));
1790 if Private_Present
(Node
) then
1791 Write_Str_With_Col_Check
(" with private");
1794 when N_Formal_Abstract_Subprogram_Declaration
=>
1795 Write_Indent_Str_Sloc
("with ");
1796 Sprint_Node
(Specification
(Node
));
1798 Write_Str_With_Col_Check
(" is abstract");
1800 if Box_Present
(Node
) then
1801 Write_Str_With_Col_Check
(" <>");
1802 elsif Present
(Default_Name
(Node
)) then
1803 Write_Str_With_Col_Check
(" ");
1804 Sprint_Node
(Default_Name
(Node
));
1809 when N_Formal_Concrete_Subprogram_Declaration
=>
1810 Write_Indent_Str_Sloc
("with ");
1811 Sprint_Node
(Specification
(Node
));
1813 if Box_Present
(Node
) then
1814 Write_Str_With_Col_Check
(" is <>");
1815 elsif Present
(Default_Name
(Node
)) then
1816 Write_Str_With_Col_Check
(" is ");
1817 Sprint_Node
(Default_Name
(Node
));
1822 when N_Formal_Discrete_Type_Definition
=>
1823 Write_Str_With_Col_Check_Sloc
("<>");
1825 when N_Formal_Floating_Point_Definition
=>
1826 Write_Str_With_Col_Check_Sloc
("digits <>");
1828 when N_Formal_Modular_Type_Definition
=>
1829 Write_Str_With_Col_Check_Sloc
("mod <>");
1831 when N_Formal_Object_Declaration
=>
1834 if Write_Indent_Identifiers
(Node
) then
1837 if In_Present
(Node
) then
1838 Write_Str_With_Col_Check
("in ");
1841 if Out_Present
(Node
) then
1842 Write_Str_With_Col_Check
("out ");
1845 if Present
(Subtype_Mark
(Node
)) then
1847 -- Ada 2005 (AI-423): Formal object with null exclusion
1849 if Null_Exclusion_Present
(Node
) then
1850 Write_Str
("not null ");
1853 Sprint_Node
(Subtype_Mark
(Node
));
1855 -- Ada 2005 (AI-423): Formal object with access definition
1858 pragma Assert
(Present
(Access_Definition
(Node
)));
1860 Sprint_Node
(Access_Definition
(Node
));
1863 if Present
(Default_Expression
(Node
)) then
1865 Sprint_Node
(Default_Expression
(Node
));
1871 when N_Formal_Ordinary_Fixed_Point_Definition
=>
1872 Write_Str_With_Col_Check_Sloc
("delta <>");
1874 when N_Formal_Package_Declaration
=>
1875 Write_Indent_Str_Sloc
("with package ");
1876 Write_Id
(Defining_Identifier
(Node
));
1877 Write_Str_With_Col_Check
(" is new ");
1878 Sprint_Node
(Name
(Node
));
1879 Write_Str_With_Col_Check
(" (<>);");
1881 when N_Formal_Private_Type_Definition
=>
1882 if Abstract_Present
(Node
) then
1883 Write_Str_With_Col_Check
("abstract ");
1886 if Tagged_Present
(Node
) then
1887 Write_Str_With_Col_Check
("tagged ");
1890 if Limited_Present
(Node
) then
1891 Write_Str_With_Col_Check
("limited ");
1894 Write_Str_With_Col_Check_Sloc
("private");
1896 when N_Formal_Incomplete_Type_Definition
=>
1897 if Tagged_Present
(Node
) then
1898 Write_Str_With_Col_Check
("is tagged ");
1901 when N_Formal_Signed_Integer_Type_Definition
=>
1902 Write_Str_With_Col_Check_Sloc
("range <>");
1904 when N_Formal_Type_Declaration
=>
1905 Write_Indent_Str_Sloc
("type ");
1906 Write_Id
(Defining_Identifier
(Node
));
1908 if Present
(Discriminant_Specifications
(Node
)) then
1909 Write_Discr_Specs
(Node
);
1910 elsif Unknown_Discriminants_Present
(Node
) then
1911 Write_Str_With_Col_Check
("(<>)");
1914 if Nkind
(Formal_Type_Definition
(Node
)) /=
1915 N_Formal_Incomplete_Type_Definition
1917 Write_Str_With_Col_Check
(" is ");
1920 Sprint_Node
(Formal_Type_Definition
(Node
));
1923 when N_Free_Statement
=>
1924 Write_Indent_Str_Sloc
("free ");
1925 Sprint_Node
(Expression
(Node
));
1928 when N_Freeze_Entity
=>
1929 if Dump_Original_Only
then
1932 -- A freeze node is output if it has some effect (i.e. non-empty
1933 -- actions, or freeze node for an itype, which causes elaboration
1934 -- of the itype), and is also always output if Dump_Freeze_Null
1937 elsif Present
(Actions
(Node
))
1938 or else Is_Itype
(Entity
(Node
))
1939 or else Dump_Freeze_Null
1942 Write_Rewrite_Str
("<<<");
1943 Write_Str_With_Col_Check_Sloc
("freeze ");
1944 Write_Id
(Entity
(Node
));
1947 if No
(Actions
(Node
)) then
1951 -- Output freeze actions. We increment Freeze_Indent during
1952 -- this output to avoid generating extra blank lines before
1953 -- any procedures included in the freeze actions.
1955 Freeze_Indent
:= Freeze_Indent
+ 1;
1956 Sprint_Indented_List
(Actions
(Node
));
1957 Freeze_Indent
:= Freeze_Indent
- 1;
1958 Write_Indent_Str
("]");
1961 Write_Rewrite_Str
(">>>");
1964 when N_Freeze_Generic_Entity
=>
1965 if Dump_Original_Only
then
1970 Write_Str_With_Col_Check_Sloc
("freeze_generic ");
1971 Write_Id
(Entity
(Node
));
1974 when N_Full_Type_Declaration
=>
1975 Write_Indent_Str_Sloc
("type ");
1976 Sprint_Node
(Defining_Identifier
(Node
));
1977 Write_Discr_Specs
(Node
);
1978 Write_Str_With_Col_Check
(" is ");
1979 Sprint_Node
(Type_Definition
(Node
));
1982 when N_Function_Call
=>
1984 Write_Subprogram_Name
(Name
(Node
));
1985 Sprint_Opt_Paren_Comma_List
(Parameter_Associations
(Node
));
1987 when N_Function_Instantiation
=>
1988 Write_Indent_Str_Sloc
("function ");
1989 Sprint_Node
(Defining_Unit_Name
(Node
));
1990 Write_Str_With_Col_Check
(" is new ");
1991 Sprint_Node
(Name
(Node
));
1992 Sprint_Opt_Paren_Comma_List
(Generic_Associations
(Node
));
1995 when N_Function_Specification
=>
1996 Write_Str_With_Col_Check_Sloc
("function ");
1997 Sprint_Node
(Defining_Unit_Name
(Node
));
1998 Write_Param_Specs
(Node
);
1999 Write_Str_With_Col_Check
(" return ");
2001 -- Ada 2005 (AI-231)
2003 if Nkind
(Result_Definition
(Node
)) /= N_Access_Definition
2004 and then Null_Exclusion_Present
(Node
)
2006 Write_Str
(" not null ");
2009 Sprint_Node
(Result_Definition
(Node
));
2011 when N_Generic_Association
=>
2014 if Present
(Selector_Name
(Node
)) then
2015 Sprint_Node
(Selector_Name
(Node
));
2019 Sprint_Node
(Explicit_Generic_Actual_Parameter
(Node
));
2021 when N_Generic_Function_Renaming_Declaration
=>
2022 Write_Indent_Str_Sloc
("generic function ");
2023 Sprint_Node
(Defining_Unit_Name
(Node
));
2024 Write_Str_With_Col_Check
(" renames ");
2025 Sprint_Node
(Name
(Node
));
2028 when N_Generic_Package_Declaration
=>
2030 Write_Indent_Str_Sloc
("generic ");
2031 Sprint_Indented_List
(Generic_Formal_Declarations
(Node
));
2033 Sprint_Node
(Specification
(Node
));
2036 when N_Generic_Package_Renaming_Declaration
=>
2037 Write_Indent_Str_Sloc
("generic package ");
2038 Sprint_Node
(Defining_Unit_Name
(Node
));
2039 Write_Str_With_Col_Check
(" renames ");
2040 Sprint_Node
(Name
(Node
));
2043 when N_Generic_Procedure_Renaming_Declaration
=>
2044 Write_Indent_Str_Sloc
("generic procedure ");
2045 Sprint_Node
(Defining_Unit_Name
(Node
));
2046 Write_Str_With_Col_Check
(" renames ");
2047 Sprint_Node
(Name
(Node
));
2050 when N_Generic_Subprogram_Declaration
=>
2052 Write_Indent_Str_Sloc
("generic ");
2053 Sprint_Indented_List
(Generic_Formal_Declarations
(Node
));
2055 Sprint_Node
(Specification
(Node
));
2058 when N_Goto_Statement
=>
2059 Write_Indent_Str_Sloc
("goto ");
2060 Sprint_Node
(Name
(Node
));
2063 if Nkind
(Next
(Node
)) = N_Label
then
2067 when N_Handled_Sequence_Of_Statements
=>
2069 Sprint_Indented_List
(Statements
(Node
));
2071 if Present
(Exception_Handlers
(Node
)) then
2072 Write_Indent_Str
("exception");
2074 Sprint_Node_List
(Exception_Handlers
(Node
));
2078 if Present
(At_End_Proc
(Node
)) then
2079 Write_Indent_Str
("at end");
2082 Sprint_Node
(At_End_Proc
(Node
));
2087 when N_Identifier
=>
2091 when N_If_Expression
=>
2093 Has_Parens
: constant Boolean := Paren_Count
(Node
) > 0;
2094 Condition
: constant Node_Id
:= First
(Expressions
(Node
));
2095 Then_Expr
: constant Node_Id
:= Next
(Condition
);
2098 -- The syntax for if_expression does not include parentheses,
2099 -- but sometimes parentheses are required, so unconditionally
2100 -- generate them here unless already present.
2102 if not Has_Parens
then
2106 Write_Str_With_Col_Check_Sloc
("if ");
2107 Sprint_Node
(Condition
);
2108 Write_Str_With_Col_Check
(" then ");
2110 -- Defense against junk here
2112 if Present
(Then_Expr
) then
2113 Sprint_Node
(Then_Expr
);
2115 if Present
(Next
(Then_Expr
)) then
2116 Write_Str_With_Col_Check
(" else ");
2117 Sprint_Node
(Next
(Then_Expr
));
2121 if not Has_Parens
then
2126 when N_If_Statement
=>
2127 Write_Indent_Str_Sloc
("if ");
2128 Sprint_Node
(Condition
(Node
));
2129 Write_Str_With_Col_Check
(" then");
2130 Sprint_Indented_List
(Then_Statements
(Node
));
2131 Sprint_Opt_Node_List
(Elsif_Parts
(Node
));
2133 if Present
(Else_Statements
(Node
)) then
2134 Write_Indent_Str
("else");
2135 Sprint_Indented_List
(Else_Statements
(Node
));
2138 Write_Indent_Str
("end if;");
2140 when N_Implicit_Label_Declaration
=>
2141 if not Dump_Original_Only
then
2143 Write_Rewrite_Str
("<<<");
2145 Write_Id
(Defining_Identifier
(Node
));
2147 Write_Str_With_Col_Check
("label");
2148 Write_Rewrite_Str
(">>>");
2152 Sprint_Left_Opnd
(Node
);
2153 Write_Str_Sloc
(" in ");
2155 if Present
(Right_Opnd
(Node
)) then
2156 Sprint_Right_Opnd
(Node
);
2158 Sprint_Bar_List
(Alternatives
(Node
));
2161 when N_Incomplete_Type_Declaration
=>
2162 Write_Indent_Str_Sloc
("type ");
2163 Write_Id
(Defining_Identifier
(Node
));
2165 if Present
(Discriminant_Specifications
(Node
)) then
2166 Write_Discr_Specs
(Node
);
2167 elsif Unknown_Discriminants_Present
(Node
) then
2168 Write_Str_With_Col_Check
("(<>)");
2173 when N_Index_Or_Discriminant_Constraint
=>
2175 Sprint_Paren_Comma_List
(Constraints
(Node
));
2177 when N_Indexed_Component
=>
2178 Sprint_Node_Sloc
(Prefix
(Node
));
2179 Sprint_Opt_Paren_Comma_List
(Expressions
(Node
));
2181 when N_Integer_Literal
=>
2182 if Print_In_Hex
(Node
) then
2183 Write_Uint_With_Col_Check_Sloc
(Intval
(Node
), Hex
);
2185 Write_Uint_With_Col_Check_Sloc
(Intval
(Node
), Auto
);
2188 when N_Iteration_Scheme
=>
2189 if Present
(Condition
(Node
)) then
2190 Write_Str_With_Col_Check_Sloc
("while ");
2191 Sprint_Node
(Condition
(Node
));
2193 Write_Str_With_Col_Check_Sloc
("for ");
2195 if Present
(Iterator_Specification
(Node
)) then
2196 Sprint_Node
(Iterator_Specification
(Node
));
2198 Sprint_Node
(Loop_Parameter_Specification
(Node
));
2204 when N_Iterator_Specification
=>
2206 Write_Id
(Defining_Identifier
(Node
));
2208 if Present
(Subtype_Indication
(Node
)) then
2209 Write_Str_With_Col_Check
(" : ");
2210 Sprint_Node
(Subtype_Indication
(Node
));
2213 if Of_Present
(Node
) then
2214 Write_Str_With_Col_Check
(" of ");
2216 Write_Str_With_Col_Check
(" in ");
2219 if Reverse_Present
(Node
) then
2220 Write_Str_With_Col_Check
("reverse ");
2223 Sprint_Node
(Name
(Node
));
2225 when N_Itype_Reference
=>
2226 Write_Indent_Str_Sloc
("reference ");
2227 Write_Id
(Itype
(Node
));
2230 Write_Indent_Str_Sloc
("<<");
2231 Write_Id
(Identifier
(Node
));
2234 when N_Loop_Parameter_Specification
=>
2236 Write_Id
(Defining_Identifier
(Node
));
2237 Write_Str_With_Col_Check
(" in ");
2239 if Reverse_Present
(Node
) then
2240 Write_Str_With_Col_Check
("reverse ");
2243 Sprint_Node
(Discrete_Subtype_Definition
(Node
));
2245 when N_Loop_Statement
=>
2248 if Present
(Identifier
(Node
))
2249 and then (not Has_Created_Identifier
(Node
)
2250 or else not Dump_Original_Only
)
2252 Write_Rewrite_Str
("<<<");
2253 Write_Id
(Identifier
(Node
));
2255 Write_Rewrite_Str
(">>>");
2256 Sprint_Node
(Iteration_Scheme
(Node
));
2257 Write_Str_With_Col_Check_Sloc
("loop");
2258 Sprint_Indented_List
(Statements
(Node
));
2259 Write_Indent_Str
("end loop ");
2260 Write_Rewrite_Str
("<<<");
2261 Write_Id
(Identifier
(Node
));
2262 Write_Rewrite_Str
(">>>");
2266 Sprint_Node
(Iteration_Scheme
(Node
));
2267 Write_Str_With_Col_Check_Sloc
("loop");
2268 Sprint_Indented_List
(Statements
(Node
));
2269 Write_Indent_Str
("end loop;");
2272 when N_Mod_Clause
=>
2273 Sprint_Node_List
(Pragmas_Before
(Node
));
2274 Write_Str_With_Col_Check_Sloc
("at mod ");
2275 Sprint_Node
(Expression
(Node
));
2277 when N_Modular_Type_Definition
=>
2278 Write_Str_With_Col_Check_Sloc
("mod ");
2279 Sprint_Node
(Expression
(Node
));
2282 Sprint_Left_Opnd
(Node
);
2283 Write_Str_Sloc
(" not in ");
2285 if Present
(Right_Opnd
(Node
)) then
2286 Sprint_Right_Opnd
(Node
);
2288 Sprint_Bar_List
(Alternatives
(Node
));
2292 Write_Str_With_Col_Check_Sloc
("null");
2294 when N_Null_Statement
=>
2295 if Comes_From_Source
(Node
)
2296 or else Dump_Freeze_Null
2297 or else not Is_List_Member
(Node
)
2298 or else (No
(Prev
(Node
)) and then No
(Next
(Node
)))
2300 Write_Indent_Str_Sloc
("null;");
2303 when N_Number_Declaration
=>
2306 if Write_Indent_Identifiers
(Node
) then
2307 Write_Str_With_Col_Check
(" : constant ");
2309 Sprint_Node
(Expression
(Node
));
2313 when N_Object_Declaration
=>
2316 if Write_Indent_Identifiers
(Node
) then
2318 Def_Id
: constant Entity_Id
:= Defining_Identifier
(Node
);
2321 Write_Str_With_Col_Check
(" : ");
2323 if Is_Statically_Allocated
(Def_Id
) then
2324 Write_Str_With_Col_Check
("static ");
2327 if Aliased_Present
(Node
) then
2328 Write_Str_With_Col_Check
("aliased ");
2331 if Constant_Present
(Node
) then
2332 Write_Str_With_Col_Check
("constant ");
2335 -- Ada 2005 (AI-231)
2337 if Null_Exclusion_Present
(Node
) then
2338 Write_Str_With_Col_Check
("not null ");
2341 -- Print type. We used to print the Object_Definition from
2342 -- the node, but it is much more useful to print the Etype
2343 -- of the defining identifier for the case where the nominal
2344 -- type is an unconstrained array type. For example, this
2345 -- will be a clear reference to the Itype with the bounds
2346 -- in the case of a type like String. The object after
2347 -- all is constrained, even if its nominal subtype is
2351 Odef
: constant Node_Id
:= Object_Definition
(Node
);
2354 if Nkind
(Odef
) = N_Identifier
2355 and then Present
(Etype
(Odef
))
2356 and then Is_Array_Type
(Etype
(Odef
))
2357 and then not Is_Constrained
(Etype
(Odef
))
2358 and then Present
(Etype
(Def_Id
))
2360 Sprint_Node
(Etype
(Def_Id
));
2362 -- In other cases, the nominal type is fine to print
2369 if Present
(Expression
(Node
)) then
2371 Sprint_Node
(Expression
(Node
));
2376 -- Handle implicit importation and implicit exportation of
2377 -- object declarations:
2378 -- $pragma import (Convention_Id, Def_Id, "...");
2379 -- $pragma export (Convention_Id, Def_Id, "...");
2381 if Is_Internal
(Def_Id
)
2382 and then Present
(Interface_Name
(Def_Id
))
2384 Write_Indent_Str_Sloc
("$pragma ");
2386 if Is_Imported
(Def_Id
) then
2387 Write_Str
("import (");
2389 else pragma Assert
(Is_Exported
(Def_Id
));
2390 Write_Str
("export (");
2394 Prefix
: constant String := "Convention_";
2395 S
: constant String := Convention
(Def_Id
)'Img;
2398 Name_Len
:= S
'Last - Prefix
'Last;
2399 Name_Buffer
(1 .. Name_Len
) :=
2400 S
(Prefix
'Last + 1 .. S
'Last);
2401 Set_Casing
(All_Lower_Case
);
2402 Write_Str
(Name_Buffer
(1 .. Name_Len
));
2408 Write_String_Table_Entry
2409 (Strval
(Interface_Name
(Def_Id
)));
2415 when N_Object_Renaming_Declaration
=>
2418 Sprint_Node
(Defining_Identifier
(Node
));
2421 -- Ada 2005 (AI-230): Access renamings
2423 if Present
(Access_Definition
(Node
)) then
2424 Sprint_Node
(Access_Definition
(Node
));
2426 elsif Present
(Subtype_Mark
(Node
)) then
2428 -- Ada 2005 (AI-423): Object renaming with a null exclusion
2430 if Null_Exclusion_Present
(Node
) then
2431 Write_Str
("not null ");
2434 Sprint_Node
(Subtype_Mark
(Node
));
2437 Write_Str
(" ??? ");
2440 Write_Str_With_Col_Check
(" renames ");
2441 Sprint_Node
(Name
(Node
));
2445 Write_Operator
(Node
, "abs ");
2446 Sprint_Right_Opnd
(Node
);
2449 Sprint_Left_Opnd
(Node
);
2450 Write_Operator
(Node
, " + ");
2451 Sprint_Right_Opnd
(Node
);
2454 Sprint_Left_Opnd
(Node
);
2455 Write_Operator
(Node
, " and ");
2456 Sprint_Right_Opnd
(Node
);
2459 Sprint_Left_Opnd
(Node
);
2460 Write_Operator
(Node
, " & ");
2461 Sprint_Right_Opnd
(Node
);
2464 Sprint_Left_Opnd
(Node
);
2466 Process_TFAI_RR_Flags
(Node
);
2467 Write_Operator
(Node
, "/ ");
2468 Sprint_Right_Opnd
(Node
);
2471 Sprint_Left_Opnd
(Node
);
2472 Write_Operator
(Node
, " = ");
2473 Sprint_Right_Opnd
(Node
);
2476 Sprint_Left_Opnd
(Node
);
2477 Write_Operator
(Node
, " ** ");
2478 Sprint_Right_Opnd
(Node
);
2481 Sprint_Left_Opnd
(Node
);
2482 Write_Operator
(Node
, " >= ");
2483 Sprint_Right_Opnd
(Node
);
2486 Sprint_Left_Opnd
(Node
);
2487 Write_Operator
(Node
, " > ");
2488 Sprint_Right_Opnd
(Node
);
2491 Sprint_Left_Opnd
(Node
);
2492 Write_Operator
(Node
, " <= ");
2493 Sprint_Right_Opnd
(Node
);
2496 Sprint_Left_Opnd
(Node
);
2497 Write_Operator
(Node
, " < ");
2498 Sprint_Right_Opnd
(Node
);
2501 Write_Operator
(Node
, "-");
2502 Sprint_Right_Opnd
(Node
);
2505 Sprint_Left_Opnd
(Node
);
2507 if Treat_Fixed_As_Integer
(Node
) then
2511 Write_Operator
(Node
, " mod ");
2512 Sprint_Right_Opnd
(Node
);
2514 when N_Op_Multiply
=>
2515 Sprint_Left_Opnd
(Node
);
2517 Process_TFAI_RR_Flags
(Node
);
2518 Write_Operator
(Node
, "* ");
2519 Sprint_Right_Opnd
(Node
);
2522 Sprint_Left_Opnd
(Node
);
2523 Write_Operator
(Node
, " /= ");
2524 Sprint_Right_Opnd
(Node
);
2527 Write_Operator
(Node
, "not ");
2528 Sprint_Right_Opnd
(Node
);
2531 Sprint_Left_Opnd
(Node
);
2532 Write_Operator
(Node
, " or ");
2533 Sprint_Right_Opnd
(Node
);
2536 Write_Operator
(Node
, "+");
2537 Sprint_Right_Opnd
(Node
);
2540 Sprint_Left_Opnd
(Node
);
2542 if Treat_Fixed_As_Integer
(Node
) then
2546 Write_Operator
(Node
, " rem ");
2547 Sprint_Right_Opnd
(Node
);
2553 Write_Str_With_Col_Check
("(");
2554 Sprint_Node
(Left_Opnd
(Node
));
2556 Sprint_Node
(Right_Opnd
(Node
));
2559 when N_Op_Subtract
=>
2560 Sprint_Left_Opnd
(Node
);
2561 Write_Operator
(Node
, " - ");
2562 Sprint_Right_Opnd
(Node
);
2565 Sprint_Left_Opnd
(Node
);
2566 Write_Operator
(Node
, " xor ");
2567 Sprint_Right_Opnd
(Node
);
2569 when N_Operator_Symbol
=>
2570 Write_Name_With_Col_Check_Sloc
(Chars
(Node
));
2572 when N_Ordinary_Fixed_Point_Definition
=>
2573 Write_Str_With_Col_Check_Sloc
("delta ");
2574 Sprint_Node
(Delta_Expression
(Node
));
2575 Sprint_Opt_Node
(Real_Range_Specification
(Node
));
2578 Sprint_Left_Opnd
(Node
);
2579 Write_Str_Sloc
(" or else ");
2580 Sprint_Right_Opnd
(Node
);
2582 when N_Others_Choice
=>
2583 if All_Others
(Node
) then
2584 Write_Str_With_Col_Check
("all ");
2587 Write_Str_With_Col_Check_Sloc
("others");
2589 when N_Package_Body
=>
2591 Write_Indent_Str_Sloc
("package body ");
2592 Sprint_Node
(Defining_Unit_Name
(Node
));
2594 Sprint_Indented_List
(Declarations
(Node
));
2596 if Present
(Handled_Statement_Sequence
(Node
)) then
2597 Write_Indent_Str
("begin");
2598 Sprint_Node
(Handled_Statement_Sequence
(Node
));
2601 Write_Indent_Str
("end ");
2603 (Handled_Statement_Sequence
(Node
), Defining_Unit_Name
(Node
));
2606 when N_Package_Body_Stub
=>
2607 Write_Indent_Str_Sloc
("package body ");
2608 Sprint_Node
(Defining_Identifier
(Node
));
2609 Write_Str_With_Col_Check
(" is separate;");
2611 when N_Package_Declaration
=>
2614 Sprint_Node_Sloc
(Specification
(Node
));
2617 -- If this is an instantiation, get the aspects from the original
2618 -- instantiation node.
2620 if Is_Generic_Instance
(Defining_Entity
(Node
))
2621 and then Has_Aspects
2622 (Package_Instantiation
(Defining_Entity
(Node
)))
2624 Sprint_Aspect_Specifications
2625 (Package_Instantiation
(Defining_Entity
(Node
)),
2629 when N_Package_Instantiation
=>
2631 Write_Indent_Str_Sloc
("package ");
2632 Sprint_Node
(Defining_Unit_Name
(Node
));
2633 Write_Str
(" is new ");
2634 Sprint_Node
(Name
(Node
));
2635 Sprint_Opt_Paren_Comma_List
(Generic_Associations
(Node
));
2638 when N_Package_Renaming_Declaration
=>
2639 Write_Indent_Str_Sloc
("package ");
2640 Sprint_Node
(Defining_Unit_Name
(Node
));
2641 Write_Str_With_Col_Check
(" renames ");
2642 Sprint_Node
(Name
(Node
));
2645 when N_Package_Specification
=>
2646 Write_Str_With_Col_Check_Sloc
("package ");
2647 Sprint_Node
(Defining_Unit_Name
(Node
));
2649 if Nkind
(Parent
(Node
)) = N_Generic_Package_Declaration
2650 and then Has_Aspects
(Parent
(Node
))
2652 Sprint_Aspect_Specifications
2653 (Parent
(Node
), Semicolon
=> False);
2655 -- An instantiation is rewritten as a package declaration, but
2656 -- the aspects belong to the instantiation node.
2658 elsif Nkind
(Parent
(Node
)) = N_Package_Declaration
then
2660 Pack
: constant Entity_Id
:= Defining_Entity
(Node
);
2663 if not Is_Generic_Instance
(Pack
) then
2664 if Has_Aspects
(Parent
(Node
)) then
2665 Sprint_Aspect_Specifications
2666 (Parent
(Node
), Semicolon
=> False);
2673 Sprint_Indented_List
(Visible_Declarations
(Node
));
2675 if Present
(Private_Declarations
(Node
)) then
2676 Write_Indent_Str
("private");
2677 Sprint_Indented_List
(Private_Declarations
(Node
));
2680 Write_Indent_Str
("end ");
2681 Sprint_Node
(Defining_Unit_Name
(Node
));
2683 when N_Parameter_Association
=>
2684 Sprint_Node_Sloc
(Selector_Name
(Node
));
2686 Sprint_Node
(Explicit_Actual_Parameter
(Node
));
2688 when N_Parameter_Specification
=>
2691 if Write_Identifiers
(Node
) then
2694 if In_Present
(Node
) then
2695 Write_Str_With_Col_Check
("in ");
2698 if Out_Present
(Node
) then
2699 Write_Str_With_Col_Check
("out ");
2702 -- Ada 2005 (AI-231): Parameter specification may carry null
2703 -- exclusion. Do not print it now if this is an access formal,
2704 -- it is emitted when the access definition is displayed.
2706 if Null_Exclusion_Present
(Node
)
2707 and then Nkind
(Parameter_Type
(Node
)) /= N_Access_Definition
2709 Write_Str
("not null ");
2712 if Aliased_Present
(Node
) then
2713 Write_Str
("aliased ");
2716 Sprint_Node
(Parameter_Type
(Node
));
2718 if Present
(Expression
(Node
)) then
2720 Sprint_Node
(Expression
(Node
));
2726 when N_Pop_Constraint_Error_Label
=>
2727 Write_Indent_Str
("%pop_constraint_error_label");
2729 when N_Pop_Program_Error_Label
=>
2730 Write_Indent_Str
("%pop_program_error_label");
2732 when N_Pop_Storage_Error_Label
=>
2733 Write_Indent_Str
("%pop_storage_error_label");
2735 when N_Private_Extension_Declaration
=>
2736 Write_Indent_Str_Sloc
("type ");
2737 Write_Id
(Defining_Identifier
(Node
));
2739 if Present
(Discriminant_Specifications
(Node
)) then
2740 Write_Discr_Specs
(Node
);
2741 elsif Unknown_Discriminants_Present
(Node
) then
2742 Write_Str_With_Col_Check
("(<>)");
2745 Write_Str_With_Col_Check
(" is new ");
2746 Sprint_Node
(Subtype_Indication
(Node
));
2748 if Present
(Interface_List
(Node
)) then
2749 Write_Str_With_Col_Check
(" and ");
2750 Sprint_And_List
(Interface_List
(Node
));
2753 Write_Str_With_Col_Check
(" with private;");
2755 when N_Private_Type_Declaration
=>
2756 Write_Indent_Str_Sloc
("type ");
2757 Write_Id
(Defining_Identifier
(Node
));
2759 if Present
(Discriminant_Specifications
(Node
)) then
2760 Write_Discr_Specs
(Node
);
2761 elsif Unknown_Discriminants_Present
(Node
) then
2762 Write_Str_With_Col_Check
("(<>)");
2767 if Tagged_Present
(Node
) then
2768 Write_Str_With_Col_Check
("tagged ");
2771 if Limited_Present
(Node
) then
2772 Write_Str_With_Col_Check
("limited ");
2775 Write_Str_With_Col_Check
("private;");
2777 when N_Push_Constraint_Error_Label
=>
2778 Write_Indent_Str
("%push_constraint_error_label (");
2780 if Present
(Exception_Label
(Node
)) then
2781 Write_Name_With_Col_Check
(Chars
(Exception_Label
(Node
)));
2786 when N_Push_Program_Error_Label
=>
2787 Write_Indent_Str
("%push_program_error_label (");
2789 if Present
(Exception_Label
(Node
)) then
2790 Write_Name_With_Col_Check
(Chars
(Exception_Label
(Node
)));
2795 when N_Push_Storage_Error_Label
=>
2796 Write_Indent_Str
("%push_storage_error_label (");
2798 if Present
(Exception_Label
(Node
)) then
2799 Write_Name_With_Col_Check
(Chars
(Exception_Label
(Node
)));
2805 Write_Indent_Str_Sloc
("pragma ");
2806 Write_Name_With_Col_Check
(Pragma_Name
(Node
));
2808 if Present
(Pragma_Argument_Associations
(Node
)) then
2809 Sprint_Opt_Paren_Comma_List
2810 (Pragma_Argument_Associations
(Node
));
2815 when N_Pragma_Argument_Association
=>
2818 if Chars
(Node
) /= No_Name
then
2819 Write_Name_With_Col_Check
(Chars
(Node
));
2823 Sprint_Node
(Expression
(Node
));
2825 when N_Procedure_Call_Statement
=>
2828 Write_Subprogram_Name
(Name
(Node
));
2829 Sprint_Opt_Paren_Comma_List
(Parameter_Associations
(Node
));
2832 when N_Procedure_Instantiation
=>
2833 Write_Indent_Str_Sloc
("procedure ");
2834 Sprint_Node
(Defining_Unit_Name
(Node
));
2835 Write_Str_With_Col_Check
(" is new ");
2836 Sprint_Node
(Name
(Node
));
2837 Sprint_Opt_Paren_Comma_List
(Generic_Associations
(Node
));
2840 when N_Procedure_Specification
=>
2841 Write_Str_With_Col_Check_Sloc
("procedure ");
2842 Sprint_Node
(Defining_Unit_Name
(Node
));
2843 Write_Param_Specs
(Node
);
2845 when N_Protected_Body
=>
2846 Write_Indent_Str_Sloc
("protected body ");
2847 Write_Id
(Defining_Identifier
(Node
));
2849 Sprint_Indented_List
(Declarations
(Node
));
2850 Write_Indent_Str
("end ");
2851 Write_Id
(Defining_Identifier
(Node
));
2854 when N_Protected_Body_Stub
=>
2855 Write_Indent_Str_Sloc
("protected body ");
2856 Write_Id
(Defining_Identifier
(Node
));
2857 Write_Str_With_Col_Check
(" is separate;");
2859 when N_Protected_Definition
=>
2861 Sprint_Indented_List
(Visible_Declarations
(Node
));
2863 if Present
(Private_Declarations
(Node
)) then
2864 Write_Indent_Str
("private");
2865 Sprint_Indented_List
(Private_Declarations
(Node
));
2868 Write_Indent_Str
("end ");
2870 when N_Protected_Type_Declaration
=>
2871 Write_Indent_Str_Sloc
("protected type ");
2872 Sprint_Node
(Defining_Identifier
(Node
));
2873 Write_Discr_Specs
(Node
);
2875 if Present
(Interface_List
(Node
)) then
2876 Write_Str
(" is new ");
2877 Sprint_And_List
(Interface_List
(Node
));
2878 Write_Str
(" with ");
2883 Sprint_Node
(Protected_Definition
(Node
));
2884 Write_Id
(Defining_Identifier
(Node
));
2887 when N_Qualified_Expression
=>
2888 Sprint_Node
(Subtype_Mark
(Node
));
2889 Write_Char_Sloc
(''');
2891 -- Print expression, make sure we have at least one level of
2892 -- parentheses around the expression. For cases of qualified
2893 -- expressions in the source, this is always the case, but
2894 -- for generated qualifications, there may be no explicit
2895 -- parentheses present.
2897 if Paren_Count
(Expression
(Node
)) /= 0 then
2898 Sprint_Node
(Expression
(Node
));
2902 Sprint_Node
(Expression
(Node
));
2904 -- Odd case, for the qualified expressions used in machine
2905 -- code the argument may be a procedure call, resulting in
2906 -- a junk semicolon before the right parent, get rid of it.
2908 Write_Erase_Char
(';');
2910 -- Now we can add the terminating right paren
2915 when N_Quantified_Expression
=>
2918 if All_Present
(Node
) then
2919 Write_Str
(" all ");
2921 Write_Str
(" some ");
2924 if Present
(Iterator_Specification
(Node
)) then
2925 Sprint_Node
(Iterator_Specification
(Node
));
2927 Sprint_Node
(Loop_Parameter_Specification
(Node
));
2931 Sprint_Node
(Condition
(Node
));
2933 when N_Raise_Expression
=>
2935 Has_Parens
: constant Boolean := Paren_Count
(Node
) > 0;
2938 -- The syntax for raise_expression does not include parentheses
2939 -- but sometimes parentheses are required, so unconditionally
2940 -- generate them here unless already present.
2942 if not Has_Parens
then
2946 Write_Str_With_Col_Check_Sloc
("raise ");
2947 Sprint_Node
(Name
(Node
));
2949 if Present
(Expression
(Node
)) then
2950 Write_Str_With_Col_Check
(" with ");
2951 Sprint_Node
(Expression
(Node
));
2954 if not Has_Parens
then
2959 when N_Raise_Constraint_Error
=>
2961 -- This node can be used either as a subexpression or as a
2962 -- statement form. The following test is a reasonably reliable
2963 -- way to distinguish the two cases.
2965 if Is_List_Member
(Node
)
2966 and then Nkind
(Parent
(Node
)) not in N_Subexpr
2971 Write_Str_With_Col_Check_Sloc
("[constraint_error");
2972 Write_Condition_And_Reason
(Node
);
2974 when N_Raise_Program_Error
=>
2976 -- This node can be used either as a subexpression or as a
2977 -- statement form. The following test is a reasonably reliable
2978 -- way to distinguish the two cases.
2980 if Is_List_Member
(Node
)
2981 and then Nkind
(Parent
(Node
)) not in N_Subexpr
2986 Write_Str_With_Col_Check_Sloc
("[program_error");
2987 Write_Condition_And_Reason
(Node
);
2989 when N_Raise_Storage_Error
=>
2991 -- This node can be used either as a subexpression or as a
2992 -- statement form. The following test is a reasonably reliable
2993 -- way to distinguish the two cases.
2995 if Is_List_Member
(Node
)
2996 and then Nkind
(Parent
(Node
)) not in N_Subexpr
3001 Write_Str_With_Col_Check_Sloc
("[storage_error");
3002 Write_Condition_And_Reason
(Node
);
3004 when N_Raise_Statement
=>
3005 Write_Indent_Str_Sloc
("raise ");
3006 Sprint_Node
(Name
(Node
));
3008 if Present
(Expression
(Node
)) then
3009 Write_Str_With_Col_Check_Sloc
(" with ");
3010 Sprint_Node
(Expression
(Node
));
3016 Sprint_Node
(Low_Bound
(Node
));
3017 Write_Str_Sloc
(" .. ");
3018 Sprint_Node
(High_Bound
(Node
));
3019 Update_Itype
(Node
);
3021 when N_Range_Constraint
=>
3022 Write_Str_With_Col_Check_Sloc
("range ");
3023 Sprint_Node
(Range_Expression
(Node
));
3025 when N_Real_Literal
=>
3026 Write_Ureal_With_Col_Check_Sloc
(Realval
(Node
));
3028 when N_Real_Range_Specification
=>
3029 Write_Str_With_Col_Check_Sloc
("range ");
3030 Sprint_Node
(Low_Bound
(Node
));
3032 Sprint_Node
(High_Bound
(Node
));
3034 when N_Record_Definition
=>
3035 if Abstract_Present
(Node
) then
3036 Write_Str_With_Col_Check
("abstract ");
3039 if Tagged_Present
(Node
) then
3040 Write_Str_With_Col_Check
("tagged ");
3043 if Limited_Present
(Node
) then
3044 Write_Str_With_Col_Check
("limited ");
3047 if Null_Present
(Node
) then
3048 Write_Str_With_Col_Check_Sloc
("null record");
3051 Write_Str_With_Col_Check_Sloc
("record");
3052 Sprint_Node
(Component_List
(Node
));
3053 Write_Indent_Str
("end record");
3056 when N_Record_Representation_Clause
=>
3057 Write_Indent_Str_Sloc
("for ");
3058 Sprint_Node
(Identifier
(Node
));
3059 Write_Str_With_Col_Check
(" use record ");
3061 if Present
(Mod_Clause
(Node
)) then
3062 Sprint_Node
(Mod_Clause
(Node
));
3065 Sprint_Indented_List
(Component_Clauses
(Node
));
3066 Write_Indent_Str
("end record;");
3069 Sprint_Node
(Prefix
(Node
));
3070 Write_Str_With_Col_Check_Sloc
("'reference");
3072 when N_Requeue_Statement
=>
3073 Write_Indent_Str_Sloc
("requeue ");
3074 Sprint_Node
(Name
(Node
));
3076 if Abort_Present
(Node
) then
3077 Write_Str_With_Col_Check
(" with abort");
3082 -- Don't we want to print more detail???
3084 -- Doc of this extended syntax belongs in sinfo.ads and/or
3087 when N_SCIL_Dispatch_Table_Tag_Init
=>
3088 Write_Indent_Str
("[N_SCIL_Dispatch_Table_Tag_Init]");
3090 when N_SCIL_Dispatching_Call
=>
3091 Write_Indent_Str
("[N_SCIL_Dispatching_Node]");
3093 when N_SCIL_Membership_Test
=>
3094 Write_Indent_Str
("[N_SCIL_Membership_Test]");
3096 when N_Simple_Return_Statement
=>
3097 if Present
(Expression
(Node
)) then
3098 Write_Indent_Str_Sloc
("return ");
3099 Sprint_Node
(Expression
(Node
));
3102 Write_Indent_Str_Sloc
("return;");
3105 when N_Selective_Accept
=>
3106 Write_Indent_Str_Sloc
("select");
3111 Alt_Node
:= First
(Select_Alternatives
(Node
));
3114 Sprint_Node
(Alt_Node
);
3117 exit when No
(Alt_Node
);
3118 Write_Indent_Str
("or");
3122 if Present
(Else_Statements
(Node
)) then
3123 Write_Indent_Str
("else");
3124 Sprint_Indented_List
(Else_Statements
(Node
));
3127 Write_Indent_Str
("end select;");
3129 when N_Signed_Integer_Type_Definition
=>
3130 Write_Str_With_Col_Check_Sloc
("range ");
3131 Sprint_Node
(Low_Bound
(Node
));
3133 Sprint_Node
(High_Bound
(Node
));
3135 when N_Single_Protected_Declaration
=>
3136 Write_Indent_Str_Sloc
("protected ");
3137 Write_Id
(Defining_Identifier
(Node
));
3139 Sprint_Node
(Protected_Definition
(Node
));
3140 Write_Id
(Defining_Identifier
(Node
));
3143 when N_Single_Task_Declaration
=>
3144 Write_Indent_Str_Sloc
("task ");
3145 Sprint_Node
(Defining_Identifier
(Node
));
3147 if Present
(Task_Definition
(Node
)) then
3149 Sprint_Node
(Task_Definition
(Node
));
3154 when N_Selected_Component
=>
3155 Sprint_Node
(Prefix
(Node
));
3156 Write_Char_Sloc
('.');
3157 Sprint_Node
(Selector_Name
(Node
));
3161 Sprint_Node
(Prefix
(Node
));
3162 Write_Str_With_Col_Check
(" (");
3163 Sprint_Node
(Discrete_Range
(Node
));
3166 when N_String_Literal
=>
3167 if String_Length
(Strval
(Node
)) + Column
> Sprint_Line_Limit
then
3168 Write_Indent_Str
(" ");
3172 Write_String_Table_Entry
(Strval
(Node
));
3174 when N_Subprogram_Body
=>
3176 -- Output extra blank line unless we are in freeze actions
3178 if Freeze_Indent
= 0 then
3184 if Present
(Corresponding_Spec
(Node
)) then
3185 Sprint_Node_Sloc
(Parent
(Corresponding_Spec
(Node
)));
3187 Sprint_Node_Sloc
(Specification
(Node
));
3192 Sprint_Indented_List
(Declarations
(Node
));
3193 Write_Indent_Str
("begin");
3194 Sprint_Node
(Handled_Statement_Sequence
(Node
));
3196 Write_Indent_Str
("end ");
3199 (Handled_Statement_Sequence
(Node
),
3200 Defining_Unit_Name
(Specification
(Node
)));
3203 if Is_List_Member
(Node
)
3204 and then Present
(Next
(Node
))
3205 and then Nkind
(Next
(Node
)) /= N_Subprogram_Body
3210 when N_Subprogram_Body_Stub
=>
3212 Sprint_Node_Sloc
(Specification
(Node
));
3213 Write_Str_With_Col_Check
(" is separate;");
3215 when N_Subprogram_Declaration
=>
3217 Sprint_Node_Sloc
(Specification
(Node
));
3219 if Nkind
(Specification
(Node
)) = N_Procedure_Specification
3220 and then Null_Present
(Specification
(Node
))
3222 Write_Str_With_Col_Check
(" is null");
3227 when N_Subprogram_Renaming_Declaration
=>
3229 Sprint_Node
(Specification
(Node
));
3230 Write_Str_With_Col_Check_Sloc
(" renames ");
3231 Sprint_Node
(Name
(Node
));
3234 when N_Subtype_Declaration
=>
3235 Write_Indent_Str_Sloc
("subtype ");
3236 Sprint_Node
(Defining_Identifier
(Node
));
3239 -- Ada 2005 (AI-231)
3241 if Null_Exclusion_Present
(Node
) then
3242 Write_Str
("not null ");
3245 Sprint_Node
(Subtype_Indication
(Node
));
3248 when N_Subtype_Indication
=>
3249 Sprint_Node_Sloc
(Subtype_Mark
(Node
));
3251 Sprint_Node
(Constraint
(Node
));
3254 Write_Indent_Str_Sloc
("separate (");
3255 Sprint_Node
(Name
(Node
));
3258 Sprint_Node
(Proper_Body
(Node
));
3261 Write_Indent_Str_Sloc
("task body ");
3262 Write_Id
(Defining_Identifier
(Node
));
3264 Sprint_Indented_List
(Declarations
(Node
));
3265 Write_Indent_Str
("begin");
3266 Sprint_Node
(Handled_Statement_Sequence
(Node
));
3267 Write_Indent_Str
("end ");
3269 (Handled_Statement_Sequence
(Node
), Defining_Identifier
(Node
));
3272 when N_Task_Body_Stub
=>
3273 Write_Indent_Str_Sloc
("task body ");
3274 Write_Id
(Defining_Identifier
(Node
));
3275 Write_Str_With_Col_Check
(" is separate;");
3277 when N_Task_Definition
=>
3279 Sprint_Indented_List
(Visible_Declarations
(Node
));
3281 if Present
(Private_Declarations
(Node
)) then
3282 Write_Indent_Str
("private");
3283 Sprint_Indented_List
(Private_Declarations
(Node
));
3286 Write_Indent_Str
("end ");
3287 Sprint_End_Label
(Node
, Defining_Identifier
(Parent
(Node
)));
3289 when N_Task_Type_Declaration
=>
3290 Write_Indent_Str_Sloc
("task type ");
3291 Sprint_Node
(Defining_Identifier
(Node
));
3292 Write_Discr_Specs
(Node
);
3294 if Present
(Interface_List
(Node
)) then
3295 Write_Str
(" is new ");
3296 Sprint_And_List
(Interface_List
(Node
));
3299 if Present
(Task_Definition
(Node
)) then
3300 if No
(Interface_List
(Node
)) then
3303 Write_Str
(" with ");
3306 Sprint_Node
(Task_Definition
(Node
));
3311 when N_Terminate_Alternative
=>
3312 Sprint_Node_List
(Pragmas_Before
(Node
));
3315 if Present
(Condition
(Node
)) then
3316 Write_Str_With_Col_Check
("when ");
3317 Sprint_Node
(Condition
(Node
));
3321 Write_Str_With_Col_Check_Sloc
("terminate;");
3322 Sprint_Node_List
(Pragmas_After
(Node
));
3324 when N_Timed_Entry_Call
=>
3325 Write_Indent_Str_Sloc
("select");
3327 Sprint_Node
(Entry_Call_Alternative
(Node
));
3329 Write_Indent_Str
("or");
3331 Sprint_Node
(Delay_Alternative
(Node
));
3333 Write_Indent_Str
("end select;");
3335 when N_Triggering_Alternative
=>
3336 Sprint_Node_List
(Pragmas_Before
(Node
));
3337 Sprint_Node_Sloc
(Triggering_Statement
(Node
));
3338 Sprint_Node_List
(Statements
(Node
));
3340 when N_Type_Conversion
=>
3342 Sprint_Node
(Subtype_Mark
(Node
));
3345 if Conversion_OK
(Node
) then
3349 if Float_Truncate
(Node
) then
3353 if Rounded_Result
(Node
) then
3358 Sprint_Node
(Expression
(Node
));
3361 when N_Unchecked_Expression
=>
3364 Sprint_Node_Sloc
(Expression
(Node
));
3367 when N_Unchecked_Type_Conversion
=>
3368 Sprint_Node
(Subtype_Mark
(Node
));
3370 Write_Str_With_Col_Check
("(");
3371 Sprint_Node_Sloc
(Expression
(Node
));
3374 when N_Unconstrained_Array_Definition
=>
3375 Write_Str_With_Col_Check_Sloc
("array (");
3380 Node1
:= First
(Subtype_Marks
(Node
));
3382 Sprint_Node
(Node1
);
3383 Write_Str_With_Col_Check
(" range <>");
3385 exit when Node1
= Empty
;
3390 Write_Str
(") of ");
3391 Sprint_Node
(Component_Definition
(Node
));
3393 when N_Unused_At_Start | N_Unused_At_End
=>
3394 Write_Indent_Str
("***** Error, unused node encountered *****");
3397 when N_Use_Package_Clause
=>
3398 Write_Indent_Str_Sloc
("use ");
3399 Sprint_Comma_List
(Names
(Node
));
3402 when N_Use_Type_Clause
=>
3403 Write_Indent_Str_Sloc
("use type ");
3404 Sprint_Comma_List
(Subtype_Marks
(Node
));
3407 when N_Validate_Unchecked_Conversion
=>
3408 Write_Indent_Str_Sloc
("validate unchecked_conversion (");
3409 Sprint_Node
(Source_Type
(Node
));
3411 Sprint_Node
(Target_Type
(Node
));
3415 Write_Indent_Str_Sloc
("when ");
3416 Sprint_Bar_List
(Discrete_Choices
(Node
));
3418 Sprint_Node
(Component_List
(Node
));
3420 when N_Variant_Part
=>
3422 Write_Indent_Str_Sloc
("case ");
3423 Sprint_Node
(Name
(Node
));
3425 Sprint_Indented_List
(Variants
(Node
));
3426 Write_Indent_Str
("end case");
3429 when N_With_Clause
=>
3431 -- Special test, if we are dumping the original tree only,
3432 -- then we want to eliminate the bogus with clauses that
3433 -- correspond to the non-existent children of Text_IO.
3435 if Dump_Original_Only
3436 and then Is_Text_IO_Special_Unit
(Name
(Node
))
3440 -- Normal case, output the with clause
3443 if First_Name
(Node
) or else not Dump_Original_Only
then
3445 -- Ada 2005 (AI-50217): Print limited with_clauses
3447 if Private_Present
(Node
) and Limited_Present
(Node
) then
3448 Write_Indent_Str
("limited private with ");
3450 elsif Private_Present
(Node
) then
3451 Write_Indent_Str
("private with ");
3453 elsif Limited_Present
(Node
) then
3454 Write_Indent_Str
("limited with ");
3457 Write_Indent_Str
("with ");
3464 Sprint_Node_Sloc
(Name
(Node
));
3466 if Last_Name
(Node
) or else not Dump_Original_Only
then
3472 -- Print aspects, except for special case of package declaration,
3473 -- where the aspects are printed inside the package specification.
3475 if Has_Aspects
(Node
)
3476 and then not Nkind_In
(Node
, N_Package_Declaration
,
3477 N_Generic_Package_Declaration
)
3479 Sprint_Aspect_Specifications
(Node
, Semicolon
=> True);
3482 if Nkind
(Node
) in N_Subexpr
3483 and then Do_Range_Check
(Node
)
3488 for J
in 1 .. Paren_Count
(Node
) loop
3492 Dump_Node
:= Save_Dump_Node
;
3493 end Sprint_Node_Actual
;
3495 ----------------------
3496 -- Sprint_Node_List --
3497 ----------------------
3499 procedure Sprint_Node_List
(List
: List_Id
; New_Lines
: Boolean := False) is
3503 if Is_Non_Empty_List
(List
) then
3504 Node
:= First
(List
);
3509 exit when Node
= Empty
;
3513 if New_Lines
and then Column
/= 1 then
3516 end Sprint_Node_List
;
3518 ----------------------
3519 -- Sprint_Node_Sloc --
3520 ----------------------
3522 procedure Sprint_Node_Sloc
(Node
: Node_Id
) is
3526 if Debug_Generated_Code
and then Present
(Dump_Node
) then
3527 Set_Sloc
(Dump_Node
, Sloc
(Node
));
3530 end Sprint_Node_Sloc
;
3532 ---------------------
3533 -- Sprint_Opt_Node --
3534 ---------------------
3536 procedure Sprint_Opt_Node
(Node
: Node_Id
) is
3538 if Present
(Node
) then
3542 end Sprint_Opt_Node
;
3544 --------------------------
3545 -- Sprint_Opt_Node_List --
3546 --------------------------
3548 procedure Sprint_Opt_Node_List
(List
: List_Id
) is
3550 if Present
(List
) then
3551 Sprint_Node_List
(List
);
3553 end Sprint_Opt_Node_List
;
3555 ---------------------------------
3556 -- Sprint_Opt_Paren_Comma_List --
3557 ---------------------------------
3559 procedure Sprint_Opt_Paren_Comma_List
(List
: List_Id
) is
3561 if Is_Non_Empty_List
(List
) then
3563 Sprint_Paren_Comma_List
(List
);
3565 end Sprint_Opt_Paren_Comma_List
;
3567 -----------------------------
3568 -- Sprint_Paren_Comma_List --
3569 -----------------------------
3571 procedure Sprint_Paren_Comma_List
(List
: List_Id
) is
3573 Node_Exists
: Boolean := False;
3577 if Is_Non_Empty_List
(List
) then
3579 if Dump_Original_Only
then
3581 while Present
(N
) loop
3582 if not Is_Rewrite_Insertion
(N
) then
3583 Node_Exists
:= True;
3590 if not Node_Exists
then
3595 Write_Str_With_Col_Check
("(");
3596 Sprint_Comma_List
(List
);
3599 end Sprint_Paren_Comma_List
;
3601 ----------------------
3602 -- Sprint_Right_Opnd --
3603 ----------------------
3605 procedure Sprint_Right_Opnd
(N
: Node_Id
) is
3606 Opnd
: constant Node_Id
:= Right_Opnd
(N
);
3609 if Paren_Count
(Opnd
) /= 0
3610 or else Op_Prec
(Nkind
(Opnd
)) > Op_Prec
(Nkind
(N
))
3619 end Sprint_Right_Opnd
;
3625 procedure Update_Itype
(Node
: Node_Id
) is
3627 if Present
(Etype
(Node
))
3628 and then Is_Itype
(Etype
(Node
))
3629 and then Debug_Generated_Code
3631 Set_Sloc
(Etype
(Node
), Sloc
(Node
));
3635 ---------------------
3636 -- Write_Char_Sloc --
3637 ---------------------
3639 procedure Write_Char_Sloc
(C
: Character) is
3641 if Debug_Generated_Code
and then C
/= ' ' then
3646 end Write_Char_Sloc
;
3648 --------------------------------
3649 -- Write_Condition_And_Reason --
3650 --------------------------------
3652 procedure Write_Condition_And_Reason
(Node
: Node_Id
) is
3653 Cond
: constant Node_Id
:= Condition
(Node
);
3654 Image
: constant String := RT_Exception_Code
'Image
3655 (RT_Exception_Code
'Val
3656 (UI_To_Int
(Reason
(Node
))));
3659 if Present
(Cond
) then
3661 -- If condition is a single entity, or NOT with a single entity,
3662 -- output all on one line, since it will likely fit just fine.
3664 if Is_Entity_Name
(Cond
)
3665 or else (Nkind
(Cond
) = N_Op_Not
3666 and then Is_Entity_Name
(Right_Opnd
(Cond
)))
3668 Write_Str_With_Col_Check
(" when ");
3672 -- Otherwise for more complex condition, multiple lines
3675 Write_Str_With_Col_Check
(" when");
3676 Indent
:= Indent
+ 2;
3680 Indent
:= Indent
- 2;
3683 -- If no condition, just need a space (all on one line)
3693 for J
in 4 .. Image
'Last loop
3694 if Image
(J
) = '_' then
3697 Write_Char
(Fold_Lower
(Image
(J
)));
3702 end Write_Condition_And_Reason
;
3704 --------------------------------
3705 -- Write_Corresponding_Source --
3706 --------------------------------
3708 procedure Write_Corresponding_Source
(S
: String) is
3710 Src
: Source_Buffer_Ptr
;
3713 -- Ignore if not in dump source text mode, or if in freeze actions
3715 if Dump_Source_Text
and then Freeze_Indent
= 0 then
3717 -- Ignore null string
3723 -- Ignore space or semicolon at end of given string
3725 if S
(S
'Last) = ' ' or else S
(S
'Last) = ';' then
3726 Write_Corresponding_Source
(S
(S
'First .. S
'Last - 1));
3730 -- Loop to look at next lines not yet printed in source file
3733 Last_Line_Printed
+ 1 .. Last_Source_Line
(Current_Source_File
)
3735 Src
:= Source_Text
(Current_Source_File
);
3736 Loc
:= Line_Start
(L
, Current_Source_File
);
3738 -- If comment, keep looking
3740 if Src
(Loc
.. Loc
+ 1) = "--" then
3743 -- Search to first non-blank
3746 while Src
(Loc
) not in Line_Terminator
loop
3750 if Src
(Loc
) /= ' ' and then Src
(Loc
) /= ASCII
.HT
then
3752 -- Loop through characters in string to see if we match
3754 for J
in S
'Range loop
3756 -- If mismatch, then not the case we are looking for
3758 if Src
(Loc
) /= S
(J
) then
3765 -- If we fall through, string matched, if white space or
3766 -- semicolon after the matched string, this is the case
3767 -- we are looking for.
3769 if Src
(Loc
) in Line_Terminator
3770 or else Src
(Loc
) = ' '
3771 or else Src
(Loc
) = ASCII
.HT
3772 or else Src
(Loc
) = ';'
3774 -- So output source lines up to and including this one
3776 Write_Source_Lines
(L
);
3785 -- Line was all blanks, or a comment line, keep looking
3789 end Write_Corresponding_Source
;
3791 -----------------------
3792 -- Write_Discr_Specs --
3793 -----------------------
3795 procedure Write_Discr_Specs
(N
: Node_Id
) is
3800 Specs
:= Discriminant_Specifications
(N
);
3802 if Present
(Specs
) then
3803 Write_Str_With_Col_Check
(" (");
3804 Spec
:= First
(Specs
);
3809 exit when Spec
= Empty
;
3811 -- Add semicolon, unless we are printing original tree and the
3812 -- next specification is part of a list (but not the first
3813 -- element of that list)
3815 if not Dump_Original_Only
or else not Prev_Ids
(Spec
) then
3822 end Write_Discr_Specs
;
3828 procedure Write_Ekind
(E
: Entity_Id
) is
3829 S
: constant String := Entity_Kind
'Image (Ekind
(E
));
3832 Name_Len
:= S
'Length;
3833 Name_Buffer
(1 .. Name_Len
) := S
;
3834 Set_Casing
(Mixed_Case
);
3835 Write_Str_With_Col_Check
(Name_Buffer
(1 .. Name_Len
));
3842 procedure Write_Id
(N
: Node_Id
) is
3844 -- Deal with outputting Itype
3846 -- Note: if we are printing the full tree with -gnatds, then we may
3847 -- end up picking up the Associated_Node link from a generic template
3848 -- here which overlaps the Entity field, but as documented, Write_Itype
3849 -- is defended against junk calls.
3851 if Nkind
(N
) in N_Entity
then
3853 elsif Nkind
(N
) in N_Has_Entity
then
3854 Write_Itype
(Entity
(N
));
3857 -- Case of a defining identifier
3859 if Nkind
(N
) = N_Defining_Identifier
then
3861 -- If defining identifier has an interface name (and no
3862 -- address clause), then we output the interface name.
3864 if (Is_Imported
(N
) or else Is_Exported
(N
))
3865 and then Present
(Interface_Name
(N
))
3866 and then No
(Address_Clause
(N
))
3868 String_To_Name_Buffer
(Strval
(Interface_Name
(N
)));
3869 Write_Str_With_Col_Check
(Name_Buffer
(1 .. Name_Len
));
3871 -- If no interface name (or inactive because there was
3872 -- an address clause), then just output the Chars name.
3875 Write_Name_With_Col_Check
(Chars
(N
));
3878 -- Case of selector of an expanded name where the expanded name
3879 -- has an associated entity, output this entity. Check that the
3880 -- entity or associated node is of the right kind, see above.
3882 elsif Nkind
(Parent
(N
)) = N_Expanded_Name
3883 and then Selector_Name
(Parent
(N
)) = N
3884 and then Present
(Entity_Or_Associated_Node
(Parent
(N
)))
3885 and then Nkind
(Entity
(Parent
(N
))) in N_Entity
3887 Write_Id
(Entity
(Parent
(N
)));
3889 -- For any other node with an associated entity, output it
3891 elsif Nkind
(N
) in N_Has_Entity
3892 and then Present
(Entity_Or_Associated_Node
(N
))
3893 and then Nkind
(Entity_Or_Associated_Node
(N
)) in N_Entity
3895 Write_Id
(Entity
(N
));
3897 -- All other cases, we just print the Chars field
3900 Write_Name_With_Col_Check
(Chars
(N
));
3904 -----------------------
3905 -- Write_Identifiers --
3906 -----------------------
3908 function Write_Identifiers
(Node
: Node_Id
) return Boolean is
3910 Sprint_Node
(Defining_Identifier
(Node
));
3911 Update_Itype
(Defining_Identifier
(Node
));
3913 -- The remainder of the declaration must be printed unless we are
3914 -- printing the original tree and this is not the last identifier
3917 not Dump_Original_Only
or else not More_Ids
(Node
);
3919 end Write_Identifiers
;
3921 ------------------------
3922 -- Write_Implicit_Def --
3923 ------------------------
3925 procedure Write_Implicit_Def
(E
: Entity_Id
) is
3930 when E_Array_Subtype
=>
3931 Write_Str_With_Col_Check
("subtype ");
3933 Write_Str_With_Col_Check
(" is ");
3934 Write_Id
(Base_Type
(E
));
3935 Write_Str_With_Col_Check
(" (");
3937 Ind
:= First_Index
(E
);
3938 while Present
(Ind
) loop
3942 if Present
(Ind
) then
3949 when E_Signed_Integer_Subtype | E_Enumeration_Subtype
=>
3950 Write_Str_With_Col_Check
("subtype ");
3953 Write_Id
(Etype
(E
));
3954 Write_Str_With_Col_Check
(" range ");
3955 Sprint_Node
(Scalar_Range
(E
));
3959 Write_Str_With_Col_Check
("type ");
3961 Write_Str_With_Col_Check
(" is <");
3966 end Write_Implicit_Def
;
3972 procedure Write_Indent
is
3973 Loc
: constant Source_Ptr
:= Sloc
(Dump_Node
);
3976 if Indent_Annull_Flag
then
3977 Indent_Annull_Flag
:= False;
3979 -- Deal with Dump_Source_Text output. Note that we ignore implicit
3980 -- label declarations, since they typically have the sloc of the
3981 -- corresponding label, which really messes up the -gnatL output.
3984 and then Loc
> No_Location
3985 and then Nkind
(Dump_Node
) /= N_Implicit_Label_Declaration
3987 if Get_Source_File_Index
(Loc
) = Current_Source_File
then
3989 (Get_Physical_Line_Number
(Sloc
(Dump_Node
)));
3995 for J
in 1 .. Indent
loop
4001 ------------------------------
4002 -- Write_Indent_Identifiers --
4003 ------------------------------
4005 function Write_Indent_Identifiers
(Node
: Node_Id
) return Boolean is
4007 -- We need to start a new line for every node, except in the case
4008 -- where we are printing the original tree and this is not the first
4009 -- defining identifier in the list.
4011 if not Dump_Original_Only
or else not Prev_Ids
(Node
) then
4014 -- If printing original tree and this is not the first defining
4015 -- identifier in the list, then the previous call to this procedure
4016 -- printed only the name, and we add a comma to separate the names.
4022 Sprint_Node
(Defining_Identifier
(Node
));
4024 -- The remainder of the declaration must be printed unless we are
4025 -- printing the original tree and this is not the last identifier
4028 not Dump_Original_Only
or else not More_Ids
(Node
);
4029 end Write_Indent_Identifiers
;
4031 -----------------------------------
4032 -- Write_Indent_Identifiers_Sloc --
4033 -----------------------------------
4035 function Write_Indent_Identifiers_Sloc
(Node
: Node_Id
) return Boolean is
4037 -- We need to start a new line for every node, except in the case
4038 -- where we are printing the original tree and this is not the first
4039 -- defining identifier in the list.
4041 if not Dump_Original_Only
or else not Prev_Ids
(Node
) then
4044 -- If printing original tree and this is not the first defining
4045 -- identifier in the list, then the previous call to this procedure
4046 -- printed only the name, and we add a comma to separate the names.
4053 Sprint_Node
(Defining_Identifier
(Node
));
4055 -- The remainder of the declaration must be printed unless we are
4056 -- printing the original tree and this is not the last identifier
4058 return not Dump_Original_Only
or else not More_Ids
(Node
);
4059 end Write_Indent_Identifiers_Sloc
;
4061 ----------------------
4062 -- Write_Indent_Str --
4063 ----------------------
4065 procedure Write_Indent_Str
(S
: String) is
4067 Write_Corresponding_Source
(S
);
4070 end Write_Indent_Str
;
4072 ---------------------------
4073 -- Write_Indent_Str_Sloc --
4074 ---------------------------
4076 procedure Write_Indent_Str_Sloc
(S
: String) is
4078 Write_Corresponding_Source
(S
);
4081 end Write_Indent_Str_Sloc
;
4087 procedure Write_Itype
(Typ
: Entity_Id
) is
4089 procedure Write_Header
(T
: Boolean := True);
4090 -- Write type if T is True, subtype if T is false
4096 procedure Write_Header
(T
: Boolean := True) is
4099 Write_Str
("[type ");
4101 Write_Str
("[subtype ");
4104 Write_Name_With_Col_Check
(Chars
(Typ
));
4108 -- Start of processing for Write_Itype
4111 if Nkind
(Typ
) in N_Entity
4112 and then Is_Itype
(Typ
)
4113 and then not Itype_Printed
(Typ
)
4115 -- Itype to be printed
4118 B
: constant Node_Id
:= Etype
(Typ
);
4120 P
: constant Node_Id
:= Parent
(Typ
);
4122 S
: constant Saved_Output_Buffer
:= Save_Output_Buffer
;
4123 -- Save current output buffer
4125 Old_Sloc
: Source_Ptr
;
4126 -- Save sloc of related node, so it is not modified when
4127 -- printing with -gnatD.
4130 -- Write indentation at start of line
4132 for J
in 1 .. Indent
loop
4136 -- If we have a constructed declaration for the itype, print it
4139 and then Nkind
(P
) in N_Declaration
4140 and then Defining_Entity
(P
) = Typ
4142 -- We must set Itype_Printed true before the recursive call to
4143 -- print the node, otherwise we get an infinite recursion.
4145 Set_Itype_Printed
(Typ
, True);
4147 -- Write the declaration enclosed in [], avoiding new line
4148 -- at start of declaration, and semicolon at end.
4150 -- Note: The itype may be imported from another unit, in which
4151 -- case we do not want to modify the Sloc of the declaration.
4152 -- Otherwise the itype may appear to be in the current unit,
4153 -- and the back-end will reject a reference out of scope.
4156 Indent_Annull_Flag
:= True;
4157 Old_Sloc
:= Sloc
(P
);
4159 Set_Sloc
(P
, Old_Sloc
);
4160 Write_Erase_Char
(';');
4162 -- If no constructed declaration, then we have to concoct the
4163 -- source corresponding to the type entity that we have at hand.
4168 -- Access types and subtypes
4171 Write_Header
(Ekind
(Typ
) = E_Access_Type
);
4173 if Can_Never_Be_Null
(Typ
) then
4174 Write_Str
("not null ");
4177 Write_Str
("access ");
4179 if Is_Access_Constant
(Typ
) then
4180 Write_Str
("constant ");
4183 Write_Id
(Directly_Designated_Type
(Typ
));
4185 -- Array types and string types
4187 when E_Array_Type
=>
4189 Write_Str
("array (");
4191 X
:= First_Index
(Typ
);
4195 if not Is_Constrained
(Typ
) then
4196 Write_Str
(" range <>");
4204 Write_Str
(") of ");
4205 X
:= Component_Type
(Typ
);
4207 -- Preserve sloc of component type, which is defined
4208 -- elsewhere than the itype (see comment above).
4210 Old_Sloc
:= Sloc
(X
);
4212 Set_Sloc
(X
, Old_Sloc
);
4214 -- Array subtypes and string subtypes.
4215 -- Preserve Sloc of index subtypes, as above.
4217 when E_Array_Subtype | E_String_Subtype
=>
4218 Write_Header
(False);
4219 Write_Id
(Etype
(Typ
));
4222 X
:= First_Index
(Typ
);
4224 Old_Sloc
:= Sloc
(X
);
4226 Set_Sloc
(X
, Old_Sloc
);
4234 -- Signed integer types, and modular integer subtypes,
4235 -- and also enumeration subtypes.
4237 when E_Signed_Integer_Type |
4238 E_Signed_Integer_Subtype |
4239 E_Modular_Integer_Subtype |
4240 E_Enumeration_Subtype
=>
4242 Write_Header
(Ekind
(Typ
) = E_Signed_Integer_Type
);
4244 if Ekind
(Typ
) = E_Signed_Integer_Type
then
4250 -- Print bounds if different from base type
4253 L
: constant Node_Id
:= Type_Low_Bound
(Typ
);
4254 H
: constant Node_Id
:= Type_High_Bound
(Typ
);
4259 -- B can either be a scalar type, in which case the
4260 -- declaration of Typ may constrain it with different
4261 -- bounds, or a private type, in which case we know
4262 -- that the declaration of Typ cannot have a scalar
4265 if Is_Scalar_Type
(B
) then
4266 LE
:= Type_Low_Bound
(B
);
4267 HE
:= Type_High_Bound
(B
);
4275 and then Nkind
(L
) = N_Integer_Literal
4276 and then Nkind
(H
) = N_Integer_Literal
4277 and then Nkind
(LE
) = N_Integer_Literal
4278 and then Nkind
(HE
) = N_Integer_Literal
4279 and then UI_Eq
(Intval
(L
), Intval
(LE
))
4280 and then UI_Eq
(Intval
(H
), Intval
(HE
)))
4285 Write_Str
(" range ");
4286 Sprint_Node
(Type_Low_Bound
(Typ
));
4288 Sprint_Node
(Type_High_Bound
(Typ
));
4292 -- Modular integer types
4294 when E_Modular_Integer_Type
=>
4297 Write_Uint_With_Col_Check
(Modulus
(Typ
), Auto
);
4299 -- Floating point types and subtypes
4301 when E_Floating_Point_Type |
4302 E_Floating_Point_Subtype
=>
4304 Write_Header
(Ekind
(Typ
) = E_Floating_Point_Type
);
4306 if Ekind
(Typ
) = E_Floating_Point_Type
then
4310 Write_Id
(Etype
(Typ
));
4312 if Digits_Value
(Typ
) /= Digits_Value
(Etype
(Typ
)) then
4313 Write_Str
(" digits ");
4314 Write_Uint_With_Col_Check
4315 (Digits_Value
(Typ
), Decimal
);
4318 -- Print bounds if not different from base type
4321 L
: constant Node_Id
:= Type_Low_Bound
(Typ
);
4322 H
: constant Node_Id
:= Type_High_Bound
(Typ
);
4323 LE
: constant Node_Id
:= Type_Low_Bound
(B
);
4324 HE
: constant Node_Id
:= Type_High_Bound
(B
);
4327 if Nkind
(L
) = N_Real_Literal
4328 and then Nkind
(H
) = N_Real_Literal
4329 and then Nkind
(LE
) = N_Real_Literal
4330 and then Nkind
(HE
) = N_Real_Literal
4331 and then UR_Eq
(Realval
(L
), Realval
(LE
))
4332 and then UR_Eq
(Realval
(H
), Realval
(HE
))
4337 Write_Str
(" range ");
4338 Sprint_Node
(Type_Low_Bound
(Typ
));
4340 Sprint_Node
(Type_High_Bound
(Typ
));
4346 when E_Record_Subtype | E_Record_Subtype_With_Private
=>
4347 Write_Header
(False);
4348 Write_Str
("record");
4354 C
:= First_Entity
(Typ
);
4355 while Present
(C
) loop
4359 Write_Id
(Etype
(C
));
4365 Write_Indent_Str
(" end record");
4369 when E_Class_Wide_Type |
4370 E_Class_Wide_Subtype
=>
4371 Write_Header
(Ekind
(Typ
) = E_Class_Wide_Type
);
4372 Write_Name_With_Col_Check
(Chars
(Etype
(Typ
)));
4373 Write_Str
("'Class");
4377 when E_Subprogram_Type
=>
4380 if Etype
(Typ
) = Standard_Void_Type
then
4381 Write_Str
("procedure");
4383 Write_Str
("function");
4386 if Present
(First_Entity
(Typ
)) then
4393 Param
:= First_Entity
(Typ
);
4398 if Ekind
(Param
) = E_In_Out_Parameter
then
4399 Write_Str
("in out ");
4400 elsif Ekind
(Param
) = E_Out_Parameter
then
4404 Write_Id
(Etype
(Param
));
4405 Next_Entity
(Param
);
4406 exit when No
(Param
);
4414 if Etype
(Typ
) /= Standard_Void_Type
then
4415 Write_Str
(" return ");
4416 Write_Id
(Etype
(Typ
));
4419 when E_String_Literal_Subtype
=>
4421 LB
: constant Uint
:=
4422 Expr_Value
(String_Literal_Low_Bound
(Typ
));
4423 Len
: constant Uint
:=
4424 String_Literal_Length
(Typ
);
4426 Write_Header
(False);
4427 Write_Str
("String (");
4428 Write_Int
(UI_To_Int
(LB
));
4430 Write_Int
(UI_To_Int
(LB
+ Len
) - 1);
4434 -- For all other Itypes, print ??? (fill in later)
4437 Write_Header
(True);
4443 -- Add terminating bracket and restore output buffer
4447 Restore_Output_Buffer
(S
);
4450 Set_Itype_Printed
(Typ
);
4454 -------------------------------
4455 -- Write_Name_With_Col_Check --
4456 -------------------------------
4458 procedure Write_Name_With_Col_Check
(N
: Name_Id
) is
4464 Get_Name_String
(N
);
4466 -- Deal with -gnatdI which replaces any sequence Cnnnb where C is an
4467 -- upper case letter, nnn is one or more digits and b is a lower case
4468 -- letter by C...b, so that listings do not depend on serial numbers.
4470 if Debug_Flag_II
then
4472 while J
< Name_Len
- 1 loop
4473 if Name_Buffer
(J
) in 'A' .. 'Z'
4474 and then Name_Buffer
(J
+ 1) in '0' .. '9'
4477 while K
< Name_Len
loop
4478 exit when Name_Buffer
(K
) not in '0' .. '9';
4482 if Name_Buffer
(K
) in 'a' .. 'z' then
4483 L
:= Name_Len
- K
+ 1;
4485 Name_Buffer
(J
+ 4 .. J
+ L
+ 3) :=
4486 Name_Buffer
(K
.. Name_Len
);
4487 Name_Buffer
(J
+ 1 .. J
+ 3) := "...";
4488 Name_Len
:= J
+ L
+ 3;
4501 -- Fall through for normal case
4503 Write_Str_With_Col_Check
(Name_Buffer
(1 .. Name_Len
));
4504 end Write_Name_With_Col_Check
;
4506 ------------------------------------
4507 -- Write_Name_With_Col_Check_Sloc --
4508 ------------------------------------
4510 procedure Write_Name_With_Col_Check_Sloc
(N
: Name_Id
) is
4512 Get_Name_String
(N
);
4513 Write_Str_With_Col_Check_Sloc
(Name_Buffer
(1 .. Name_Len
));
4514 end Write_Name_With_Col_Check_Sloc
;
4516 --------------------
4517 -- Write_Operator --
4518 --------------------
4520 procedure Write_Operator
(N
: Node_Id
; S
: String) is
4521 F
: Natural := S
'First;
4522 T
: Natural := S
'Last;
4525 -- If no overflow check, just write string out, and we are done
4527 if not Do_Overflow_Check
(N
) then
4530 -- If overflow check, we want to surround the operator with curly
4531 -- brackets, but not include spaces within the brackets.
4544 Write_Str_Sloc
(S
(F
.. T
));
4547 if S
(S
'Last) = ' ' then
4553 -----------------------
4554 -- Write_Param_Specs --
4555 -----------------------
4557 procedure Write_Param_Specs
(N
: Node_Id
) is
4558 Specs
: constant List_Id
:= Parameter_Specifications
(N
);
4559 Specs_Present
: constant Boolean := Is_Non_Empty_List
(Specs
);
4566 Output
: Boolean := False;
4567 -- Set true if we output at least one parameter
4570 -- Write out explicit specs from Parameter_Speficiations list
4572 if Specs_Present
then
4573 Write_Str_With_Col_Check
(" (");
4576 Spec
:= First
(Specs
);
4579 Formal
:= Defining_Identifier
(Spec
);
4581 exit when Spec
= Empty
;
4583 -- Add semicolon, unless we are printing original tree and the
4584 -- next specification is part of a list (but not the first element
4587 if not Dump_Original_Only
or else not Prev_Ids
(Spec
) then
4593 -- See if we have extra formals
4595 if Nkind_In
(N
, N_Function_Specification
,
4596 N_Procedure_Specification
)
4598 Ent
:= Defining_Entity
(N
);
4600 -- Loop to write extra formals (if any)
4602 if Present
(Ent
) and then Is_Subprogram
(Ent
) then
4603 Extras
:= Extra_Formals
(Ent
);
4605 if Present
(Extras
) then
4606 if not Specs_Present
then
4607 Write_Str_With_Col_Check
(" (");
4612 while Present
(Formal
) loop
4613 if Specs_Present
or else Formal
/= Extras
then
4617 Write_Name_With_Col_Check
(Chars
(Formal
));
4619 Write_Name_With_Col_Check
(Chars
(Etype
(Formal
)));
4620 Formal
:= Extra_Formal
(Formal
);
4629 end Write_Param_Specs
;
4631 -----------------------
4632 -- Write_Rewrite_Str --
4633 -----------------------
4635 procedure Write_Rewrite_Str
(S
: String) is
4637 if not Dump_Generated_Only
then
4638 if S
'Length = 3 and then S
= ">>>" then
4641 Write_Str_With_Col_Check
(S
);
4644 end Write_Rewrite_Str
;
4646 -----------------------
4647 -- Write_Source_Line --
4648 -----------------------
4650 procedure Write_Source_Line
(L
: Physical_Line_Number
) is
4652 Src
: Source_Buffer_Ptr
;
4656 if Dump_Source_Text
then
4657 Src
:= Source_Text
(Current_Source_File
);
4658 Loc
:= Line_Start
(L
, Current_Source_File
);
4661 -- See if line is a comment line, if not, and if not line one,
4662 -- precede with blank line.
4665 while Src
(Scn
) = ' ' or else Src
(Scn
) = ASCII
.HT
loop
4669 if (Src
(Scn
) in Line_Terminator
4670 or else Src
(Scn
.. Scn
+ 1) /= "--")
4676 -- Now write the source text of the line
4679 Write_Int
(Int
(L
));
4682 while Src
(Loc
) not in Line_Terminator
loop
4683 Write_Char
(Src
(Loc
));
4687 end Write_Source_Line
;
4689 ------------------------
4690 -- Write_Source_Lines --
4691 ------------------------
4693 procedure Write_Source_Lines
(L
: Physical_Line_Number
) is
4695 while Last_Line_Printed
< L
loop
4696 Last_Line_Printed
:= Last_Line_Printed
+ 1;
4697 Write_Source_Line
(Last_Line_Printed
);
4699 end Write_Source_Lines
;
4701 --------------------
4702 -- Write_Str_Sloc --
4703 --------------------
4705 procedure Write_Str_Sloc
(S
: String) is
4707 for J
in S
'Range loop
4708 Write_Char_Sloc
(S
(J
));
4712 ------------------------------
4713 -- Write_Str_With_Col_Check --
4714 ------------------------------
4716 procedure Write_Str_With_Col_Check
(S
: String) is
4718 if Int
(S
'Last) + Column
> Sprint_Line_Limit
then
4719 Write_Indent_Str
(" ");
4721 if S
(S
'First) = ' ' then
4722 Write_Str
(S
(S
'First + 1 .. S
'Last));
4730 end Write_Str_With_Col_Check
;
4732 -----------------------------------
4733 -- Write_Str_With_Col_Check_Sloc --
4734 -----------------------------------
4736 procedure Write_Str_With_Col_Check_Sloc
(S
: String) is
4738 if Int
(S
'Last) + Column
> Sprint_Line_Limit
then
4739 Write_Indent_Str
(" ");
4741 if S
(S
'First) = ' ' then
4742 Write_Str_Sloc
(S
(S
'First + 1 .. S
'Last));
4750 end Write_Str_With_Col_Check_Sloc
;
4752 ---------------------------
4753 -- Write_Subprogram_Name --
4754 ---------------------------
4756 procedure Write_Subprogram_Name
(N
: Node_Id
) is
4758 if not Comes_From_Source
(N
)
4759 and then Is_Entity_Name
(N
)
4762 Ent
: constant Entity_Id
:= Entity
(N
);
4764 if not In_Extended_Main_Source_Unit
(Ent
)
4766 Is_Predefined_File_Name
4767 (Unit_File_Name
(Get_Source_Unit
(Ent
)))
4769 -- Run-time routine name, output name with a preceding dollar
4770 -- making sure that we do not get a line split between them.
4772 Col_Check
(Length_Of_Name
(Chars
(Ent
)) + 1);
4774 Write_Name
(Chars
(Ent
));
4780 -- Normal case, not a run-time routine name
4783 end Write_Subprogram_Name
;
4785 -------------------------------
4786 -- Write_Uint_With_Col_Check --
4787 -------------------------------
4789 procedure Write_Uint_With_Col_Check
(U
: Uint
; Format
: UI_Format
) is
4791 Col_Check
(UI_Decimal_Digits_Hi
(U
));
4792 UI_Write
(U
, Format
);
4793 end Write_Uint_With_Col_Check
;
4795 ------------------------------------
4796 -- Write_Uint_With_Col_Check_Sloc --
4797 ------------------------------------
4799 procedure Write_Uint_With_Col_Check_Sloc
(U
: Uint
; Format
: UI_Format
) is
4801 Col_Check
(UI_Decimal_Digits_Hi
(U
));
4803 UI_Write
(U
, Format
);
4804 end Write_Uint_With_Col_Check_Sloc
;
4806 -------------------------------------
4807 -- Write_Ureal_With_Col_Check_Sloc --
4808 -------------------------------------
4810 procedure Write_Ureal_With_Col_Check_Sloc
(U
: Ureal
) is
4811 D
: constant Uint
:= Denominator
(U
);
4812 N
: constant Uint
:= Numerator
(U
);
4814 Col_Check
(UI_Decimal_Digits_Hi
(D
) + UI_Decimal_Digits_Hi
(N
) + 4);
4816 UR_Write
(U
, Brackets
=> True);
4817 end Write_Ureal_With_Col_Check_Sloc
;