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