~ubuntu-branches/debian/stretch/gcc-6-doc/stretch

« back to all changes in this revision

Viewing changes to .pc/from-debian-gcc-rename-info-files.diff/gcc/ada/gnat-style.texi

  • Committer: Package Import Robot
  • Author(s): Guo Yixuan (郭溢譞)
  • Date: 2016-05-06 21:45:33 UTC
  • Revision ID: package-import@ubuntu.com-20160506214533-1ro717riyxkhd4kn
Tags: 6.1.0-1
* New upstream branch. (Closes: #822667)
* Synced patches with gcc-6, 6.1.1-1.
* Use https URIs for Vcs-*.
* Bumped standards version to 3.9.8, no changes needed.
* Update debian/copyright.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
\input texinfo   @c -*-texinfo-*-
 
2
@c %**start of header
 
3
 
 
4
@c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 
5
@c                                                                            o
 
6
@c                           GNAT DOCUMENTATION                               o
 
7
@c                                                                            o
 
8
@c                     G N A T   C O D I N G   S T Y L E                      o
 
9
@c                                                                            o
 
10
@c                     Copyright (C) 1992-2012, AdaCore                       o
 
11
@c                                                                            o
 
12
@c oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 
13
 
 
14
@setfilename gnat-style.info
 
15
 
 
16
@copying
 
17
Copyright @copyright{} 1992-2012, AdaCore
 
18
 
 
19
Permission is granted to copy, distribute and/or modify this document
 
20
under the terms of the GNU Free Documentation License, Version 1.3 or
 
21
any later version published by the Free Software Foundation; with no
 
22
Invariant Sections, with no Front-Cover Texts and with no Back-Cover
 
23
Texts.  A copy of the license is included in the section entitled
 
24
``GNU Free Documentation License''.
 
25
@end copying
 
26
 
 
27
@settitle GNAT Coding Style
 
28
@setchapternewpage odd
 
29
 
 
30
@include gcc-common.texi
 
31
 
 
32
@dircategory Software development
 
33
@direntry
 
34
* gnat-style: (gnat-style).      GNAT Coding Style
 
35
@end direntry
 
36
 
 
37
@macro syntax{element}
 
38
@t{\element\}
 
39
@end macro
 
40
@c %**end of header
 
41
 
 
42
@titlepage
 
43
@titlefont{GNAT Coding Style:}
 
44
@sp 1
 
45
@title A Guide for GNAT Developers
 
46
@subtitle GNAT, The GNU Ada Compiler
 
47
@versionsubtitle
 
48
@author Ada Core Technologies, Inc.
 
49
@page
 
50
@vskip 0pt plus 1filll
 
51
 
 
52
@insertcopying
 
53
@end titlepage
 
54
 
 
55
@raisesections
 
56
 
 
57
@node    Top,       General,         , (dir)
 
58
@comment node-name, next,    previous, up
 
59
 
 
60
@ifnottex
 
61
@noindent
 
62
GNAT Coding Style@*
 
63
A Guide for GNAT Developers
 
64
@sp 2
 
65
@noindent
 
66
GNAT, The GNU Ada Compiler@*
 
67
 
 
68
@noindent
 
69
@insertcopying
 
70
@end ifnottex
 
71
 
 
72
 
 
73
@menu
 
74
* General::
 
75
* Lexical Elements::
 
76
* Declarations and Types::
 
77
* Expressions and Names::
 
78
* Statements::
 
79
* Subprograms::
 
80
* Packages::
 
81
* Program Structure::
 
82
* GNU Free Documentation License::
 
83
* Index::
 
84
@end menu
 
85
 
 
86
@c  -------------------------------------------------------------------------
 
87
@node    General, Lexical Elements, Top, Top
 
88
@section General
 
89
@c  -------------------------------------------------------------------------
 
90
 
 
91
@noindent
 
92
Most of GNAT is written in Ada using a consistent style to ensure
 
93
readability of the code.  This document has been written to help
 
94
maintain this consistent style, while having a large group of developers
 
95
work on the compiler.
 
96
 
 
97
For the coding style in the C parts of the compiler and run time,
 
98
see the GNU Coding Guidelines.
 
99
 
 
100
This document is structured after the @cite{Ada Reference Manual}.
 
101
Those familiar with that document should be able to quickly
 
102
lookup style rules for particular constructs.
 
103
 
 
104
 
 
105
@c  -------------------------------------------------------------------------
 
106
@node    Lexical Elements, Declarations and Types, General, Top
 
107
@section Lexical Elements
 
108
@c  -------------------------------------------------------------------------
 
109
@cindex Lexical elements
 
110
 
 
111
@subsection Character Set and Separators
 
112
@c  -------------------------------------------------------------------------
 
113
@cindex Character set
 
114
@cindex ASCII
 
115
@cindex Separators
 
116
@cindex End-of-line
 
117
@cindex Line length
 
118
@cindex Indentation
 
119
 
 
120
@itemize @bullet
 
121
@item
 
122
The character set used should be plain 7-bit ASCII@.
 
123
The only separators allowed are space and the end-of-line sequence.
 
124
No other control character or format effector (such as @code{HT},
 
125
@code{VT}, @code{FF})
 
126
should be used.
 
127
The normal end-of-line sequence is used, which may be
 
128
@code{LF}, @code{CR/LF} or @code{CR},
 
129
depending on the host system.  An optional @code{SUB}
 
130
(@code{16#1A#}) may be present as the
 
131
last character in the file on hosts using that character as file terminator.
 
132
 
 
133
@item
 
134
Files that are checked in or distributed should be in host format.
 
135
 
 
136
@item
 
137
A line should never be longer than 79 characters, not counting the line
 
138
separator.
 
139
 
 
140
@item
 
141
Lines must not have trailing blanks.
 
142
 
 
143
@item
 
144
Indentation is 3 characters per level for @code{if} statements, loops, and
 
145
@code{case} statements.
 
146
For exact information on required spacing between lexical
 
147
elements, see file @file{style.adb}.
 
148
@cindex @file{style.adb} file
 
149
@end itemize
 
150
 
 
151
 
 
152
@subsection Identifiers
 
153
@c  -------------------------------------------------------------------------
 
154
@itemize @bullet
 
155
@cindex Identifiers
 
156
 
 
157
@item
 
158
Identifiers will start with an upper case letter, and each letter following
 
159
an underscore will be upper case.
 
160
@cindex Casing (for identifiers)
 
161
Short acronyms may be all upper case.
 
162
All other letters are lower case.
 
163
An exception is for identifiers matching a foreign language.  In particular,
 
164
we use all lower case where appropriate for C@.
 
165
 
 
166
@item
 
167
Use underscores to separate words in an identifier.
 
168
@cindex Underscores
 
169
 
 
170
@item Try to limit your use of abbreviations in identifiers.
 
171
It is ok to make a few abbreviations, explain what they mean, and then
 
172
use them frequently, but don't use lots of obscure abbreviations.  An
 
173
example is the @code{ALI} word which stands for Ada Library
 
174
Information and is by convention always written in upper-case when
 
175
used in entity names.
 
176
 
 
177
@smallexample @c adanocomment
 
178
       procedure Find_ALI_Files;
 
179
@end smallexample
 
180
 
 
181
@item
 
182
Don't use the variable name @code{I}, use @code{J} instead; @code{I} is too
 
183
easily confused with @code{1} in some fonts.  Similarly don't use the
 
184
variable @code{O}, which is too easily mistaken for the number @code{0}.
 
185
@end itemize
 
186
 
 
187
@subsection Numeric Literals
 
188
@c  -------------------------------------------------------------------------
 
189
@cindex Numeric literals
 
190
 
 
191
@itemize @bullet
 
192
@item
 
193
Numeric literals should include underscores where helpful for
 
194
readability.
 
195
@cindex Underscores
 
196
 
 
197
@smallexample
 
198
      1_000_000
 
199
      16#8000_0000#
 
200
      3.14159_26535_89793_23846
 
201
@end smallexample
 
202
@end itemize
 
203
 
 
204
@subsection Reserved Words
 
205
@c  -------------------------------------------------------------------------
 
206
@cindex Reserved words
 
207
 
 
208
@itemize @bullet
 
209
@item
 
210
Reserved words use all lower case.
 
211
@cindex Casing (for reserved words)
 
212
 
 
213
@smallexample @c adanocomment
 
214
       return else
 
215
@end smallexample
 
216
 
 
217
@item
 
218
The words @code{Access}, @code{Delta} and @code{Digits} are
 
219
capitalized when used as @syntax{attribute_designator}.
 
220
@end itemize
 
221
 
 
222
@subsection Comments
 
223
@c  -------------------------------------------------------------------------
 
224
@cindex Comments
 
225
 
 
226
@itemize @bullet
 
227
@item
 
228
A comment starts with @code{--} followed by two spaces.
 
229
The only exception to this rule (i.e.@: one space is tolerated) is when the
 
230
comment ends with a single space followed by @code{--}.
 
231
It is also acceptable to have only one space between @code{--} and the start
 
232
of the comment when the comment is at the end of a line,
 
233
after some Ada code.
 
234
 
 
235
@item
 
236
Every sentence in a comment should start with an upper-case letter (including
 
237
the first letter of the comment).
 
238
@cindex Casing (in comments)
 
239
 
 
240
@item
 
241
When declarations are commented with ``hanging'' comments, i.e.@:
 
242
comments after the declaration, there is no blank line before the
 
243
comment, and if it is absolutely necessary to have blank lines within
 
244
the comments, e.g. to make paragraph separations within a single comment,
 
245
these blank lines @emph{do} have a @code{--} (unlike the
 
246
normal rule, which is to use entirely blank lines for separating
 
247
comment paragraphs).  The comment starts at same level of indentation
 
248
as code it is commenting.
 
249
@cindex Blank lines (in comments)
 
250
@cindex Indentation
 
251
 
 
252
@smallexample @c adanocomment
 
253
       z : Integer;
 
254
       --  Integer value for storing value of z
 
255
       --
 
256
       --  The previous line was a blank line.
 
257
@end smallexample
 
258
 
 
259
@item
 
260
Comments that are dubious or incomplete, or that comment on possibly
 
261
wrong or incomplete code, should be preceded or followed by @code{???}@.
 
262
 
 
263
@item
 
264
Comments in a subprogram body must generally be surrounded by blank lines.
 
265
An exception is a comment that follows a line containing a single keyword
 
266
(@code{begin}, @code{else}, @code{loop}):
 
267
 
 
268
@smallexample @c adanocomment
 
269
@group
 
270
       begin
 
271
          --  Comment for the next statement
 
272
 
 
273
          A := 5;
 
274
 
 
275
          --  Comment for the B statement
 
276
 
 
277
          B := 6;
 
278
       end;
 
279
@end group
 
280
@end smallexample
 
281
 
 
282
@item
 
283
In sequences of statements, comments at the end of the lines should be
 
284
aligned.
 
285
@cindex Alignment (in comments)
 
286
 
 
287
@smallexample @c adanocomment
 
288
        My_Identifier := 5;      --  First comment
 
289
        Other_Id := 6;           --  Second comment
 
290
@end smallexample
 
291
 
 
292
@item
 
293
Short comments that fit on a single line are @emph{not} ended with a
 
294
period.  Comments taking more than a line are punctuated in the normal
 
295
manner.
 
296
 
 
297
@item
 
298
Comments should focus on @emph{why} instead of @emph{what}.
 
299
Descriptions of what subprograms do go with the specification.
 
300
 
 
301
@item
 
302
Comments describing a subprogram spec should specifically mention the
 
303
formal argument names.  General rule: write a comment that does not
 
304
depend on the names of things.  The names are supplementary, not
 
305
sufficient, as comments.
 
306
 
 
307
@item
 
308
@emph{Do not} put two spaces after periods in comments.
 
309
@end itemize
 
310
 
 
311
@c  -------------------------------------------------------------------------
 
312
@node    Declarations and Types, Expressions and Names, Lexical Elements,Top
 
313
@section Declarations and Types
 
314
@c  -------------------------------------------------------------------------
 
315
@cindex Declarations and Types
 
316
 
 
317
@itemize @bullet
 
318
@item
 
319
In entity declarations, colons must be surrounded by spaces.  Colons
 
320
should be aligned.
 
321
@cindex Alignment (in declarations)
 
322
 
 
323
@smallexample @c adanocomment
 
324
        Entity1   : Integer;
 
325
        My_Entity : Integer;
 
326
@end smallexample
 
327
 
 
328
@item
 
329
Declarations should be grouped in a logical order.
 
330
Related groups of declarations may be preceded by a header comment.
 
331
 
 
332
@item
 
333
All local subprograms in a subprogram or package body should be declared
 
334
before the first local subprogram body.
 
335
 
 
336
@item
 
337
Do not declare local entities that hide global entities.
 
338
@cindex Hiding of outer entities
 
339
 
 
340
@item
 
341
Do not declare multiple variables in one declaration that spans lines.
 
342
Start a new declaration on each line, instead.
 
343
 
 
344
@item
 
345
The @syntax{defining_identifier}s of global declarations serve as
 
346
comments of a sort.  So don't choose terse names, but look for names
 
347
that give useful information instead.
 
348
 
 
349
@item
 
350
Local names can be shorter, because they are used only within
 
351
one context, where comments explain their purpose.
 
352
 
 
353
@item
 
354
When starting an initialization or default expression on the line that follows
 
355
the declaration line, use 2 characters for indentation.
 
356
 
 
357
@smallexample @c adanocomment
 
358
        Entity1 : Integer :=
 
359
          Function_Name (Parameters, For_Call);
 
360
@end smallexample
 
361
 
 
362
@item
 
363
If an initialization or default expression needs to be continued on subsequent
 
364
lines, the continuations should be indented from the start of the expression.
 
365
 
 
366
@smallexample @c adanocomment
 
367
        Entity1 : Integer := Long_Function_Name
 
368
                               (parameters for call);
 
369
@end smallexample
 
370
 
 
371
@end itemize
 
372
 
 
373
 
 
374
@c  -------------------------------------------------------------------------
 
375
@node    Expressions and Names, Statements, Declarations and Types, Top
 
376
@section Expressions and Names
 
377
@c  -------------------------------------------------------------------------
 
378
@cindex Expressions and names
 
379
 
 
380
@itemize @bullet
 
381
 
 
382
@item
 
383
Every operator must be surrounded by spaces. An exception is that
 
384
this rule does not apply to the exponentiation operator, for which
 
385
there are no specific layout rules. The reason for this exception
 
386
is that sometimes it makes clearer reading to leave out the spaces
 
387
around exponentiation.
 
388
@cindex Operators
 
389
 
 
390
@smallexample @c adanocomment
 
391
       E := A * B**2 + 3 * (C - D);
 
392
@end smallexample
 
393
 
 
394
@item
 
395
Use parentheses where they clarify the intended association of operands
 
396
with operators:
 
397
@cindex Parenthesization of expressions
 
398
@smallexample @c adanocomment
 
399
       (A / B) * C
 
400
@end smallexample
 
401
@end itemize
 
402
 
 
403
@c  -------------------------------------------------------------------------
 
404
@node    Statements, Subprograms, Expressions and Names, Top
 
405
@section Statements
 
406
@c  -------------------------------------------------------------------------
 
407
@cindex Statements
 
408
 
 
409
@subsection Simple and Compound Statements
 
410
@c  -------------------------------------------------------------------------
 
411
@cindex Simple and compound statements
 
412
 
 
413
@itemize @bullet
 
414
@item
 
415
Use only one statement or label per line.
 
416
@item
 
417
A longer @syntax{sequence_of_statements} may be divided in logical
 
418
groups or separated from surrounding code using a blank line.
 
419
@end itemize
 
420
 
 
421
@subsection If Statements
 
422
@c  -------------------------------------------------------------------------
 
423
@cindex @code{if} statement
 
424
 
 
425
@itemize @bullet
 
426
@item
 
427
When the @code{if}, @code{elsif} or @code{else} keywords fit on the
 
428
same line with the condition and the @code{then} keyword, then the
 
429
statement is formatted as follows:
 
430
@cindex Alignment (in an @code{if} statement)
 
431
 
 
432
@smallexample @c adanocomment
 
433
@group
 
434
        if @var{condition} then
 
435
           ...
 
436
        elsif @var{condition} then
 
437
           ...
 
438
        else
 
439
           ...
 
440
        end if;
 
441
@end group
 
442
@end smallexample
 
443
 
 
444
@noindent
 
445
When the above layout is not possible, @code{then} should be aligned
 
446
with @code{if}, and conditions should preferably be split before an
 
447
@code{and} or @code{or} keyword a follows:
 
448
 
 
449
@smallexample @c adanocomment
 
450
@group
 
451
        if @var{long_condition_that_has_to_be_split}
 
452
          and then @var{continued_on_the_next_line}
 
453
        then
 
454
           ...
 
455
        end if;
 
456
@end group
 
457
@end smallexample
 
458
 
 
459
@noindent
 
460
The @code{elsif}, @code{else} and @code{end if} always line up with
 
461
the @code{if} keyword.  The preferred location for splitting the line
 
462
is before @code{and} or @code{or}.  The continuation of a condition is
 
463
indented with two spaces or as many as needed to make nesting clear.
 
464
As an exception, if conditions are closely related either of the
 
465
following is allowed:
 
466
 
 
467
@smallexample
 
468
@group
 
469
     if x = lakdsjfhlkashfdlkflkdsalkhfsalkdhflkjdsahf
 
470
          or else
 
471
        x = asldkjhalkdsjfhhfd
 
472
          or else
 
473
        x = asdfadsfadsf
 
474
     then
 
475
       ...
 
476
     end if;
 
477
@end group
 
478
 
 
479
@group
 
480
     if x = lakdsjfhlkashfdlkflkdsalkhfsalkdhflkjdsahf or else
 
481
        x = asldkjhalkdsjfhhfd                         or else
 
482
        x = asdfadsfadsf
 
483
     then
 
484
       ...
 
485
     end if;
 
486
@end group
 
487
@end smallexample
 
488
 
 
489
@item
 
490
Conditions should use short-circuit forms (@code{and then},
 
491
@code{or else}), except when the operands are boolean variables
 
492
or boolean constants.
 
493
@cindex Short-circuit forms
 
494
 
 
495
@item
 
496
Complex conditions in @code{if} statements are indented two characters:
 
497
@cindex Indentation (in @code{if} statements)
 
498
 
 
499
@smallexample @c adanocomment
 
500
@group
 
501
      if @var{this_complex_condition}
 
502
        and then @var{that_other_one}
 
503
        and then @var{one_last_one}
 
504
      then
 
505
         ...
 
506
      end if;
 
507
@end group
 
508
@end smallexample
 
509
 
 
510
@noindent
 
511
There are some cases where complex conditionals can be laid out
 
512
in manners that do not follow these rules to preserve better
 
513
parallelism between branches, e.g.
 
514
 
 
515
@smallexample @c adanocomment
 
516
@group
 
517
      if xyz.abc (gef) = 'c'
 
518
           or else
 
519
         xyz.abc (gef) = 'x'
 
520
      then
 
521
         ...
 
522
      end if;
 
523
@end group
 
524
@end smallexample
 
525
 
 
526
 
 
527
@item
 
528
Every @code{if} block is preceded and followed by a blank line, except
 
529
where it begins or ends a @syntax{sequence_of_statements}.
 
530
@cindex Blank lines (in an @code{if} statement)
 
531
 
 
532
@smallexample @c adanocomment
 
533
@group
 
534
        A := 5;
 
535
 
 
536
        if A = 5 then
 
537
           null;
 
538
        end if;
 
539
 
 
540
        A := 6;
 
541
@end group
 
542
@end smallexample
 
543
@end itemize
 
544
 
 
545
@subsection Case Statements
 
546
@cindex @code{case} statements
 
547
 
 
548
@itemize @bullet
 
549
@item
 
550
Layout is as below.  For long @code{case} statements, the extra indentation
 
551
can be saved by aligning the @code{when} clauses with the opening @code{case}.
 
552
 
 
553
@smallexample @c adanocomment
 
554
@group
 
555
       case @var{expression} is
 
556
          when @var{condition} =>
 
557
             ...
 
558
          when @var{condition} =>
 
559
             ...
 
560
       end case;
 
561
@end group
 
562
@end smallexample
 
563
@end itemize
 
564
 
 
565
@subsection Loop Statements
 
566
@cindex Loop statements
 
567
 
 
568
@itemize @bullet
 
569
@item
 
570
When possible, have @code{for} or @code{while} on one line with the
 
571
condition and the @code{loop} keyword.
 
572
 
 
573
@smallexample @c adanocomment
 
574
@group
 
575
       for J in S'Range loop
 
576
          ...
 
577
       end loop;
 
578
@end group
 
579
@end smallexample
 
580
 
 
581
@noindent
 
582
If the condition is too long, split the condition (see ``If
 
583
statements'' above) and align @code{loop} with the @code{for} or
 
584
@code{while} keyword.
 
585
@cindex Alignment (in a loop statement)
 
586
 
 
587
@smallexample @c adanocomment
 
588
@group
 
589
      while @var{long_condition_that_has_to_be_split}
 
590
        and then @var{continued_on_the_next_line}
 
591
      loop
 
592
         ...
 
593
      end loop;
 
594
@end group
 
595
@end smallexample
 
596
 
 
597
@noindent
 
598
If the @syntax{loop_statement} has an identifier, it is laid out as follows:
 
599
 
 
600
@smallexample @c adanocomment
 
601
@group
 
602
      Outer : while not @var{condition} loop
 
603
         ...
 
604
      end Outer;
 
605
@end group
 
606
@end smallexample
 
607
@end itemize
 
608
 
 
609
@subsection Block Statements
 
610
@cindex Block statement
 
611
 
 
612
@itemize @bullet
 
613
@item
 
614
The @code{declare} (optional), @code{begin} and @code{end} words
 
615
are aligned, except when the @syntax{block_statement} is named.  There
 
616
is a blank line before the @code{begin} keyword:
 
617
@cindex Alignment (in a block statement)
 
618
 
 
619
@smallexample @c adanocomment
 
620
@group
 
621
      Some_Block : declare
 
622
         ...
 
623
 
 
624
      begin
 
625
         ...
 
626
      end Some_Block;
 
627
@end group
 
628
@end smallexample
 
629
 
 
630
@end itemize
 
631
 
 
632
@c  -------------------------------------------------------------------------
 
633
@node    Subprograms, Packages, Statements, Top
 
634
@section Subprograms
 
635
@c  -------------------------------------------------------------------------
 
636
@cindex Subprograms
 
637
 
 
638
@subsection Subprogram Declarations
 
639
@c  -------------------------------------------------------------------------
 
640
@itemize @bullet
 
641
 
 
642
@item
 
643
Do not write the @code{in} for parameters.
 
644
 
 
645
@smallexample @c adanocomment
 
646
      function Length (S : String) return Integer;
 
647
@end smallexample
 
648
 
 
649
@item
 
650
When the declaration line for a procedure or a function is too long to fit
 
651
the entire declaration (including the keyword procedure or function) on a
 
652
single line, then fold it, putting a single parameter on a line, aligning
 
653
the colons, as in:
 
654
 
 
655
@smallexample @c adanocomment
 
656
@group
 
657
     procedure Set_Heading
 
658
       (Source : String;
 
659
        Count  : Natural;
 
660
        Pad    : Character := Space;
 
661
        Fill   : Boolean   := True);
 
662
@end group
 
663
@end smallexample
 
664
 
 
665
@noindent
 
666
In the case of a function, if the entire spec does not fit on one line, then
 
667
the return may appear after the last parameter, as in:
 
668
 
 
669
@smallexample @c adanocomment
 
670
@group
 
671
      function Head
 
672
        (Source : String;
 
673
         Count  : Natural;
 
674
         Pad    : Character := Space) return String;
 
675
@end group
 
676
@end smallexample
 
677
 
 
678
@noindent
 
679
Or it may appear on its own as a separate line. This form is preferred when
 
680
putting the return on the same line as the last parameter would result in
 
681
an overlong line. The return type may optionally be aligned with the types
 
682
of the parameters (usually we do this aligning if it results only in a small
 
683
number of extra spaces, and otherwise we don't attempt to align). So two
 
684
alternative forms for the above spec are:
 
685
 
 
686
@smallexample @c adanocomment
 
687
@group
 
688
      function Head
 
689
        (Source : String;
 
690
         Count  : Natural;
 
691
         Pad    : Character := Space)
 
692
         return   String;
 
693
 
 
694
      function Head
 
695
        (Source : String;
 
696
         Count  : Natural;
 
697
         Pad    : Character := Space)
 
698
         return String;
 
699
@end group
 
700
@end smallexample
 
701
 
 
702
@end itemize
 
703
 
 
704
@subsection Subprogram Bodies
 
705
@c  -------------------------------------------------------------------------
 
706
@cindex Subprogram bodies
 
707
 
 
708
@itemize @bullet
 
709
@item
 
710
Function and procedure bodies should usually be sorted alphabetically. Do
 
711
not attempt to sort them in some logical order by functionality. For a
 
712
sequence of subprogram specs, a general alphabetical sorting is also
 
713
usually appropriate, but occasionally it makes sense to group by major
 
714
function, with appropriate headers.
 
715
 
 
716
@item
 
717
All subprograms have a header giving the function name, with the following
 
718
format:
 
719
 
 
720
@smallexample @c adanocomment
 
721
@group
 
722
      -----------------
 
723
      -- My_Function --
 
724
      -----------------
 
725
 
 
726
      procedure My_Function is
 
727
      begin
 
728
        ...
 
729
      end My_Function;
 
730
@end group
 
731
@end smallexample
 
732
 
 
733
@noindent
 
734
Note that the name in the header is preceded by a single space,
 
735
not two spaces as for other comments. These headers are used on
 
736
nested subprograms as well as outer level subprograms. They may
 
737
also be used as headers for sections of comments, or collections
 
738
of declarations that are related.
 
739
 
 
740
@item
 
741
Every subprogram body must have a preceding @syntax{subprogram_declaration},
 
742
which includes proper client documentation so that you do not need to
 
743
read the subprogram body in order to understand what the subprogram does and
 
744
how to call it. All subprograms should be documented, without exceptions.
 
745
 
 
746
@item
 
747
@cindex Blank lines (in subprogram bodies)
 
748
A sequence of declarations may optionally be separated from the following
 
749
begin by a blank line.  Just as we optionally allow blank lines in general
 
750
between declarations, this blank line should be present only if it improves
 
751
readability. Generally we avoid this blank line if the declarative part is
 
752
small (one or two lines) and the body has no blank lines, and we include it
 
753
if the declarative part is long or if the body has blank lines.
 
754
 
 
755
@item
 
756
If the declarations in a subprogram contain at least one nested
 
757
subprogram body, then just before the @code{begin} of the enclosing
 
758
subprogram, there is a comment line and a blank line:
 
759
 
 
760
@smallexample @c adanocomment
 
761
@group
 
762
    --  Start of processing for @var{Enclosing_Subprogram}
 
763
 
 
764
    begin
 
765
      ...
 
766
    end @var{Enclosing_Subprogram};
 
767
@end group
 
768
@end smallexample
 
769
 
 
770
@item
 
771
When nested subprograms are present, variables that are referenced by any
 
772
nested subprogram should precede the nested subprogram specs. For variables
 
773
that are not referenced by nested procedures, the declarations can either also
 
774
be before any of the nested subprogram specs (this is the old style, more
 
775
generally used). Or then can come just before the begin, with a header. The
 
776
following example shows the two possible styles:
 
777
 
 
778
@smallexample @c adanocomment
 
779
@group
 
780
    procedure Style1 is
 
781
       Var_Referenced_In_Nested      : Integer;
 
782
       Var_Referenced_Only_In_Style1 : Integer;
 
783
 
 
784
       proc Nested;
 
785
       --  Comments ...
 
786
 
 
787
 
 
788
       ------------
 
789
       -- Nested --
 
790
       ------------
 
791
 
 
792
       procedure Nested is
 
793
       begin
 
794
          ...
 
795
       end Nested;
 
796
 
 
797
    --  Start of processing for Style1
 
798
 
 
799
    begin
 
800
       ...
 
801
    end Style1;
 
802
 
 
803
@end group
 
804
 
 
805
@group
 
806
    procedure Style2 is
 
807
       Var_Referenced_In_Nested : Integer;
 
808
 
 
809
       proc Nested;
 
810
       --  Comments ...
 
811
 
 
812
       ------------
 
813
       -- Nested --
 
814
       ------------
 
815
 
 
816
       procedure Nested is
 
817
       begin
 
818
          ...
 
819
       end Nested;
 
820
 
 
821
       --  Local variables
 
822
 
 
823
       Var_Referenced_Only_In_Style2 : Integer;
 
824
 
 
825
    --  Start of processing for Style2
 
826
 
 
827
    begin
 
828
       ...
 
829
    end Style2;
 
830
 
 
831
@end group
 
832
@end smallexample
 
833
 
 
834
@noindent
 
835
For new code, we generally prefer Style2, but we do not insist on
 
836
modifying all legacy occurrences of Style1, which is still much
 
837
more common in the sources.
 
838
 
 
839
@end itemize
 
840
 
 
841
 
 
842
@c  -------------------------------------------------------------------------
 
843
@node    Packages, Program Structure, Subprograms, Top
 
844
@section Packages and Visibility Rules
 
845
@c  -------------------------------------------------------------------------
 
846
@cindex Packages
 
847
 
 
848
@itemize @bullet
 
849
@item
 
850
All program units and subprograms have their name at the end:
 
851
 
 
852
@smallexample @c adanocomment
 
853
@group
 
854
      package P is
 
855
         ...
 
856
      end P;
 
857
@end group
 
858
@end smallexample
 
859
 
 
860
@item
 
861
We will use the style of @code{use}-ing @code{with}-ed packages, with
 
862
the context clauses looking like:
 
863
@cindex @code{use} clauses
 
864
 
 
865
@smallexample @c adanocomment
 
866
@group
 
867
      with A; use A;
 
868
      with B; use B;
 
869
@end group
 
870
@end smallexample
 
871
 
 
872
@item
 
873
Names declared in the visible part of packages should be
 
874
unique, to prevent name clashes when the packages are @code{use}d.
 
875
@cindex Name clash avoidance
 
876
 
 
877
@smallexample @c adanocomment
 
878
@group
 
879
      package Entity is
 
880
         type Entity_Kind is ...;
 
881
         ...
 
882
      end Entity;
 
883
@end group
 
884
@end smallexample
 
885
 
 
886
@item
 
887
After the file header comment, the context clause and unit specification
 
888
should be the first thing in a @syntax{program_unit}.
 
889
 
 
890
@item
 
891
Preelaborate, Pure and Elaborate_Body pragmas should be added right after the
 
892
package name, indented an extra level and using the parameterless form:
 
893
 
 
894
@smallexample @c adanocomment
 
895
@group
 
896
      package Preelaborate_Package is
 
897
         pragma Preelaborate;
 
898
         ...
 
899
      end Preelaborate_Package;
 
900
@end group
 
901
@end smallexample
 
902
 
 
903
@end itemize
 
904
 
 
905
@c  -------------------------------------------------------------------------
 
906
@node    Program Structure, GNU Free Documentation License, Packages, Top
 
907
@section Program Structure and Compilation Issues
 
908
@c  -------------------------------------------------------------------------
 
909
@cindex Program structure
 
910
 
 
911
@itemize @bullet
 
912
@item
 
913
Every GNAT source file must be compiled with the @option{-gnatg}
 
914
switch to check the coding style.
 
915
(Note that you should look at
 
916
@file{style.adb} to see the lexical rules enforced by
 
917
@option{-gnatg}).
 
918
@cindex @option{-gnatg} option (to gcc)
 
919
@cindex @file{style.adb} file
 
920
 
 
921
@item
 
922
Each source file should contain only one compilation unit.
 
923
 
 
924
@item
 
925
Filenames should be 8 or fewer characters, followed by the @code{.adb}
 
926
extension for a body or @code{.ads} for a spec.
 
927
@cindex File name length
 
928
 
 
929
@item
 
930
Unit names should be distinct when ``krunch''ed to 8 characters
 
931
(see @file{krunch.ads}) and the filenames should match the unit name,
 
932
except that they are all lower case.
 
933
@cindex @file{krunch.ads} file
 
934
@end itemize
 
935
 
 
936
 
 
937
@c **********************************
 
938
@c * GNU Free Documentation License *
 
939
@c **********************************
 
940
@node GNU Free Documentation License,Index, Program Structure, Top
 
941
@unnumberedsec GNU Free Documentation License
 
942
@set nodefaultgnufreedocumentationlicensenode
 
943
@include fdl.texi
 
944
@c GNU Free Documentation License
 
945
@cindex GNU Free Documentation License
 
946
 
 
947
@node Index,,GNU Free Documentation License, Top
 
948
@unnumberedsec Index
 
949
 
 
950
@printindex cp
 
951
 
 
952
@contents
 
953
 
 
954
@bye