/ src / theme / languages / rust.js
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    })();