UNPKG

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