UNPKG

8.68 kBJavaScriptView Raw
1/*
2Language: C#
3Author: Jason Diamond <jason@diamond.name>
4Contributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, David Pine <david.pine@microsoft.com>
5Website: https://docs.microsoft.com/en-us/dotnet/csharp/
6Category: common
7*/
8
9/** @type LanguageFn */
10function csharp(hljs) {
11 const BUILT_IN_KEYWORDS = [
12 'bool',
13 'byte',
14 'char',
15 'decimal',
16 'delegate',
17 'double',
18 'dynamic',
19 'enum',
20 'float',
21 'int',
22 'long',
23 'nint',
24 'nuint',
25 'object',
26 'sbyte',
27 'short',
28 'string',
29 'ulong',
30 'uint',
31 'ushort'
32 ];
33 const FUNCTION_MODIFIERS = [
34 'public',
35 'private',
36 'protected',
37 'static',
38 'internal',
39 'protected',
40 'abstract',
41 'async',
42 'extern',
43 'override',
44 'unsafe',
45 'virtual',
46 'new',
47 'sealed',
48 'partial'
49 ];
50 const LITERAL_KEYWORDS = [
51 'default',
52 'false',
53 'null',
54 'true'
55 ];
56 const NORMAL_KEYWORDS = [
57 'abstract',
58 'as',
59 'base',
60 'break',
61 'case',
62 'catch',
63 'class',
64 'const',
65 'continue',
66 'do',
67 'else',
68 'event',
69 'explicit',
70 'extern',
71 'finally',
72 'fixed',
73 'for',
74 'foreach',
75 'goto',
76 'if',
77 'implicit',
78 'in',
79 'interface',
80 'internal',
81 'is',
82 'lock',
83 'namespace',
84 'new',
85 'operator',
86 'out',
87 'override',
88 'params',
89 'private',
90 'protected',
91 'public',
92 'readonly',
93 'record',
94 'ref',
95 'return',
96 'sealed',
97 'sizeof',
98 'stackalloc',
99 'static',
100 'struct',
101 'switch',
102 'this',
103 'throw',
104 'try',
105 'typeof',
106 'unchecked',
107 'unsafe',
108 'using',
109 'virtual',
110 'void',
111 'volatile',
112 'while'
113 ];
114 const CONTEXTUAL_KEYWORDS = [
115 'add',
116 'alias',
117 'and',
118 'ascending',
119 'async',
120 'await',
121 'by',
122 'descending',
123 'equals',
124 'from',
125 'get',
126 'global',
127 'group',
128 'init',
129 'into',
130 'join',
131 'let',
132 'nameof',
133 'not',
134 'notnull',
135 'on',
136 'or',
137 'orderby',
138 'partial',
139 'remove',
140 'select',
141 'set',
142 'unmanaged',
143 'value|0',
144 'var',
145 'when',
146 'where',
147 'with',
148 'yield'
149 ];
150
151 const KEYWORDS = {
152 keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),
153 built_in: BUILT_IN_KEYWORDS,
154 literal: LITERAL_KEYWORDS
155 };
156 const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, {
157 begin: '[a-zA-Z](\\.?\\w)*'
158 });
159 const NUMBERS = {
160 className: 'number',
161 variants: [
162 {
163 begin: '\\b(0b[01\']+)'
164 },
165 {
166 begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)'
167 },
168 {
169 begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)'
170 }
171 ],
172 relevance: 0
173 };
174 const VERBATIM_STRING = {
175 className: 'string',
176 begin: '@"',
177 end: '"',
178 contains: [
179 {
180 begin: '""'
181 }
182 ]
183 };
184 const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, {
185 illegal: /\n/
186 });
187 const SUBST = {
188 className: 'subst',
189 begin: /\{/,
190 end: /\}/,
191 keywords: KEYWORDS
192 };
193 const SUBST_NO_LF = hljs.inherit(SUBST, {
194 illegal: /\n/
195 });
196 const INTERPOLATED_STRING = {
197 className: 'string',
198 begin: /\$"/,
199 end: '"',
200 illegal: /\n/,
201 contains: [
202 {
203 begin: /\{\{/
204 },
205 {
206 begin: /\}\}/
207 },
208 hljs.BACKSLASH_ESCAPE,
209 SUBST_NO_LF
210 ]
211 };
212 const INTERPOLATED_VERBATIM_STRING = {
213 className: 'string',
214 begin: /\$@"/,
215 end: '"',
216 contains: [
217 {
218 begin: /\{\{/
219 },
220 {
221 begin: /\}\}/
222 },
223 {
224 begin: '""'
225 },
226 SUBST
227 ]
228 };
229 const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
230 illegal: /\n/,
231 contains: [
232 {
233 begin: /\{\{/
234 },
235 {
236 begin: /\}\}/
237 },
238 {
239 begin: '""'
240 },
241 SUBST_NO_LF
242 ]
243 });
244 SUBST.contains = [
245 INTERPOLATED_VERBATIM_STRING,
246 INTERPOLATED_STRING,
247 VERBATIM_STRING,
248 hljs.APOS_STRING_MODE,
249 hljs.QUOTE_STRING_MODE,
250 NUMBERS,
251 hljs.C_BLOCK_COMMENT_MODE
252 ];
253 SUBST_NO_LF.contains = [
254 INTERPOLATED_VERBATIM_STRING_NO_LF,
255 INTERPOLATED_STRING,
256 VERBATIM_STRING_NO_LF,
257 hljs.APOS_STRING_MODE,
258 hljs.QUOTE_STRING_MODE,
259 NUMBERS,
260 hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, {
261 illegal: /\n/
262 })
263 ];
264 const STRING = {
265 variants: [
266 INTERPOLATED_VERBATIM_STRING,
267 INTERPOLATED_STRING,
268 VERBATIM_STRING,
269 hljs.APOS_STRING_MODE,
270 hljs.QUOTE_STRING_MODE
271 ]
272 };
273
274 const GENERIC_MODIFIER = {
275 begin: "<",
276 end: ">",
277 contains: [
278 {
279 beginKeywords: "in out"
280 },
281 TITLE_MODE
282 ]
283 };
284 const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
285 const AT_IDENTIFIER = {
286 // prevents expressions like `@class` from incorrect flagging
287 // `class` as a keyword
288 begin: "@" + hljs.IDENT_RE,
289 relevance: 0
290 };
291
292 return {
293 name: 'C#',
294 aliases: [
295 'cs',
296 'c#'
297 ],
298 keywords: KEYWORDS,
299 illegal: /::/,
300 contains: [
301 hljs.COMMENT(
302 '///',
303 '$',
304 {
305 returnBegin: true,
306 contains: [
307 {
308 className: 'doctag',
309 variants: [
310 {
311 begin: '///',
312 relevance: 0
313 },
314 {
315 begin: '<!--|-->'
316 },
317 {
318 begin: '</?',
319 end: '>'
320 }
321 ]
322 }
323 ]
324 }
325 ),
326 hljs.C_LINE_COMMENT_MODE,
327 hljs.C_BLOCK_COMMENT_MODE,
328 {
329 className: 'meta',
330 begin: '#',
331 end: '$',
332 keywords: {
333 keyword: 'if else elif endif define undef warning error line region endregion pragma checksum'
334 }
335 },
336 STRING,
337 NUMBERS,
338 {
339 beginKeywords: 'class interface',
340 relevance: 0,
341 end: /[{;=]/,
342 illegal: /[^\s:,]/,
343 contains: [
344 {
345 beginKeywords: "where class"
346 },
347 TITLE_MODE,
348 GENERIC_MODIFIER,
349 hljs.C_LINE_COMMENT_MODE,
350 hljs.C_BLOCK_COMMENT_MODE
351 ]
352 },
353 {
354 beginKeywords: 'namespace',
355 relevance: 0,
356 end: /[{;=]/,
357 illegal: /[^\s:]/,
358 contains: [
359 TITLE_MODE,
360 hljs.C_LINE_COMMENT_MODE,
361 hljs.C_BLOCK_COMMENT_MODE
362 ]
363 },
364 {
365 beginKeywords: 'record',
366 relevance: 0,
367 end: /[{;=]/,
368 illegal: /[^\s:]/,
369 contains: [
370 TITLE_MODE,
371 GENERIC_MODIFIER,
372 hljs.C_LINE_COMMENT_MODE,
373 hljs.C_BLOCK_COMMENT_MODE
374 ]
375 },
376 {
377 // [Attributes("")]
378 className: 'meta',
379 begin: '^\\s*\\[(?=[\\w])',
380 excludeBegin: true,
381 end: '\\]',
382 excludeEnd: true,
383 contains: [
384 {
385 className: 'string',
386 begin: /"/,
387 end: /"/
388 }
389 ]
390 },
391 {
392 // Expression keywords prevent 'keyword Name(...)' from being
393 // recognized as a function definition
394 beginKeywords: 'new return throw await else',
395 relevance: 0
396 },
397 {
398 className: 'function',
399 begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(',
400 returnBegin: true,
401 end: /\s*[{;=]/,
402 excludeEnd: true,
403 keywords: KEYWORDS,
404 contains: [
405 // prevents these from being highlighted `title`
406 {
407 beginKeywords: FUNCTION_MODIFIERS.join(" "),
408 relevance: 0
409 },
410 {
411 begin: hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(',
412 returnBegin: true,
413 contains: [
414 hljs.TITLE_MODE,
415 GENERIC_MODIFIER
416 ],
417 relevance: 0
418 },
419 {
420 match: /\(\)/
421 },
422 {
423 className: 'params',
424 begin: /\(/,
425 end: /\)/,
426 excludeBegin: true,
427 excludeEnd: true,
428 keywords: KEYWORDS,
429 relevance: 0,
430 contains: [
431 STRING,
432 NUMBERS,
433 hljs.C_BLOCK_COMMENT_MODE
434 ]
435 },
436 hljs.C_LINE_COMMENT_MODE,
437 hljs.C_BLOCK_COMMENT_MODE
438 ]
439 },
440 AT_IDENTIFIER
441 ]
442 };
443}
444
445export { csharp as default };