]> git.lizzy.rs Git - rust.git/blob - src/etc/vim/syntax/rust.vim
Removed some unnecessary RefCells from resolve
[rust.git] / src / etc / vim / syntax / rust.vim
1 " Vim syntax file
2 " Language:     Rust
3 " Maintainer:   Patrick Walton <pcwalton@mozilla.com>
4 " Maintainer:   Ben Blum <bblum@cs.cmu.edu>
5 " Maintainer:   Chris Morgan <me@chrismorgan.info>
6 " Last Change:  July 18, 2014
7
8 if version < 600
9   syntax clear
10 elseif exists("b:current_syntax")
11   finish
12 endif
13
14 " Syntax definitions {{{1
15 " Basic keywords {{{2
16 syn keyword   rustConditional match if else
17 syn keyword   rustOperator    as
18
19 syn match     rustAssert      "\<assert\(\w\)*!" contained
20 syn match     rustFail        "\<fail\(\w\)*!" contained
21 syn keyword   rustKeyword     break
22 syn keyword   rustKeyword     box nextgroup=rustBoxPlacement skipwhite skipempty
23 syn keyword   rustKeyword     continue
24 syn keyword   rustKeyword     extern nextgroup=rustExternCrate,rustObsoleteExternMod skipwhite skipempty
25 syn keyword   rustKeyword     fn nextgroup=rustFuncName skipwhite skipempty
26 syn keyword   rustKeyword     for in if impl let
27 syn keyword   rustKeyword     loop once proc pub
28 syn keyword   rustKeyword     return super
29 syn keyword   rustKeyword     unsafe virtual where while
30 syn keyword   rustKeyword     use nextgroup=rustModPath,rustModPathInUse skipwhite skipempty
31 " FIXME: Scoped impl's name is also fallen in this category
32 syn keyword   rustKeyword     mod trait struct enum type nextgroup=rustIdentifier skipwhite skipempty
33 syn keyword   rustStorage     mut ref static const
34
35 syn keyword   rustInvalidBareKeyword crate
36
37 syn keyword   rustExternCrate crate contained nextgroup=rustIdentifier skipwhite skipempty
38 syn keyword   rustObsoleteExternMod mod contained nextgroup=rustIdentifier skipwhite skipempty
39
40 syn match     rustIdentifier  contains=rustIdentifierPrime "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
41 syn match     rustFuncName    "\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*" display contained
42
43 syn region    rustBoxPlacement matchgroup=rustBoxPlacementParens start="(" end=")" contains=TOP contained
44 syn keyword   rustBoxPlacementExpr GC containedin=rustBoxPlacement
45 " Ideally we'd have syntax rules set up to match arbitrary expressions. Since
46 " we don't, we'll just define temporary contained rules to handle balancing
47 " delimiters.
48 syn region    rustBoxPlacementBalance start="(" end=")" containedin=rustBoxPlacement transparent
49 syn region    rustBoxPlacementBalance start="\[" end="\]" containedin=rustBoxPlacement transparent
50 " {} are handled by rustFoldBraces
51
52 syn region rustMacroRepeat matchgroup=rustMacroRepeatDelimiters start="$(" end=")" contains=TOP nextgroup=rustMacroRepeatCount
53 syn match rustMacroRepeatCount ".\?[*+]" contained
54 syn match rustMacroVariable "$\w\+"
55
56 " Reserved (but not yet used) keywords {{{2
57 syn keyword   rustReservedKeyword alignof be do offsetof priv pure sizeof typeof unsized yield
58
59 " Built-in types {{{2
60 syn keyword   rustType        int uint float char bool u8 u16 u32 u64 f32
61 syn keyword   rustType        f64 i8 i16 i32 i64 str Self
62
63 " Things from the prelude (src/libstd/prelude.rs) {{{2
64 " This section is just straight transformation of the contents of the prelude,
65 " to make it easy to update.
66
67 " Core operators {{{3
68 syn keyword   rustTrait       Copy Send Sized Sync
69 syn keyword   rustTrait       Add Sub Mul Div Rem Neg Not
70 syn keyword   rustTrait       BitAnd BitOr BitXor
71 syn keyword   rustTrait       Drop Deref DerefMut
72 syn keyword   rustTrait       Shl Shr Index IndexMut
73 syn keyword   rustEnum        Option
74 syn keyword   rustEnumVariant Some None
75 syn keyword   rustEnum        Result
76 syn keyword   rustEnumVariant Ok Err
77
78 " Functions {{{3
79 "syn keyword rustFunction from_str
80 "syn keyword rustFunction range
81 "syn keyword rustFunction drop
82
83 " Types and traits {{{3
84 syn keyword rustTrait Ascii AsciiCast OwnedAsciiCast AsciiStr
85 syn keyword rustTrait IntoBytes
86 syn keyword rustTrait ToCStr
87 syn keyword rustTrait Char UnicodeChar
88 syn keyword rustTrait Clone
89 syn keyword rustTrait PartialEq PartialOrd Eq Ord Equiv
90 syn keyword rustEnum Ordering
91 syn keyword rustEnumVariant Less Equal Greater
92 syn keyword rustTrait Collection Mutable Map MutableMap MutableSeq
93 syn keyword rustTrait Set MutableSet
94 syn keyword rustTrait FromIterator Extendable ExactSize
95 syn keyword rustTrait Iterator DoubleEndedIterator
96 syn keyword rustTrait RandomAccessIterator CloneableIterator
97 syn keyword rustTrait OrdIterator MutableDoubleEndedIterator
98 syn keyword rustTrait Num NumCast CheckedAdd CheckedSub CheckedMul CheckedDiv
99 syn keyword rustTrait Signed Unsigned Primitive Int Float
100 syn keyword rustTrait FloatMath ToPrimitive FromPrimitive
101 syn keyword rustTrait Box
102 syn keyword rustTrait GenericPath Path PosixPath WindowsPath
103 syn keyword rustTrait RawPtr
104 syn keyword rustTrait Buffer Writer Reader Seek
105 syn keyword rustTrait Str StrVector StrSlice
106 syn keyword rustTrait IntoMaybeOwned StrAllocating UnicodeStrSlice
107 syn keyword rustTrait ToString IntoStr
108 syn keyword rustTrait Tuple1 Tuple2 Tuple3 Tuple4
109 syn keyword rustTrait Tuple5 Tuple6 Tuple7 Tuple8
110 syn keyword rustTrait Tuple9 Tuple10 Tuple11 Tuple12
111 syn keyword rustTrait CloneableVector ImmutableCloneableVector
112 syn keyword rustTrait MutableCloneableSlice MutableOrdSlice
113 syn keyword rustTrait ImmutableSlice MutableSlice
114 syn keyword rustTrait ImmutablePartialEqSlice ImmutableOrdSlice
115 syn keyword rustTrait Slice VectorVector
116 syn keyword rustTrait MutableSliceAllocating
117 syn keyword rustTrait String
118 syn keyword rustTrait Vec
119
120 "syn keyword rustFunction sync_channel channel
121 syn keyword rustTrait SyncSender Sender Receiver
122 "syn keyword rustFunction spawn
123
124 "syn keyword rustConstant GC
125
126 syn keyword   rustSelf        self
127 syn keyword   rustBoolean     true false
128
129 " Other syntax {{{2
130
131 " If foo::bar changes to foo.bar, change this ("::" to "\.").
132 " If foo::bar changes to Foo::bar, change this (first "\w" to "\u").
133 syn match     rustModPath     "\w\(\w\)*::[^<]"he=e-3,me=e-3
134 syn match     rustModPathInUse "\w\(\w\)*" contained " only for 'use path;'
135 syn match     rustModPathSep  "::"
136 " rustModPathInUse is split out from rustModPath so that :syn-include can get the group list right.
137
138 syn match     rustFuncCall    "\w\(\w\)*("he=e-1,me=e-1
139 syn match     rustFuncCall    "\w\(\w\)*::<"he=e-3,me=e-3 " foo::<T>();
140
141 " This is merely a convention; note also the use of [A-Z], restricting it to
142 " latin identifiers rather than the full Unicode uppercase. I have not used
143 " [:upper:] as it depends upon 'noignorecase'
144 "syn match     rustCapsIdent    display "[A-Z]\w\(\w\)*"
145
146 syn match     rustOperator     display "\%(+\|-\|/\|*\|=\|\^\|&\||\|!\|>\|<\|%\)=\?"
147 " This one isn't *quite* right, as we could have binary-& with a reference
148 syn match     rustSigil        display /&\s\+[&~@*][^)= \t\r\n]/he=e-1,me=e-1
149 syn match     rustSigil        display /[&~@*][^)= \t\r\n]/he=e-1,me=e-1
150 " This isn't actually correct; a closure with no arguments can be `|| { }`.
151 " Last, because the & in && isn't a sigil
152 syn match     rustOperator     display "&&\|||"
153
154 syn match     rustMacro       '\w\(\w\)*!' contains=rustAssert,rustFail
155 syn match     rustMacro       '#\w\(\w\)*' contains=rustAssert,rustFail
156
157 syn match     rustEscapeError   display contained /\\./
158 syn match     rustEscape        display contained /\\\([nrt0\\'"]\|x\x\{2}\)/
159 syn match     rustEscapeUnicode display contained /\\\(u\x\{4}\|U\x\{8}\)/
160 syn match     rustStringContinuation display contained /\\\n\s*/
161 syn region    rustString      start=+b"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeError,rustStringContinuation
162 syn region    rustString      start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustStringContinuation,@Spell
163 syn region    rustString      start='b\?r\z(#*\)"' end='"\z1' contains=@Spell
164
165 syn region    rustAttribute   start="#!\?\[" end="\]" contains=rustString,rustDeriving
166 syn region    rustDeriving    start="deriving(" end=")" contained contains=rustTrait
167
168 " Number literals
169 syn match     rustDecNumber   display "\<[0-9][0-9_]*\%([iu]\%(8\|16\|32\|64\)\=\)\="
170 syn match     rustHexNumber   display "\<0x[a-fA-F0-9_]\+\%([iu]\%(8\|16\|32\|64\)\=\)\="
171 syn match     rustOctNumber   display "\<0o[0-7_]\+\%([iu]\%(8\|16\|32\|64\)\=\)\="
172 syn match     rustBinNumber   display "\<0b[01_]\+\%([iu]\%(8\|16\|32\|64\)\=\)\="
173
174 " Special case for numbers of the form "1." which are float literals, unless followed by
175 " an identifier, which makes them integer literals with a method call or field access.
176 " (This must go first so the others take precedence.)
177 syn match     rustFloat       display "\<[0-9][0-9_]*\.\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\@!"
178 " To mark a number as a normal float, it must have at least one of the three things integral values don't have:
179 " a decimal point and more numbers; an exponent; and a type suffix.
180 syn match     rustFloat       display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\="
181 syn match     rustFloat       display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\="
182 syn match     rustFloat       display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"
183
184 " For the benefit of delimitMate
185 syn region rustLifetimeCandidate display start=/&'\%(\([^'\\]\|\\\(['nrt0\\\"]\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'\)\@!/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
186 syn region rustGenericRegion display start=/<\%('\|[^[cntrl:][:space:][:punct:]]\)\@=')\S\@=/ end=/>/ contains=rustGenericLifetimeCandidate
187 syn region rustGenericLifetimeCandidate display start=/\%(<\|,\s*\)\@<='/ end=/[[:cntrl:][:space:][:punct:]]\@=\|$/ contains=rustSigil,rustLifetime
188
189 "rustLifetime must appear before rustCharacter, or chars will get the lifetime highlighting
190 syn match     rustLifetime    display "\'\%([^[:cntrl:][:space:][:punct:][:digit:]]\|_\)\%([^[:cntrl:][:punct:][:space:]]\|_\)*"
191 syn match   rustCharacterInvalid   display contained /b\?'\zs[\n\r\t']\ze'/
192 " The groups negated here add up to 0-255 but nothing else (they do not seem to go beyond ASCII).
193 syn match   rustCharacterInvalidUnicode   display contained /b'\zs[^[:cntrl:][:graph:][:alnum:][:space:]]\ze'/
194 syn match   rustCharacter   /b'\([^\\]\|\\\(.\|x\x\{2}\)\)'/ contains=rustEscape,rustEscapeError,rustCharacterInvalid,rustCharacterInvalidUnicode
195 syn match   rustCharacter   /'\([^\\]\|\\\(.\|x\x\{2}\|u\x\{4}\|U\x\{8}\)\)'/ contains=rustEscape,rustEscapeUnicode,rustEscapeError,rustCharacterInvalid
196
197 syn region rustCommentLine                                        start="//"                      end="$"   contains=rustTodo,@Spell
198 syn region rustCommentLineDoc                                     start="//\%(//\@!\|!\)"         end="$"   contains=rustTodo,@Spell
199 syn region rustCommentBlock    matchgroup=rustCommentBlock        start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell
200 syn region rustCommentBlockDoc matchgroup=rustCommentBlockDoc     start="/\*\%(!\|\*[*/]\@!\)"    end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell
201 syn region rustCommentBlockNest matchgroup=rustCommentBlock       start="/\*"                     end="\*/" contains=rustTodo,rustCommentBlockNest,@Spell contained transparent
202 syn region rustCommentBlockDocNest matchgroup=rustCommentBlockDoc start="/\*"                     end="\*/" contains=rustTodo,rustCommentBlockDocNest,@Spell contained transparent
203 " FIXME: this is a really ugly and not fully correct implementation. Most
204 " importantly, a case like ``/* */*`` should have the final ``*`` not being in
205 " a comment, but in practice at present it leaves comments open two levels
206 " deep. But as long as you stay away from that particular case, I *believe*
207 " the highlighting is correct. Due to the way Vim's syntax engine works
208 " (greedy for start matches, unlike Rust's tokeniser which is searching for
209 " the earliest-starting match, start or end), I believe this cannot be solved.
210 " Oh you who would fix it, don't bother with things like duplicating the Block
211 " rules and putting ``\*\@<!`` at the start of them; it makes it worse, as
212 " then you must deal with cases like ``/*/**/*/``. And don't try making it
213 " worse with ``\%(/\@<!\*\)\@<!``, either...
214
215 syn keyword rustTodo contained TODO FIXME XXX NB NOTE
216
217 " Folding rules {{{2
218 " Trivial folding rules to begin with.
219 " TODO: use the AST to make really good folding
220 syn region rustFoldBraces start="{" end="}" transparent fold
221
222 " Default highlighting {{{1
223 hi def link rustDecNumber       rustNumber
224 hi def link rustHexNumber       rustNumber
225 hi def link rustOctNumber       rustNumber
226 hi def link rustBinNumber       rustNumber
227 hi def link rustIdentifierPrime rustIdentifier
228 hi def link rustTrait           rustType
229
230 hi def link rustMacroRepeatCount   rustMacroRepeatDelimiters
231 hi def link rustMacroRepeatDelimiters   Macro
232 hi def link rustMacroVariable Define
233 hi def link rustSigil         StorageClass
234 hi def link rustEscape        Special
235 hi def link rustEscapeUnicode rustEscape
236 hi def link rustEscapeError   Error
237 hi def link rustStringContinuation Special
238 hi def link rustString        String
239 hi def link rustCharacterInvalid Error
240 hi def link rustCharacterInvalidUnicode rustCharacterInvalid
241 hi def link rustCharacter     Character
242 hi def link rustNumber        Number
243 hi def link rustBoolean       Boolean
244 hi def link rustEnum          rustType
245 hi def link rustEnumVariant   rustConstant
246 hi def link rustConstant      Constant
247 hi def link rustSelf          Constant
248 hi def link rustFloat         Float
249 hi def link rustOperator      Operator
250 hi def link rustKeyword       Keyword
251 hi def link rustReservedKeyword Error
252 hi def link rustConditional   Conditional
253 hi def link rustIdentifier    Identifier
254 hi def link rustCapsIdent     rustIdentifier
255 hi def link rustModPathInUse  rustModPath
256 hi def link rustModPath       Include
257 hi def link rustModPathSep    Delimiter
258 hi def link rustFunction      Function
259 hi def link rustFuncName      Function
260 hi def link rustFuncCall      Function
261 hi def link rustCommentLine   Comment
262 hi def link rustCommentLineDoc SpecialComment
263 hi def link rustCommentBlock  rustCommentLine
264 hi def link rustCommentBlockDoc rustCommentLineDoc
265 hi def link rustAssert        PreCondit
266 hi def link rustFail          PreCondit
267 hi def link rustMacro         Macro
268 hi def link rustType          Type
269 hi def link rustTodo          Todo
270 hi def link rustAttribute     PreProc
271 hi def link rustDeriving      PreProc
272 hi def link rustStorage       StorageClass
273 hi def link rustObsoleteStorage Error
274 hi def link rustLifetime      Special
275 hi def link rustInvalidBareKeyword Error
276 hi def link rustExternCrate   rustKeyword
277 hi def link rustObsoleteExternMod Error
278 hi def link rustBoxPlacementParens Delimiter
279 hi def link rustBoxPlacementExpr rustKeyword
280
281 " Other Suggestions:
282 " hi rustAttribute ctermfg=cyan
283 " hi rustDeriving ctermfg=cyan
284 " hi rustAssert ctermfg=yellow
285 " hi rustFail ctermfg=red
286 " hi rustMacro ctermfg=magenta
287
288 syn sync minlines=200
289 syn sync maxlines=500
290
291 let b:current_syntax = "rust"