1{
2	"information_for_contributors": [
3		"This file has been converted from https://github.com/zargony/atom-language-rust/blob/master/grammars/rust.cson",
4		"If you want to provide a fix or improvement, please create a pull request against the original repository.",
5		"Once accepted there, we are happy to receive an update request."
6	],
7	"version": "https://github.com/zargony/atom-language-rust/commit/7d59e2ad79fbe5925bd2fd3bd3857bf9f421ff6f",
8	"name": "Rust",
9	"scopeName": "source.rust",
10	"patterns": [
11		{
12			"comment": "Implementation",
13			"begin": "\\b(impl)\\b",
14			"end": "\\{",
15			"beginCaptures": {
16				"1": {
17					"name": "storage.type.rust"
18				}
19			},
20			"patterns": [
21				{
22					"include": "#block_comment"
23				},
24				{
25					"include": "#line_comment"
26				},
27				{
28					"include": "#sigils"
29				},
30				{
31					"include": "#mut"
32				},
33				{
34					"include": "#dyn"
35				},
36				{
37					"include": "#ref_lifetime"
38				},
39				{
40					"include": "#core_types"
41				},
42				{
43					"include": "#core_marker"
44				},
45				{
46					"include": "#core_traits"
47				},
48				{
49					"include": "#std_types"
50				},
51				{
52					"include": "#std_traits"
53				},
54				{
55					"include": "#type_params"
56				},
57				{
58					"include": "#where"
59				},
60				{
61					"name": "storage.type.rust",
62					"match": "\\bfor\\b"
63				},
64				{
65					"include": "#type"
66				}
67			]
68		},
69		{
70			"include": "#block_doc_comment"
71		},
72		{
73			"include": "#block_comment"
74		},
75		{
76			"include": "#line_doc_comment"
77		},
78		{
79			"include": "#line_comment"
80		},
81		{
82			"comment": "Attribute",
83			"name": "meta.attribute.rust",
84			"begin": "#\\!?\\[",
85			"end": "\\]",
86			"patterns": [
87				{
88					"include": "#string_literal"
89				},
90				{
91					"include": "#block_doc_comment"
92				},
93				{
94					"include": "#block_comment"
95				},
96				{
97					"include": "#line_doc_comment"
98				},
99				{
100					"include": "#line_comment"
101				}
102			]
103		},
104		{
105			"comment": "Single-quote string literal (character)",
106			"name": "string.quoted.single.rust",
107			"match": "b?'([^'\\\\]|\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.))'"
108		},
109		{
110			"include": "#string_literal"
111		},
112		{
113			"include": "#raw_string_literal"
114		},
115		{
116			"comment": "Floating point literal (fraction)",
117			"name": "constant.numeric.float.rust",
118			"match": "\\b[0-9][0-9_]*\\.[0-9][0-9_]*([eE][+-]?[0-9_]+)?(f32|f64)?\\b"
119		},
120		{
121			"comment": "Floating point literal (exponent)",
122			"name": "constant.numeric.float.rust",
123			"match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?[eE][+-]?[0-9_]+(f32|f64)?\\b"
124		},
125		{
126			"comment": "Floating point literal (typed)",
127			"name": "constant.numeric.float.rust",
128			"match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?([eE][+-]?[0-9_]+)?(f32|f64)\\b"
129		},
130		{
131			"comment": "Integer literal (decimal)",
132			"name": "constant.numeric.integer.decimal.rust",
133			"match": "\\b[0-9][0-9_]*([ui](8|16|32|64|128|s|size))?\\b"
134		},
135		{
136			"comment": "Integer literal (hexadecimal)",
137			"name": "constant.numeric.integer.hexadecimal.rust",
138			"match": "\\b0x[a-fA-F0-9_]+([ui](8|16|32|64|128|s|size))?\\b"
139		},
140		{
141			"comment": "Integer literal (octal)",
142			"name": "constant.numeric.integer.octal.rust",
143			"match": "\\b0o[0-7_]+([ui](8|16|32|64|128|s|size))?\\b"
144		},
145		{
146			"comment": "Integer literal (binary)",
147			"name": "constant.numeric.integer.binary.rust",
148			"match": "\\b0b[01_]+([ui](8|16|32|64|128|s|size))?\\b"
149		},
150		{
151			"comment": "Static storage modifier",
152			"name": "storage.modifier.static.rust",
153			"match": "\\bstatic\\b"
154		},
155		{
156			"comment": "Boolean constant",
157			"name": "constant.language.boolean.rust",
158			"match": "\\b(true|false)\\b"
159		},
160		{
161			"comment": "Control keyword",
162			"name": "keyword.control.rust",
163			"match": "\\b(async|await|break|continue|else|if|in|for|loop|match|return|try|while)\\b"
164		},
165		{
166			"comment": "Keyword",
167			"name": "keyword.other.rust",
168			"match": "\\b(crate|extern|mod|let|ref|use|super|move)\\b"
169		},
170		{
171			"comment": "Reserved keyword",
172			"name": "invalid.deprecated.rust",
173			"match": "\\b(abstract|alignof|become|do|final|macro|offsetof|override|priv|proc|pure|sizeof|typeof|virtual|yield)\\b"
174		},
175		{
176			"include": "#unsafe"
177		},
178		{
179			"include": "#sigils"
180		},
181		{
182			"include": "#self"
183		},
184		{
185			"include": "#mut"
186		},
187		{
188			"include": "#dyn"
189		},
190		{
191			"include": "#impl"
192		},
193		{
194			"include": "#box"
195		},
196		{
197			"include": "#lifetime"
198		},
199		{
200			"include": "#ref_lifetime"
201		},
202		{
203			"include": "#const"
204		},
205		{
206			"include": "#pub"
207		},
208		{
209			"comment": "Miscellaneous operator",
210			"name": "keyword.operator.misc.rust",
211			"match": "(=>|::|\\bas\\b)"
212		},
213		{
214			"comment": "Comparison operator",
215			"name": "keyword.operator.comparison.rust",
216			"match": "(&&|\\|\\||==|!=)"
217		},
218		{
219			"comment": "Assignment operator",
220			"name": "keyword.operator.assignment.rust",
221			"match": "(\\+=|-=|/=|\\*=|%=|\\^=|&=|\\|=|<<=|>>=|=)"
222		},
223		{
224			"comment": "Arithmetic operator",
225			"name": "keyword.operator.arithmetic.rust",
226			"match": "(!|\\+|-|/|\\*|%|\\^|&|\\||<<|>>)"
227		},
228		{
229			"comment": "Comparison operator (second group because of regex precedence)",
230			"name": "keyword.operator.comparison.rust",
231			"match": "(<=|>=|<|>)"
232		},
233		{
234			"include": "#core_types"
235		},
236		{
237			"include": "#core_vars"
238		},
239		{
240			"include": "#core_marker"
241		},
242		{
243			"include": "#core_traits"
244		},
245		{
246			"include": "#std_types"
247		},
248		{
249			"include": "#std_traits"
250		},
251		{
252			"comment": "Built-in macro",
253			"name": "support.function.builtin.rust",
254			"match": "\\b(macro_rules|compile_error|format_args|env|option_env|concat_idents|concat|line|column|file|stringify|include|include_str|include_bytes|module_path|cfg)!"
255		},
256		{
257			"comment": "Core macro",
258			"name": "support.function.core.rust",
259			"match": "\\b(panic|assert|assert_eq|assert_ne|debug_assert|debug_assert_eq|debug_assert_ne|try|write|writeln|unreachable|unimplemented)!"
260		},
261		{
262			"comment": "Standard library macro",
263			"name": "support.function.std.rust",
264			"match": "\\b(format|print|println|eprint|eprintln|select|vec)!"
265		},
266		{
267			"comment": "Logging macro",
268			"name": "support.function.log.rust",
269			"match": "\\b(log|error|warn|info|debug|trace|log_enabled)!"
270		},
271		{
272			"comment": "Invokation of a macro",
273			"match": "\\b([a-zA-Z_][a-zA-Z0-9_]*\\!)\\s*[({\\[]",
274			"captures": {
275				"1": {
276					"name": "entity.name.function.macro.rust"
277				}
278			}
279		},
280		{
281			"comment": "Function call",
282			"match": "\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*\\(",
283			"captures": {
284				"1": {
285					"name": "entity.name.function.rust"
286				}
287			}
288		},
289		{
290			"comment": "Function call with type parameters",
291			"begin": "\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*(::)(?=\\s*<.*>\\s*\\()",
292			"end": "\\(",
293			"captures": {
294				"1": {
295					"name": "entity.name.function.rust"
296				},
297				"2": {
298					"name": "keyword.operator.misc.rust"
299				}
300			},
301			"patterns": [
302				{
303					"include": "#type_params"
304				}
305			]
306		},
307		{
308			"comment": "Function definition",
309			"begin": "\\b(fn)\\s+([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)",
310			"end": "[\\{;]",
311			"beginCaptures": {
312				"1": {
313					"name": "keyword.other.fn.rust"
314				},
315				"2": {
316					"name": "entity.name.function.rust"
317				}
318			},
319			"patterns": [
320				{
321					"include": "#block_comment"
322				},
323				{
324					"include": "#line_comment"
325				},
326				{
327					"include": "#sigils"
328				},
329				{
330					"include": "#self"
331				},
332				{
333					"include": "#mut"
334				},
335				{
336					"include": "#dyn"
337				},
338				{
339					"include": "#impl"
340				},
341				{
342					"include": "#ref_lifetime"
343				},
344				{
345					"include": "#core_types"
346				},
347				{
348					"include": "#core_marker"
349				},
350				{
351					"include": "#core_traits"
352				},
353				{
354					"include": "#std_types"
355				},
356				{
357					"include": "#std_traits"
358				},
359				{
360					"include": "#type_params"
361				},
362				{
363					"include": "#const"
364				},
365				{
366					"include": "#where"
367				},
368				{
369					"include": "#unsafe"
370				},
371				{
372					"comment": "Function arguments",
373					"match": "\bfn\b",
374					"name": "keyword.other.fn.rust"
375				}
376			]
377		},
378		{
379			"comment": "Type declaration",
380			"begin": "\\b(enum|struct|trait|union)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
381			"end": "[\\{\\(;]",
382			"beginCaptures": {
383				"1": {
384					"name": "storage.type.rust"
385				},
386				"2": {
387					"name": "entity.name.type.rust"
388				}
389			},
390			"patterns": [
391				{
392					"include": "#block_comment"
393				},
394				{
395					"include": "#line_comment"
396				},
397				{
398					"include": "#core_traits"
399				},
400				{
401					"include": "#std_traits"
402				},
403				{
404					"include": "#type_params"
405				},
406				{
407					"include": "#core_types"
408				},
409				{
410					"include": "#pub"
411				},
412				{
413					"include": "#where"
414				}
415			]
416		},
417		{
418			"comment": "Type alias",
419			"begin": "\\b(type)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
420			"end": ";",
421			"beginCaptures": {
422				"1": {
423					"name": "storage.type.rust"
424				},
425				"2": {
426					"name": "entity.name.type.rust"
427				}
428			},
429			"patterns": [
430				{
431					"include": "#block_comment"
432				},
433				{
434					"include": "#line_comment"
435				},
436				{
437					"include": "#sigils"
438				},
439				{
440					"include": "#mut"
441				},
442				{
443					"include": "#dyn"
444				},
445				{
446					"include": "#impl"
447				},
448				{
449					"include": "#lifetime"
450				},
451				{
452					"include": "#ref_lifetime"
453				},
454				{
455					"include": "#core_types"
456				},
457				{
458					"include": "#core_marker"
459				},
460				{
461					"include": "#core_traits"
462				},
463				{
464					"include": "#std_types"
465				},
466				{
467					"include": "#std_traits"
468				},
469				{
470					"include": "#type_params"
471				}
472			]
473		}
474	],
475	"repository": {
476		"block_doc_comment": {
477			"comment": "Block documentation comment",
478			"name": "comment.block.documentation.rust",
479			"begin": "/\\*[\\*!](?![\\*/])",
480			"end": "\\*/",
481			"patterns": [
482				{
483					"include": "#block_doc_comment"
484				},
485				{
486					"include": "#block_comment"
487				}
488			]
489		},
490		"block_comment": {
491			"comment": "Block comment",
492			"name": "comment.block.rust",
493			"begin": "/\\*",
494			"end": "\\*/",
495			"patterns": [
496				{
497					"include": "#block_doc_comment"
498				},
499				{
500					"include": "#block_comment"
501				}
502			]
503		},
504		"line_doc_comment": {
505			"comment": "Single-line documentation comment",
506			"name": "comment.line.documentation.rust",
507			"begin": "//[!/](?=[^/])",
508			"end": "$"
509		},
510		"line_comment": {
511			"comment": "Single-line comment",
512			"name": "comment.line.double-slash.rust",
513			"begin": "//",
514			"end": "$"
515		},
516		"escaped_character": {
517			"name": "constant.character.escape.rust",
518			"match": "\\\\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)"
519		},
520		"string_literal": {
521			"comment": "Double-quote string literal",
522			"name": "string.quoted.double.rust",
523			"begin": "b?\"",
524			"end": "\"",
525			"patterns": [
526				{
527					"include": "#escaped_character"
528				}
529			]
530		},
531		"raw_string_literal": {
532			"comment": "Raw double-quote string literal",
533			"name": "string.quoted.double.raw.rust",
534			"begin": "b?r(#*)\"",
535			"end": "\"\\1"
536		},
537		"sigils": {
538			"comment": "Sigil",
539			"name": "keyword.operator.sigil.rust",
540			"match": "[&*](?=[a-zA-Z0-9_\\(\\[\\|\\\"]+)"
541		},
542		"self": {
543			"comment": "Self variable",
544			"name": "variable.language.rust",
545			"match": "\\bself\\b"
546		},
547		"mut": {
548			"comment": "Mutable storage modifier",
549			"name": "storage.modifier.mut.rust",
550			"match": "\\bmut\\b"
551		},
552		"dyn": {
553			"comment": "Dynamic modifier",
554			"name": "storage.modifier.dyn.rust",
555			"match": "\\bdyn\\b"
556		},
557		"impl": {
558			"comment": "Existential type modifier",
559			"name": "storage.modifier.impl.rust",
560			"match": "\\bimpl\\b"
561		},
562		"box": {
563			"comment": "Box storage modifier",
564			"name": "storage.modifier.box.rust",
565			"match": "\\bbox\\b"
566		},
567		"const": {
568			"comment": "Const storage modifier",
569			"name": "storage.modifier.const.rust",
570			"match": "\\bconst\\b"
571		},
572		"pub": {
573			"comment": "Visibility modifier",
574			"name": "storage.modifier.visibility.rust",
575			"match": "\\bpub\\b"
576		},
577		"unsafe": {
578			"comment": "Unsafe code keyword",
579			"name": "keyword.other.unsafe.rust",
580			"match": "\\bunsafe\\b"
581		},
582		"where": {
583			"comment": "Generic where clause",
584			"name": "keyword.other.where.rust",
585			"match": "\\bwhere\\b"
586		},
587		"lifetime": {
588			"comment": "Named lifetime",
589			"name": "storage.modifier.lifetime.rust",
590			"match": "'([a-zA-Z_][a-zA-Z0-9_]*)\\b",
591			"captures": {
592				"1": {
593					"name": "entity.name.lifetime.rust"
594				}
595			}
596		},
597		"ref_lifetime": {
598			"comment": "Reference with named lifetime",
599			"match": "&('([a-zA-Z_][a-zA-Z0-9_]*))\\b",
600			"captures": {
601				"1": {
602					"name": "storage.modifier.lifetime.rust"
603				},
604				"2": {
605					"name": "entity.name.lifetime.rust"
606				}
607			}
608		},
609		"core_types": {
610			"comment": "Built-in/core type",
611			"name": "storage.type.core.rust",
612			"match": "\\b(bool|char|usize|isize|u8|u16|u32|u64|u128|i8|i16|i32|i64|i128|f32|f64|str|Self|Option|Result)\\b"
613		},
614		"core_vars": {
615			"comment": "Core type variant",
616			"name": "support.constant.core.rust",
617			"match": "\\b(Some|None|Ok|Err)\\b"
618		},
619		"core_marker": {
620			"comment": "Core trait (marker)",
621			"name": "support.type.marker.rust",
622			"match": "\\b(Copy|Send|Sized|Sync)\\b"
623		},
624		"core_traits": {
625			"comment": "Core trait",
626			"name": "support.type.core.rust",
627			"match": "\\b(Drop|Fn|FnMut|FnOnce|Clone|PartialEq|PartialOrd|Eq|Ord|AsRef|AsMut|Into|From|Default|Iterator|Extend|IntoIterator|DoubleEndedIterator|ExactSizeIterator)\\b"
628		},
629		"std_types": {
630			"comment": "Standard library type",
631			"name": "storage.class.std.rust",
632			"match": "\\b(Box|String|Vec|Path|PathBuf)\\b"
633		},
634		"std_traits": {
635			"comment": "Standard library trait",
636			"name": "support.type.std.rust",
637			"match": "\\b(ToOwned|ToString)\\b"
638		},
639		"type": {
640			"comment": "A type",
641			"name": "entity.name.type.rust",
642			"match": "\\b([A-Za-z][_A-Za-z0-9]*|_[_A-Za-z0-9]+)\\b"
643		},
644		"type_params": {
645			"comment": "Type parameters",
646			"name": "meta.type_params.rust",
647			"begin": "<(?![=<])",
648			"end": "(?<![-])>",
649			"patterns": [
650				{
651					"include": "#block_comment"
652				},
653				{
654					"include": "#line_comment"
655				},
656				{
657					"include": "#sigils"
658				},
659				{
660					"include": "#mut"
661				},
662				{
663					"include": "#dyn"
664				},
665				{
666					"include": "#impl"
667				},
668				{
669					"include": "#lifetime"
670				},
671				{
672					"include": "#core_types"
673				},
674				{
675					"include": "#core_marker"
676				},
677				{
678					"include": "#core_traits"
679				},
680				{
681					"include": "#std_types"
682				},
683				{
684					"include": "#std_traits"
685				},
686				{
687					"include": "#type_params"
688				}
689			]
690		}
691	}
692}