{
	"information_for_contributors": [
		"This file has been converted from https://github.com/zargony/atom-language-rust/blob/master/grammars/rust.cson",
		"If you want to provide a fix or improvement, please create a pull request against the original repository.",
		"Once accepted there, we are happy to receive an update request."
	],
	"version": "https://github.com/zargony/atom-language-rust/commit/7d59e2ad79fbe5925bd2fd3bd3857bf9f421ff6f",
	"name": "Rust",
	"scopeName": "source.rust",
	"patterns": [
		{
			"comment": "Implementation",
			"begin": "\\b(impl)\\b",
			"end": "\\{",
			"beginCaptures": {
				"1": {
					"name": "storage.type.rust"
				}
			},
			"patterns": [
				{
					"include": "#block_comment"
				},
				{
					"include": "#line_comment"
				},
				{
					"include": "#sigils"
				},
				{
					"include": "#mut"
				},
				{
					"include": "#dyn"
				},
				{
					"include": "#ref_lifetime"
				},
				{
					"include": "#core_types"
				},
				{
					"include": "#core_marker"
				},
				{
					"include": "#core_traits"
				},
				{
					"include": "#std_types"
				},
				{
					"include": "#std_traits"
				},
				{
					"include": "#type_params"
				},
				{
					"include": "#where"
				},
				{
					"name": "storage.type.rust",
					"match": "\\bfor\\b"
				},
				{
					"include": "#type"
				}
			]
		},
		{
			"include": "#block_doc_comment"
		},
		{
			"include": "#block_comment"
		},
		{
			"include": "#line_doc_comment"
		},
		{
			"include": "#line_comment"
		},
		{
			"comment": "Attribute",
			"name": "meta.attribute.rust",
			"begin": "#\\!?\\[",
			"end": "\\]",
			"patterns": [
				{
					"include": "#string_literal"
				},
				{
					"include": "#block_doc_comment"
				},
				{
					"include": "#block_comment"
				},
				{
					"include": "#line_doc_comment"
				},
				{
					"include": "#line_comment"
				}
			]
		},
		{
			"comment": "Single-quote string literal (character)",
			"name": "string.quoted.single.rust",
			"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]?|.))'"
		},
		{
			"include": "#string_literal"
		},
		{
			"include": "#raw_string_literal"
		},
		{
			"comment": "Floating point literal (fraction)",
			"name": "constant.numeric.float.rust",
			"match": "\\b[0-9][0-9_]*\\.[0-9][0-9_]*([eE][+-]?[0-9_]+)?(f32|f64)?\\b"
		},
		{
			"comment": "Floating point literal (exponent)",
			"name": "constant.numeric.float.rust",
			"match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?[eE][+-]?[0-9_]+(f32|f64)?\\b"
		},
		{
			"comment": "Floating point literal (typed)",
			"name": "constant.numeric.float.rust",
			"match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?([eE][+-]?[0-9_]+)?(f32|f64)\\b"
		},
		{
			"comment": "Integer literal (decimal)",
			"name": "constant.numeric.integer.decimal.rust",
			"match": "\\b[0-9][0-9_]*([ui](8|16|32|64|128|s|size))?\\b"
		},
		{
			"comment": "Integer literal (hexadecimal)",
			"name": "constant.numeric.integer.hexadecimal.rust",
			"match": "\\b0x[a-fA-F0-9_]+([ui](8|16|32|64|128|s|size))?\\b"
		},
		{
			"comment": "Integer literal (octal)",
			"name": "constant.numeric.integer.octal.rust",
			"match": "\\b0o[0-7_]+([ui](8|16|32|64|128|s|size))?\\b"
		},
		{
			"comment": "Integer literal (binary)",
			"name": "constant.numeric.integer.binary.rust",
			"match": "\\b0b[01_]+([ui](8|16|32|64|128|s|size))?\\b"
		},
		{
			"comment": "Static storage modifier",
			"name": "storage.modifier.static.rust",
			"match": "\\bstatic\\b"
		},
		{
			"comment": "Boolean constant",
			"name": "constant.language.boolean.rust",
			"match": "\\b(true|false)\\b"
		},
		{
			"comment": "Control keyword",
			"name": "keyword.control.rust",
			"match": "\\b(async|await|break|continue|else|if|in|for|loop|match|return|try|while)\\b"
		},
		{
			"comment": "Keyword",
			"name": "keyword.other.rust",
			"match": "\\b(crate|extern|mod|let|ref|use|super|move)\\b"
		},
		{
			"comment": "Reserved keyword",
			"name": "invalid.deprecated.rust",
			"match": "\\b(abstract|alignof|become|do|final|macro|offsetof|override|priv|proc|pure|sizeof|typeof|virtual|yield)\\b"
		},
		{
			"include": "#unsafe"
		},
		{
			"include": "#sigils"
		},
		{
			"include": "#self"
		},
		{
			"include": "#mut"
		},
		{
			"include": "#dyn"
		},
		{
			"include": "#impl"
		},
		{
			"include": "#box"
		},
		{
			"include": "#lifetime"
		},
		{
			"include": "#ref_lifetime"
		},
		{
			"include": "#const"
		},
		{
			"include": "#pub"
		},
		{
			"comment": "Miscellaneous operator",
			"name": "keyword.operator.misc.rust",
			"match": "(=>|::|\\bas\\b)"
		},
		{
			"comment": "Comparison operator",
			"name": "keyword.operator.comparison.rust",
			"match": "(&&|\\|\\||==|!=)"
		},
		{
			"comment": "Assignment operator",
			"name": "keyword.operator.assignment.rust",
			"match": "(\\+=|-=|/=|\\*=|%=|\\^=|&=|\\|=|<<=|>>=|=)"
		},
		{
			"comment": "Arithmetic operator",
			"name": "keyword.operator.arithmetic.rust",
			"match": "(!|\\+|-|/|\\*|%|\\^|&|\\||<<|>>)"
		},
		{
			"comment": "Comparison operator (second group because of regex precedence)",
			"name": "keyword.operator.comparison.rust",
			"match": "(<=|>=|<|>)"
		},
		{
			"include": "#core_types"
		},
		{
			"include": "#core_vars"
		},
		{
			"include": "#core_marker"
		},
		{
			"include": "#core_traits"
		},
		{
			"include": "#std_types"
		},
		{
			"include": "#std_traits"
		},
		{
			"comment": "Built-in macro",
			"name": "support.function.builtin.rust",
			"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)!"
		},
		{
			"comment": "Core macro",
			"name": "support.function.core.rust",
			"match": "\\b(panic|assert|assert_eq|assert_ne|debug_assert|debug_assert_eq|debug_assert_ne|try|write|writeln|unreachable|unimplemented)!"
		},
		{
			"comment": "Standard library macro",
			"name": "support.function.std.rust",
			"match": "\\b(format|print|println|eprint|eprintln|select|vec)!"
		},
		{
			"comment": "Logging macro",
			"name": "support.function.log.rust",
			"match": "\\b(log|error|warn|info|debug|trace|log_enabled)!"
		},
		{
			"comment": "Invokation of a macro",
			"match": "\\b([a-zA-Z_][a-zA-Z0-9_]*\\!)\\s*[({\\[]",
			"captures": {
				"1": {
					"name": "entity.name.function.macro.rust"
				}
			}
		},
		{
			"comment": "Function call",
			"match": "\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*\\(",
			"captures": {
				"1": {
					"name": "entity.name.function.rust"
				}
			}
		},
		{
			"comment": "Function call with type parameters",
			"begin": "\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*(::)(?=\\s*<.*>\\s*\\()",
			"end": "\\(",
			"captures": {
				"1": {
					"name": "entity.name.function.rust"
				},
				"2": {
					"name": "keyword.operator.misc.rust"
				}
			},
			"patterns": [
				{
					"include": "#type_params"
				}
			]
		},
		{
			"comment": "Function definition",
			"begin": "\\b(fn)\\s+([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)",
			"end": "[\\{;]",
			"beginCaptures": {
				"1": {
					"name": "keyword.other.fn.rust"
				},
				"2": {
					"name": "entity.name.function.rust"
				}
			},
			"patterns": [
				{
					"include": "#block_comment"
				},
				{
					"include": "#line_comment"
				},
				{
					"include": "#sigils"
				},
				{
					"include": "#self"
				},
				{
					"include": "#mut"
				},
				{
					"include": "#dyn"
				},
				{
					"include": "#impl"
				},
				{
					"include": "#ref_lifetime"
				},
				{
					"include": "#core_types"
				},
				{
					"include": "#core_marker"
				},
				{
					"include": "#core_traits"
				},
				{
					"include": "#std_types"
				},
				{
					"include": "#std_traits"
				},
				{
					"include": "#type_params"
				},
				{
					"include": "#const"
				},
				{
					"include": "#where"
				},
				{
					"include": "#unsafe"
				},
				{
					"comment": "Function arguments",
					"match": "\bfn\b",
					"name": "keyword.other.fn.rust"
				}
			]
		},
		{
			"comment": "Type declaration",
			"begin": "\\b(enum|struct|trait|union)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
			"end": "[\\{\\(;]",
			"beginCaptures": {
				"1": {
					"name": "storage.type.rust"
				},
				"2": {
					"name": "entity.name.type.rust"
				}
			},
			"patterns": [
				{
					"include": "#block_comment"
				},
				{
					"include": "#line_comment"
				},
				{
					"include": "#core_traits"
				},
				{
					"include": "#std_traits"
				},
				{
					"include": "#type_params"
				},
				{
					"include": "#core_types"
				},
				{
					"include": "#pub"
				},
				{
					"include": "#where"
				}
			]
		},
		{
			"comment": "Type alias",
			"begin": "\\b(type)\\s+([a-zA-Z_][a-zA-Z0-9_]*)",
			"end": ";",
			"beginCaptures": {
				"1": {
					"name": "storage.type.rust"
				},
				"2": {
					"name": "entity.name.type.rust"
				}
			},
			"patterns": [
				{
					"include": "#block_comment"
				},
				{
					"include": "#line_comment"
				},
				{
					"include": "#sigils"
				},
				{
					"include": "#mut"
				},
				{
					"include": "#dyn"
				},
				{
					"include": "#impl"
				},
				{
					"include": "#lifetime"
				},
				{
					"include": "#ref_lifetime"
				},
				{
					"include": "#core_types"
				},
				{
					"include": "#core_marker"
				},
				{
					"include": "#core_traits"
				},
				{
					"include": "#std_types"
				},
				{
					"include": "#std_traits"
				},
				{
					"include": "#type_params"
				}
			]
		}
	],
	"repository": {
		"block_doc_comment": {
			"comment": "Block documentation comment",
			"name": "comment.block.documentation.rust",
			"begin": "/\\*[\\*!](?![\\*/])",
			"end": "\\*/",
			"patterns": [
				{
					"include": "#block_doc_comment"
				},
				{
					"include": "#block_comment"
				}
			]
		},
		"block_comment": {
			"comment": "Block comment",
			"name": "comment.block.rust",
			"begin": "/\\*",
			"end": "\\*/",
			"patterns": [
				{
					"include": "#block_doc_comment"
				},
				{
					"include": "#block_comment"
				}
			]
		},
		"line_doc_comment": {
			"comment": "Single-line documentation comment",
			"name": "comment.line.documentation.rust",
			"begin": "//[!/](?=[^/])",
			"end": "$"
		},
		"line_comment": {
			"comment": "Single-line comment",
			"name": "comment.line.double-slash.rust",
			"begin": "//",
			"end": "$"
		},
		"escaped_character": {
			"name": "constant.character.escape.rust",
			"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]?|.)"
		},
		"string_literal": {
			"comment": "Double-quote string literal",
			"name": "string.quoted.double.rust",
			"begin": "b?\"",
			"end": "\"",
			"patterns": [
				{
					"include": "#escaped_character"
				}
			]
		},
		"raw_string_literal": {
			"comment": "Raw double-quote string literal",
			"name": "string.quoted.double.raw.rust",
			"begin": "b?r(#*)\"",
			"end": "\"\\1"
		},
		"sigils": {
			"comment": "Sigil",
			"name": "keyword.operator.sigil.rust",
			"match": "[&*](?=[a-zA-Z0-9_\\(\\[\\|\\\"]+)"
		},
		"self": {
			"comment": "Self variable",
			"name": "variable.language.rust",
			"match": "\\bself\\b"
		},
		"mut": {
			"comment": "Mutable storage modifier",
			"name": "storage.modifier.mut.rust",
			"match": "\\bmut\\b"
		},
		"dyn": {
			"comment": "Dynamic modifier",
			"name": "storage.modifier.dyn.rust",
			"match": "\\bdyn\\b"
		},
		"impl": {
			"comment": "Existential type modifier",
			"name": "storage.modifier.impl.rust",
			"match": "\\bimpl\\b"
		},
		"box": {
			"comment": "Box storage modifier",
			"name": "storage.modifier.box.rust",
			"match": "\\bbox\\b"
		},
		"const": {
			"comment": "Const storage modifier",
			"name": "storage.modifier.const.rust",
			"match": "\\bconst\\b"
		},
		"pub": {
			"comment": "Visibility modifier",
			"name": "storage.modifier.visibility.rust",
			"match": "\\bpub\\b"
		},
		"unsafe": {
			"comment": "Unsafe code keyword",
			"name": "keyword.other.unsafe.rust",
			"match": "\\bunsafe\\b"
		},
		"where": {
			"comment": "Generic where clause",
			"name": "keyword.other.where.rust",
			"match": "\\bwhere\\b"
		},
		"lifetime": {
			"comment": "Named lifetime",
			"name": "storage.modifier.lifetime.rust",
			"match": "'([a-zA-Z_][a-zA-Z0-9_]*)\\b",
			"captures": {
				"1": {
					"name": "entity.name.lifetime.rust"
				}
			}
		},
		"ref_lifetime": {
			"comment": "Reference with named lifetime",
			"match": "&('([a-zA-Z_][a-zA-Z0-9_]*))\\b",
			"captures": {
				"1": {
					"name": "storage.modifier.lifetime.rust"
				},
				"2": {
					"name": "entity.name.lifetime.rust"
				}
			}
		},
		"core_types": {
			"comment": "Built-in/core type",
			"name": "storage.type.core.rust",
			"match": "\\b(bool|char|usize|isize|u8|u16|u32|u64|u128|i8|i16|i32|i64|i128|f32|f64|str|Self|Option|Result)\\b"
		},
		"core_vars": {
			"comment": "Core type variant",
			"name": "support.constant.core.rust",
			"match": "\\b(Some|None|Ok|Err)\\b"
		},
		"core_marker": {
			"comment": "Core trait (marker)",
			"name": "support.type.marker.rust",
			"match": "\\b(Copy|Send|Sized|Sync)\\b"
		},
		"core_traits": {
			"comment": "Core trait",
			"name": "support.type.core.rust",
			"match": "\\b(Drop|Fn|FnMut|FnOnce|Clone|PartialEq|PartialOrd|Eq|Ord|AsRef|AsMut|Into|From|Default|Iterator|Extend|IntoIterator|DoubleEndedIterator|ExactSizeIterator)\\b"
		},
		"std_types": {
			"comment": "Standard library type",
			"name": "storage.class.std.rust",
			"match": "\\b(Box|String|Vec|Path|PathBuf)\\b"
		},
		"std_traits": {
			"comment": "Standard library trait",
			"name": "support.type.std.rust",
			"match": "\\b(ToOwned|ToString)\\b"
		},
		"type": {
			"comment": "A type",
			"name": "entity.name.type.rust",
			"match": "\\b([A-Za-z][_A-Za-z0-9]*|_[_A-Za-z0-9]+)\\b"
		},
		"type_params": {
			"comment": "Type parameters",
			"name": "meta.type_params.rust",
			"begin": "<(?![=<])",
			"end": "(?<![-])>",
			"patterns": [
				{
					"include": "#block_comment"
				},
				{
					"include": "#line_comment"
				},
				{
					"include": "#sigils"
				},
				{
					"include": "#mut"
				},
				{
					"include": "#dyn"
				},
				{
					"include": "#impl"
				},
				{
					"include": "#lifetime"
				},
				{
					"include": "#core_types"
				},
				{
					"include": "#core_marker"
				},
				{
					"include": "#core_traits"
				},
				{
					"include": "#std_types"
				},
				{
					"include": "#std_traits"
				},
				{
					"include": "#type_params"
				}
			]
		}
	}
}