xref: /vim-8.2.3635/runtime/syntax/ada.vim (revision 6c391a74)
1"----------------------------------------------------------------------------
2"  Description: Vim Ada syntax file
3"     Language: Ada (2005)
4"	   $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
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: krischik $
11"	 $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
12"      Version: 4.6
13"    $Revision: 887 $
14"     $HeadURL: https://gnuada.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
35let s:keepcpo= &cpo
36set cpo&vim
37
38let b:current_syntax = "ada"
39
40" Section: Ada is entirely case-insensitive. {{{1
41"
42syntax   case ignore
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    call rainbow_parenthsis#LoadRound ()
102    call rainbow_parenthsis#Activate ()
103else
104    syntax match	adaSpecial	 "[:;().,]"
105endif
106
107" Section: := {{{1
108"
109" We won't map "adaAssignment" by default, but we need to map ":=" to
110" something or the "=" inside it will be mislabelled as an operator.
111" Note that in Ada, assignment (:=) is not considered an operator.
112"
113syntax match adaAssignment		":="
114
115" Section: Numbers, including floating point, exponents, and alternate bases. {{{1
116"
117syntax match   adaNumber		"\<\d[0-9_]*\(\.\d[0-9_]*\)\=\([Ee][+-]\=\d[0-9_]*\)\=\>"
118syntax match   adaNumber		"\<\d\d\=#\x[0-9A-Fa-f_]*\(\.\x[0-9A-Fa-f_]*\)\=#\([Ee][+-]\=\d[0-9_]*\)\="
119
120" Section: Identify leading numeric signs {{{1
121"
122" In "A-5" the "-" is an operator, " but in "A:=-5" the "-" is a sign. This
123" handles "A3+-5" (etc.) correctly.  " This assumes that if you put a
124" don't put a space after +/- when it's used " as an operator, you won't
125" put a space before it either -- which is true " in code I've seen.
126"
127syntax match adaSign "[[:space:]<>=(,|:;&*/+-][+-]\d"lc=1,hs=s+1,he=e-1,me=e-1
128
129" Section: Labels for the goto statement. {{{1
130"
131syntax region  adaLabel		start="<<"  end=">>"
132
133" Section: Boolean Constants {{{1
134" Boolean Constants.
135syntax keyword adaBoolean	true false
136
137" Section: Warn C/C++ {{{1
138"
139" Warn people who try to use C/C++ notation erroneously:
140"
141syntax match adaError "//"
142syntax match adaError "/\*"
143syntax match adaError "=="
144
145
146" Section: Space Errors {{{1
147"
148if exists("g:ada_space_errors")
149   if !exists("g:ada_no_trail_space_error")
150       syntax match   adaSpaceError	 excludenl "\s\+$"
151   endif
152   if !exists("g:ada_no_tab_space_error")
153      syntax match   adaSpaceError	 " \+\t"me=e-1
154   endif
155   if !exists("g:ada_all_tab_usage")
156      syntax match   adaSpecial	 "\t"
157   endif
158endif
159
160" Section: end {{{1
161" Unless special ("end loop", "end if", etc.), "end" marks the end of a
162" begin, package, task etc. Assigning it to adaEnd.
163syntax match    adaEnd	/\<end\>/
164
165syntax keyword  adaPreproc		 pragma
166
167syntax keyword  adaRepeat	 exit for loop reverse while
168syntax match    adaRepeat		   "\<end\s\+loop\>"
169
170syntax keyword  adaStatement accept delay goto raise requeue return
171syntax keyword  adaStatement terminate
172syntax match    adaStatement  "\<abort\>"
173
174" Section: Handle Ada's record keywords. {{{1
175"
176" 'record' usually starts a structure, but "with null record;" does not,
177" and 'end record;' ends a structure.  The ordering here is critical -
178" 'record;' matches a "with null record", so make it a keyword (this can
179" match when the 'with' or 'null' is on a previous line).
180" We see the "end" in "end record" before the word record, so we match that
181" pattern as adaStructure (and it won't match the "record;" pattern).
182"
183syntax match adaStructure   "\<record\>"	contains=adaRecord
184syntax match adaStructure   "\<end\s\+record\>"	contains=adaRecord
185syntax match adaKeyword	    "\<record;"me=e-1
186
187" Section: type classes {{{1
188"
189syntax keyword adaStorageClass	abstract access aliased array at constant delta
190syntax keyword adaStorageClass	digits limited of private range tagged
191syntax keyword adaStorageClass	interface synchronized
192syntax keyword adaTypedef	subtype type
193
194" Section: Conditionals {{{1
195"
196" "abort" after "then" is a conditional of its own.
197"
198syntax match    adaConditional  "\<then\>"
199syntax match    adaConditional	"\<then\s\+abort\>"
200syntax match    adaConditional	"\<else\>"
201syntax match    adaConditional	"\<end\s\+if\>"
202syntax match    adaConditional	"\<end\s\+case\>"
203syntax match    adaConditional	"\<end\s\+select\>"
204syntax keyword  adaConditional	if case select
205syntax keyword  adaConditional	elsif when
206
207" Section: other keywords {{{1
208syntax match    adaKeyword	    "\<is\>" contains=adaRecord
209syntax keyword  adaKeyword	    all do exception in new null out
210syntax keyword  adaKeyword	    separate until overriding
211
212" Section: begin keywords {{{1
213"
214" These keywords begin various constructs, and you _might_ want to
215" highlight them differently.
216"
217syntax keyword  adaBegin	begin body declare entry generic
218syntax keyword  adaBegin	protected renames task
219
220syntax match    adaBegin	"\<function\>" contains=adaFunction
221syntax match    adaBegin	"\<procedure\>" contains=adaProcedure
222syntax match    adaBegin	"\<package\>" contains=adaPackage
223
224if exists("ada_with_gnat_project_files")
225   syntax keyword adaBegin	project
226endif
227
228" Section: with, use {{{1
229"
230if exists("ada_withuse_ordinary")
231   " Don't be fancy. Display "with" and "use" as ordinary keywords in all cases.
232   syntax keyword adaKeyword		with use
233else
234   " Highlight "with" and "use" clauses like C's "#include" when they're used
235   " to reference other compilation units; otherwise they're ordinary keywords.
236   " If we have vim 6.0 or later, we'll use its advanced pattern-matching
237   " capabilities so that we won't match leading spaces.
238   syntax match adaKeyword	"\<with\>"
239   syntax match adaKeyword	"\<use\>"
240   syntax match adaBeginWith	"^\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
241   syntax match adaSemiWith	";\s*\zs\(\(with\(\s\+type\)\=\)\|\(use\)\)\>" contains=adaInc
242   syntax match adaInc		"\<with\>" contained contains=NONE
243   syntax match adaInc		"\<with\s\+type\>" contained contains=NONE
244   syntax match adaInc		"\<use\>" contained contains=NONE
245   " Recognize "with null record" as a keyword (even the "record").
246   syntax match adaKeyword	"\<with\s\+null\s\+record\>"
247   " Consider generic formal parameters of subprograms and packages as keywords.
248   syntax match adaKeyword	";\s*\zswith\s\+\(function\|procedure\|package\)\>"
249   syntax match adaKeyword	"^\s*\zswith\s\+\(function\|procedure\|package\)\>"
250endif
251
252" Section: String and character constants. {{{1
253"
254syntax region  adaString	contains=@Spell start=+"+ skip=+""+ end=+"+
255syntax match   adaCharacter "'.'"
256
257" Section: Todo (only highlighted in comments) {{{1
258"
259syntax keyword adaTodo contained TODO FIXME XXX NOTE
260
261" Section: Comments. {{{1
262"
263syntax region  adaComment
264    \ oneline
265    \ contains=adaTodo,adaLineError,@Spell
266    \ start="--"
267    \ end="$"
268
269" Section: line errors {{{1
270"
271" Note: Line errors have become quite slow with Vim 7.0
272"
273if exists("g:ada_line_errors")
274    syntax match adaLineError "\(^.\{79}\)\@<=."  contains=ALL containedin=ALL
275endif
276
277" Section: syntax folding {{{1
278"
279"	Syntax folding is very tricky - for now I still suggest to use
280"	indent folding
281"
282if exists("g:ada_folding") && g:ada_folding[0] == 's'
283   if stridx (g:ada_folding, 'p') >= 0
284      syntax region adaPackage
285         \ start="\(\<package\s\+body\>\|\<package\>\)\s*\z(\k*\)"
286         \ end="end\s\+\z1\s*;"
287         \ keepend extend transparent fold contains=ALL
288   endif
289   if stridx (g:ada_folding, 'f') >= 0
290      syntax region adaProcedure
291         \ start="\<procedure\>\s*\z(\k*\)"
292         \ end="\<end\>\s\+\z1\s*;"
293         \ keepend extend transparent fold contains=ALL
294      syntax region adaFunction
295         \ start="\<procedure\>\s*\z(\k*\)"
296         \ end="end\s\+\z1\s*;"
297         \ keepend extend transparent fold contains=ALL
298   endif
299   if stridx (g:ada_folding, 'f') >= 0
300      syntax region adaRecord
301         \ start="\<is\s\+record\>"
302         \ end="\<end\s\+record\>"
303         \ keepend extend transparent fold contains=ALL
304   endif
305endif
306
307" Section: The default methods for highlighting. Can be overridden later. {{{1
308"
309highlight def link adaCharacter	    Character
310highlight def link adaComment	    Comment
311highlight def link adaConditional   Conditional
312highlight def link adaKeyword	    Keyword
313highlight def link adaLabel	    Label
314highlight def link adaNumber	    Number
315highlight def link adaSign	    Number
316highlight def link adaOperator	    Operator
317highlight def link adaPreproc	    PreProc
318highlight def link adaRepeat	    Repeat
319highlight def link adaSpecial	    Special
320highlight def link adaStatement	    Statement
321highlight def link adaString	    String
322highlight def link adaStructure	    Structure
323highlight def link adaTodo	    Todo
324highlight def link adaType	    Type
325highlight def link adaTypedef	    Typedef
326highlight def link adaStorageClass  StorageClass
327highlight def link adaBoolean	    Boolean
328highlight def link adaException	    Exception
329highlight def link adaAttribute	    Tag
330highlight def link adaInc	    Include
331highlight def link adaError	    Error
332highlight def link adaSpaceError    Error
333highlight def link adaLineError	    Error
334highlight def link adaBuiltinType   Type
335highlight def link adaAssignment    Special
336
337" Subsection: Begin, End {{{2
338"
339if exists ("ada_begin_preproc")
340   " This is the old default display:
341   highlight def link adaBegin   PreProc
342   highlight def link adaEnd     PreProc
343else
344   " This is the new default display:
345   highlight def link adaBegin   Keyword
346   highlight def link adaEnd     Keyword
347endif
348
349
350
351" Section: sync {{{1
352"
353" We don't need to look backwards to highlight correctly;
354" this speeds things up greatly.
355syntax sync minlines=1 maxlines=1
356
357let &cpo = s:keepcpo
358unlet s:keepcpo
359
360finish " 1}}}
361
362"------------------------------------------------------------------------------
363"   Copyright (C) 2006	Martin Krischik
364"
365"   Vim is Charityware - see ":help license" or uganda.txt for licence details.
366"------------------------------------------------------------------------------
367"vim: textwidth=78 nowrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
368"vim: foldmethod=marker
369