annotate gcc/ada/gnat-style.texi @ 131:84e7813d76e9

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