rust.js
1 /*! `rust` grammar compiled for Highlight.js 11.10.0 */ 2 (function(){ 3 var hljsGrammar = (function () { 4 'use strict'; 5 6 /* 7 Language: Rust 8 Author: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com> 9 Contributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com> 10 Website: https://www.rust-lang.org 11 Category: common, system 12 */ 13 14 /** @type LanguageFn */ 15 16 function rust(hljs) { 17 const regex = hljs.regex; 18 // ============================================ 19 // Added to support the r# keyword, which is a raw identifier in Rust. 20 const RAW_IDENTIFIER = /(r#)?/; 21 const UNDERSCORE_IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.UNDERSCORE_IDENT_RE); 22 const IDENT_RE = regex.concat(RAW_IDENTIFIER, hljs.IDENT_RE); 23 // ============================================ 24 const FUNCTION_INVOKE = { 25 className: "title.function.invoke", 26 relevance: 0, 27 begin: regex.concat( 28 /\b/, 29 /(?!let|for|while|if|else|match\b)/, 30 IDENT_RE, 31 regex.lookahead(/\s*\(/)) 32 }; 33 const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\?'; 34 const KEYWORDS = [ 35 "abstract", 36 "as", 37 "async", 38 "await", 39 "become", 40 "box", 41 "break", 42 "const", 43 "continue", 44 "crate", 45 "do", 46 "dyn", 47 "else", 48 "enum", 49 "extern", 50 "false", 51 "final", 52 "fn", 53 "for", 54 "if", 55 "impl", 56 "in", 57 "let", 58 "loop", 59 "macro", 60 "match", 61 "mod", 62 "move", 63 "mut", 64 "override", 65 "priv", 66 "pub", 67 "ref", 68 "return", 69 "self", 70 "Self", 71 "static", 72 "struct", 73 "super", 74 "trait", 75 "true", 76 "try", 77 "type", 78 "typeof", 79 "union", 80 "unsafe", 81 "unsized", 82 "use", 83 "virtual", 84 "where", 85 "while", 86 "yield" 87 ]; 88 const LITERALS = [ 89 "true", 90 "false", 91 "Some", 92 "None", 93 "Ok", 94 "Err" 95 ]; 96 const BUILTINS = [ 97 // functions 98 'drop ', 99 // traits 100 "Copy", 101 "Send", 102 "Sized", 103 "Sync", 104 "Drop", 105 "Fn", 106 "FnMut", 107 "FnOnce", 108 "ToOwned", 109 "Clone", 110 "Debug", 111 "PartialEq", 112 "PartialOrd", 113 "Eq", 114 "Ord", 115 "AsRef", 116 "AsMut", 117 "Into", 118 "From", 119 "Default", 120 "Iterator", 121 "Extend", 122 "IntoIterator", 123 "DoubleEndedIterator", 124 "ExactSizeIterator", 125 "SliceConcatExt", 126 "ToString", 127 // macros 128 "assert!", 129 "assert_eq!", 130 "bitflags!", 131 "bytes!", 132 "cfg!", 133 "col!", 134 "concat!", 135 "concat_idents!", 136 "debug_assert!", 137 "debug_assert_eq!", 138 "env!", 139 "eprintln!", 140 "panic!", 141 "file!", 142 "format!", 143 "format_args!", 144 "include_bytes!", 145 "include_str!", 146 "line!", 147 "local_data_key!", 148 "module_path!", 149 "option_env!", 150 "print!", 151 "println!", 152 "select!", 153 "stringify!", 154 "try!", 155 "unimplemented!", 156 "unreachable!", 157 "vec!", 158 "write!", 159 "writeln!", 160 "macro_rules!", 161 "assert_ne!", 162 "debug_assert_ne!" 163 ]; 164 const TYPES = [ 165 "i8", 166 "i16", 167 "i32", 168 "i64", 169 "i128", 170 "isize", 171 "u8", 172 "u16", 173 "u32", 174 "u64", 175 "u128", 176 "usize", 177 "f32", 178 "f64", 179 "str", 180 "char", 181 "bool", 182 "Box", 183 "Option", 184 "Result", 185 "String", 186 "Vec" 187 ]; 188 return { 189 name: 'Rust', 190 aliases: [ 'rs' ], 191 keywords: { 192 $pattern: hljs.IDENT_RE + '!?', 193 type: TYPES, 194 keyword: KEYWORDS, 195 literal: LITERALS, 196 built_in: BUILTINS 197 }, 198 illegal: '</', 199 contains: [ 200 hljs.C_LINE_COMMENT_MODE, 201 hljs.COMMENT('/\\*', '\\*/', { contains: [ 'self' ] }), 202 hljs.inherit(hljs.QUOTE_STRING_MODE, { 203 begin: /b?"/, 204 illegal: null 205 }), 206 { 207 className: 'string', 208 variants: [ 209 { begin: /b?r(#*)"(.|\n)*?"\1(?!#)/ }, 210 { begin: /b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/ } 211 ] 212 }, 213 { 214 className: 'symbol', 215 begin: /'[a-zA-Z_][a-zA-Z0-9_]*/ 216 }, 217 { 218 className: 'number', 219 variants: [ 220 { begin: '\\b0b([01_]+)' + NUMBER_SUFFIX }, 221 { begin: '\\b0o([0-7_]+)' + NUMBER_SUFFIX }, 222 { begin: '\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX }, 223 { begin: '\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)' 224 + NUMBER_SUFFIX } 225 ], 226 relevance: 0 227 }, 228 { 229 begin: [ 230 /fn/, 231 /\s+/, 232 UNDERSCORE_IDENT_RE 233 ], 234 className: { 235 1: "keyword", 236 3: "title.function" 237 } 238 }, 239 { 240 className: 'meta', 241 begin: '#!?\\[', 242 end: '\\]', 243 contains: [ 244 { 245 className: 'string', 246 begin: /"/, 247 end: /"/, 248 contains: [ 249 hljs.BACKSLASH_ESCAPE 250 ] 251 } 252 ] 253 }, 254 { 255 begin: [ 256 /let/, 257 /\s+/, 258 /(?:mut\s+)?/, 259 UNDERSCORE_IDENT_RE 260 ], 261 className: { 262 1: "keyword", 263 3: "keyword", 264 4: "variable" 265 } 266 }, 267 // must come before impl/for rule later 268 { 269 begin: [ 270 /for/, 271 /\s+/, 272 UNDERSCORE_IDENT_RE, 273 /\s+/, 274 /in/ 275 ], 276 className: { 277 1: "keyword", 278 3: "variable", 279 5: "keyword" 280 } 281 }, 282 { 283 begin: [ 284 /type/, 285 /\s+/, 286 UNDERSCORE_IDENT_RE 287 ], 288 className: { 289 1: "keyword", 290 3: "title.class" 291 } 292 }, 293 { 294 begin: [ 295 /(?:trait|enum|struct|union|impl|for)/, 296 /\s+/, 297 UNDERSCORE_IDENT_RE 298 ], 299 className: { 300 1: "keyword", 301 3: "title.class" 302 } 303 }, 304 { 305 begin: hljs.IDENT_RE + '::', 306 keywords: { 307 keyword: "Self", 308 built_in: BUILTINS, 309 type: TYPES 310 } 311 }, 312 { 313 className: "punctuation", 314 begin: '->' 315 }, 316 FUNCTION_INVOKE 317 ] 318 }; 319 } 320 321 return rust; 322 323 })(); 324 325 hljs.registerLanguage('rust', hljsGrammar); 326 })();