xref: /vim-8.2.3635/runtime/syntax/ada.vim (revision 044b68f4)
1"----------------------------------------------------------------------------
2"  Description: Vim Ada syntax file
3"     Language: Ada (2005)
4"	   $Id$
5"    Copyright: Copyright (C) 2006 Martin Krischik
6"   Maintainer: Martin Krischik
7"		David A. Wheeler <[email protected]>
8"		Simon Bradley <[email protected]>
9" Contributors: Preben Randhol.
10"      $Author$
11"	 $Date$
12"      Version: 4.2
13"    $Revision$
14"     $HeadURL: https://svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/syntax/ada.vim $
15"		http://www.dwheeler.com/vim
16"      History: 24.05.2006 MK Unified Headers
17"		26.05.2006 MK ' should not be in iskeyword.
18"		16.07.2006 MK Ada-Mode as vim-ball
19"		02.10.2006 MK Better folding.
20"		15.10.2006 MK Bram's suggestion for runtime integration
21"		05.11.2006 MK Spell check for comments and strings only
22"		05.11.2006 MK Bram suggested to save on spaces
23"    Help Page: help ft-ada-syntax
24"------------------------------------------------------------------------------
25" The formal spec of Ada 2005 (ARM) is the "Ada 2005 Reference Manual".
26" For more Ada 2005 info, see http://www.gnuada.org and http://www.adapower.com.
27"
28" This vim syntax file works on vim 7.0 only and makes use of most of Voim 7.0
29" advanced features.
30"------------------------------------------------------------------------------
31
32if exists("b:current_syntax") || version < 700
33    finish
34endif
35
36let b:current_syntax = "ada"
37
38" Section: Ada is entirely case-insensitive. {{{1
39"
40syntax   case ignore
41setlocal nosmartcase
42setlocal ignorecase
43
44" Section: Highlighting commands {{{1
45"
46" There are 72 reserved words in total in Ada2005. Some keywords are
47" used in more than one way. For example:
48" 1. "end" is a general keyword, but "end if" ends a Conditional.
49" 2. "then" is a conditional, but "and then" is an operator.
50"
51for b:Item in g:ada#Keywords
52   " Standard Exceptions (including I/O).
53   " We'll highlight the standard exceptions, similar to vim's Python mode.
54   " It's possible to redefine the standard exceptions as something else,
55   " but doing so is very bad practice, so simply highlighting them makes sense.
56   if b:Item['kind'] == "x"
57      execute "syntax keyword adaException " . b:Item['word']
58   endif
59   if b:Item['kind'] == "a"
60      execute 'syntax match adaAttribute "\V' . b:Item['word'] . '"'
61   endif
62   " We don't normally highlight types in package Standard
63   " (Integer, Character, Float, etc.).  I don't think it looks good
64   " with the other type keywords, and many Ada programs define
65   " so many of their own types that it looks inconsistent.
66   " However, if you want this highlighting, turn on "ada_standard_types".
67   " For package Standard's definition, see ARM section A.1.
68   if b:Item['kind'] == "t" && exists ("g:ada_standard_types")
69      execute "syntax keyword adaBuiltinType " . b:Item['word']
70   endif
71endfor
72
73" Section: others {{{1
74"
75syntax keyword  adaLabel	others
76
77" Section: Operatoren {{{1
78"
79syntax keyword  adaOperator abs mod not rem xor
80syntax match    adaOperator "\<and\>"
81syntax match    adaOperator "\<and\s\+then\>"
82syntax match    adaOperator "\<or\>"
83syntax match    adaOperator "\<or\s\+else\>"
84syntax match    adaOperator "[-+*/<>&]"
85syntax keyword  adaOperator **
86syntax match    adaOperator "[/<>]="
87syntax keyword  adaOperator =>
88syntax match    adaOperator "\.\."
89syntax match    adaOperator "="
90
91" Section: <> {{{1
92"
93" Handle the box, <>, specially:
94"
95syntax keyword  adaSpecial	    <>
96
97" Section: rainbow color {{{1
98"
99if exists("g:ada_rainbow_color")
100    syntax match	adaSpecial	 "[:;.,]"
101    runtime plugin/Rainbow_Parenthsis.vim
102else
103    syntax match	adaSpecial	 "[:;().,]"
104endif
105
106" Section: := {{{1
107"
108" We won't map "adaAssignment" by default, but we need to map ":=" to
109" something or the "=" inside it will be mislabelled as an operator.
110" Note that in Ada, assignment (:=) is not considered an operator.
111"
112syntax match adaAssignment		":="
113
114" Section: Numbers, including floating point, exponents, and alternate bases. {{{1
115"
116syntax match   adaNumber		"\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>"
117syntax match   adaNumber		"\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\="
118
119" Section: Identify leading numeric signs {{{1
120"
121" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This
122" handles "A3+-5" (etc.) correctly.  " This assumes that if you put a
123" don't put a space after +/- when it's used " as an operator, you won't
124" put a space before it either -- which is true " in code I've seen.
125"
126syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1
127
128" Section: Labels for the goto statement. {{{1
129"
130syntax region  adaLabel		start="<<"  end=">>"
131
132" Section: Boolean Constants {{{1
133" Boolean Constants.
134syntax keyword adaBoolean	true false
135
136" Section: Warn C/C++ {{{1
137"
138" Warn people who try to use C/C++ notation erroneously:
139"
140syntax match adaError "//"
141syntax match adaError "/\*"
142syntax match adaError "=="
143
144
145" Section: Space Errors {{{1
146"
147if exists("g:ada_space_errors")
148   if !exists("g:ada_no_trail_space_error")
149       syntax match   adaSpaceError	 excludenl "\s\+$"
150   endif
151   if !exists("g:ada_no_tab_space_error")
152      syntax match   adaSpaceError	 " \+\t"me=e-1
153   endif
154   if !exists("g:ada_all_tab_usage")
155      syntax match   adaSpecial	 "\t"
156   endif
157endif
158
159" Section: end {{{1
160" Unless special ("end loop", "end if", etc.), "end" marks the end of a
161" begin, package, task etc. Assiging it to adaEnd.
162syntax match    adaEnd	"\<end\>"
163
164syntax keyword  adaPreproc		 pragma
165
166syntax keyword  adaRepeat	 exit for loop reverse while
167syntax match    adaRepeat		   "\<end\s\+loop\>"
168
169syntax keyword  adaStatement accept delay goto raise requeue return
170syntax keyword  adaStatement terminate
171syntax match    adaStatement  "\<abort\>"
172
173" Section: Handle Ada's record keywords. {{{1
174"
175" 'record' usually starts a structure, but "with null record;" does not,
176" and 'end record;' ends a structure.  The ordering here is critical -
177" 'record;' matches a "with null record", so make it a keyword (this can
178" match when the 'with' or 'null' is on a previous line).
179" We see the "end" in "end record" before the word record, so we match that
180" pattern as adaStructure (and it won't match the "record;" pattern).
181"
182syntax match adaStructure   "\<record\>"	contains=adaRecord
183syntax match adaStructure   "\<end\s\+record\>"	contains=adaRecord
184syntax match adaKeyword	    "\<record;"me=e-1
185
186" Section: type classes {{{1
187"
188syntax keyword adaStorageClass	abstract access aliased array at constant delta
189syntax keyword adaStorageClass	digits limited of private range tagged
190syntax keyword adaStorageClass	interface synchronized
191syntax keyword adaTypedef	subtype type
192
193" Section: Conditionals {{{1
194"
195" "abort" after "then" is a conditional of its own.
196"
197syntax match    adaConditional  "\<then\>"
198syntax match    adaConditional	"\<then\s\+abort\>"
199syntax match    adaConditional	"\<else\>"
200syntax match    adaConditional	"\<end\s\+if\>"
201syntax match    adaConditional	"\<end\s\+case\>"
202syntax match    adaConditional	"\<end\s\+select\>"
203syntax keyword  adaConditional	if case select
204syntax keyword  adaConditional	elsif when
205
206" Section: other keywords {{{1
207syntax match    adaKeyword	    "\<is\>" contains=adaRecord
208syntax keyword  adaKeyword	    all do exception in new null out
209syntax keyword  adaKeyword	    separate until overriding
210
211" Section: begin keywords {{{1
212"
213" These keywords begin various constructs, and you _might_ want to
214" highlight them differently.
215"
216syntax keyword  adaBegin	begin body declare entry generic
217syntax keyword  adaBegin	protected renames task
218
219syntax match    adaBegin	"\<function\>" contains=adaFunction
220syntax match    adaBegin	"\<procedure\>" contains=adaProcedure
221syntax match    adaBegin	"\<package\>" contains=adaPackage
222
223if exists("ada_with_gnat_project_files")
224   syntax keyword adaBegin	project
225endif
226
227" Section: with, use {{{1
228"
229if exists("ada_withuse_ordinary")
230   " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases.
231   syntax keyword adaKeyword		with use
232else
233   " Highlight "with" and "use" clauses like C's "#include" when they're used
234   " to reference other compilation units; otherwise they're ordinary keywords.
235   " If we have vim 6.0 or later, we'll use its advanced pattern-matching
236   " capabilities so that we won't match leading spaces.
237   syntax match adaKeyword	"\<with\>"
238   syntax match adaKeyword	"\<use\>"
239   syntax match adaBeginWith	"^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
240   syntax match adaSemiWith	";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
241   syntax match adaInc		"\<with\>" contained contains=NONE
242   syntax match adaInc		"\<with\s\+type\>" contained contains=NONE
243   syntax match adaInc		"\<use\>" contained contains=NONE
244   " Recognize "with null record" as a keyword (even the "record").
245   syntax match adaKeyword	"\<with\s\+null\s\+record\>"
246   " Consider generic formal parameters of subprograms and packages as keywords.
247   syntax match adaKeyword	";\s*\zswith\s\+\(function\|procedure\|package\)\>"
248   syntax match adaKeyword	"^\s*\zswith\s\+\(function\|procedure\|package\)\>"
249endif
250
251" Section: String and character constants. {{{1
252"
253syntax region  adaString	contains=@Spell start=+"+ skip=+""+ end=+"+
254syntax match   adaCharacter "'.'"
255
256" Section: Todo (only highlighted in comments) {{{1
257"
258syntax keyword adaTodo contained TODO FIXME XXX NOTE
259
260" Section: Comments. {{{1
261"
262syntax region  adaComment
263    \ oneline
264    \ contains=adaTodo,adaLineError,@Spell
265    \ start="--"
266    \ end="$"
267
268" Section: line errors {{{1
269"
270" Note: Line errors have become quite slow with Vim 7.0
271"
272if exists("g:ada_line_errors")
273    syntax match adaLineError "\(^.\{79}\)\@<=."  contains=ALL containedin=ALL
274endif
275
276" Section: syntax folding {{{1
277"
278"	Syntax folding is very tricky - for now I still suggest to use
279"	indent folding
280"
281if exists("g:ada_folding") && g:ada_folding[0] == 's'
282   if stridx (g:ada_folding, 'p') >= 0
283      syntax region adaPackage
284         \ start="\(\<package\s\+body\>\|\<package\>\)\s*\z(\k*\)"
285         \ end="end\s\+\z1\s*;"
286         \ keepend extend transparent fold contains=ALL
287   endif
288   if stridx (g:ada_folding, 'f') >= 0
289      syntax region adaProcedure
290         \ start="\<procedure\>\s*\z(\k*\)"
291         \ end="\<end\>\s\+\z1\s*;"
292         \ keepend extend transparent fold contains=ALL
293      syntax region adaFunction
294         \ start="\<procedure\>\s*\z(\k*\)"
295         \ end="end\s\+\z1\s*;"
296         \ keepend extend transparent fold contains=ALL
297   endif
298   if stridx (g:ada_folding, 'f') >= 0
299      syntax region adaRecord
300         \ start="\<is\s\+record\>"
301         \ end="\<end\s\+record\>"
302         \ keepend extend transparent fold contains=ALL
303   endif
304endif
305
306" Section: The default methods for highlighting. Can be overridden later. {{{1
307"
308highlight def link adaCharacter	    Character
309highlight def link adaComment	    Comment
310highlight def link adaConditional   Conditional
311highlight def link adaKeyword	    Keyword
312highlight def link adaLabel	    Label
313highlight def link adaNumber	    Number
314highlight def link adaSign	    Number
315highlight def link adaOperator	    Operator
316highlight def link adaPreproc	    PreProc
317highlight def link adaRepeat	    Repeat
318highlight def link adaSpecial	    Special
319highlight def link adaStatement	    Statement
320highlight def link adaString	    String
321highlight def link adaStructure	    Structure
322highlight def link adaTodo	    Todo
323highlight def link adaType	    Type
324highlight def link adaTypedef	    Typedef
325highlight def link adaStorageClass  StorageClass
326highlight def link adaBoolean	    Boolean
327highlight def link adaException	    Exception
328highlight def link adaAttribute	    Tag
329highlight def link adaInc	    Include
330highlight def link adaError	    Error
331highlight def link adaSpaceError    Error
332highlight def link adaLineError	    Error
333highlight def link adaBuiltinType   Type
334highlight def link adaAssignment    Special
335
336" Subsection: Begin, End {{{2
337"
338if exists ("ada_begin_preproc")
339   " This is the old default display:
340   highlight def link adaBegin   PreProc
341   highlight def link adaEnd     PreProc
342else
343   " This is the new default display:
344   highlight def link adaBegin   Keyword
345   highlight def link adaEnd     Keyword
346endif
347
348
349" Section: formatoptions {{{1
350"
351setlocal formatoptions+=ron
352
353" Section: sync {{{1
354"
355" We don't need to look backwards to highlight correctly;
356" this speeds things up greatly.
357syntax sync minlines=1 maxlines=1
358
359finish " 1}}}
360
361"------------------------------------------------------------------------------
362"   Copyright (C) 2006	Martin Krischik
363"
364"   Vim is Charityware - see ":help license" or uganda.txt for licence details.
365"------------------------------------------------------------------------------
366"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
367"vim: foldmethod=marker
368