442 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			442 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| Language: C#
 | |
| Author: Jason Diamond <jason@diamond.name>
 | |
| Contributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, David Pine <david.pine@microsoft.com>
 | |
| Website: https://docs.microsoft.com/en-us/dotnet/csharp/
 | |
| Category: common
 | |
| */
 | |
| 
 | |
| /** @type LanguageFn */
 | |
| function csharp(hljs) {
 | |
|   const BUILT_IN_KEYWORDS = [
 | |
|     'bool',
 | |
|     'byte',
 | |
|     'char',
 | |
|     'decimal',
 | |
|     'delegate',
 | |
|     'double',
 | |
|     'dynamic',
 | |
|     'enum',
 | |
|     'float',
 | |
|     'int',
 | |
|     'long',
 | |
|     'nint',
 | |
|     'nuint',
 | |
|     'object',
 | |
|     'sbyte',
 | |
|     'short',
 | |
|     'string',
 | |
|     'ulong',
 | |
|     'uint',
 | |
|     'ushort'
 | |
|   ];
 | |
|   const FUNCTION_MODIFIERS = [
 | |
|     'public',
 | |
|     'private',
 | |
|     'protected',
 | |
|     'static',
 | |
|     'internal',
 | |
|     'protected',
 | |
|     'abstract',
 | |
|     'async',
 | |
|     'extern',
 | |
|     'override',
 | |
|     'unsafe',
 | |
|     'virtual',
 | |
|     'new',
 | |
|     'sealed',
 | |
|     'partial'
 | |
|   ];
 | |
|   const LITERAL_KEYWORDS = [
 | |
|     'default',
 | |
|     'false',
 | |
|     'null',
 | |
|     'true'
 | |
|   ];
 | |
|   const NORMAL_KEYWORDS = [
 | |
|     'abstract',
 | |
|     'as',
 | |
|     'base',
 | |
|     'break',
 | |
|     'case',
 | |
|     'class',
 | |
|     'const',
 | |
|     'continue',
 | |
|     'do',
 | |
|     'else',
 | |
|     'event',
 | |
|     'explicit',
 | |
|     'extern',
 | |
|     'finally',
 | |
|     'fixed',
 | |
|     'for',
 | |
|     'foreach',
 | |
|     'goto',
 | |
|     'if',
 | |
|     'implicit',
 | |
|     'in',
 | |
|     'interface',
 | |
|     'internal',
 | |
|     'is',
 | |
|     'lock',
 | |
|     'namespace',
 | |
|     'new',
 | |
|     'operator',
 | |
|     'out',
 | |
|     'override',
 | |
|     'params',
 | |
|     'private',
 | |
|     'protected',
 | |
|     'public',
 | |
|     'readonly',
 | |
|     'record',
 | |
|     'ref',
 | |
|     'return',
 | |
|     'sealed',
 | |
|     'sizeof',
 | |
|     'stackalloc',
 | |
|     'static',
 | |
|     'struct',
 | |
|     'switch',
 | |
|     'this',
 | |
|     'throw',
 | |
|     'try',
 | |
|     'typeof',
 | |
|     'unchecked',
 | |
|     'unsafe',
 | |
|     'using',
 | |
|     'virtual',
 | |
|     'void',
 | |
|     'volatile',
 | |
|     'while'
 | |
|   ];
 | |
|   const CONTEXTUAL_KEYWORDS = [
 | |
|     'add',
 | |
|     'alias',
 | |
|     'and',
 | |
|     'ascending',
 | |
|     'async',
 | |
|     'await',
 | |
|     'by',
 | |
|     'descending',
 | |
|     'equals',
 | |
|     'from',
 | |
|     'get',
 | |
|     'global',
 | |
|     'group',
 | |
|     'init',
 | |
|     'into',
 | |
|     'join',
 | |
|     'let',
 | |
|     'nameof',
 | |
|     'not',
 | |
|     'notnull',
 | |
|     'on',
 | |
|     'or',
 | |
|     'orderby',
 | |
|     'partial',
 | |
|     'remove',
 | |
|     'select',
 | |
|     'set',
 | |
|     'unmanaged',
 | |
|     'value|0',
 | |
|     'var',
 | |
|     'when',
 | |
|     'where',
 | |
|     'with',
 | |
|     'yield'
 | |
|   ];
 | |
| 
 | |
|   const KEYWORDS = {
 | |
|     keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),
 | |
|     built_in: BUILT_IN_KEYWORDS,
 | |
|     literal: LITERAL_KEYWORDS
 | |
|   };
 | |
|   const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, {
 | |
|     begin: '[a-zA-Z](\\.?\\w)*'
 | |
|   });
 | |
|   const NUMBERS = {
 | |
|     className: 'number',
 | |
|     variants: [
 | |
|       {
 | |
|         begin: '\\b(0b[01\']+)'
 | |
|       },
 | |
|       {
 | |
|         begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)'
 | |
|       },
 | |
|       {
 | |
|         begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)'
 | |
|       }
 | |
|     ],
 | |
|     relevance: 0
 | |
|   };
 | |
|   const VERBATIM_STRING = {
 | |
|     className: 'string',
 | |
|     begin: '@"',
 | |
|     end: '"',
 | |
|     contains: [
 | |
|       {
 | |
|         begin: '""'
 | |
|       }
 | |
|     ]
 | |
|   };
 | |
|   const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, {
 | |
|     illegal: /\n/
 | |
|   });
 | |
|   const SUBST = {
 | |
|     className: 'subst',
 | |
|     begin: /\{/,
 | |
|     end: /\}/,
 | |
|     keywords: KEYWORDS
 | |
|   };
 | |
|   const SUBST_NO_LF = hljs.inherit(SUBST, {
 | |
|     illegal: /\n/
 | |
|   });
 | |
|   const INTERPOLATED_STRING = {
 | |
|     className: 'string',
 | |
|     begin: /\$"/,
 | |
|     end: '"',
 | |
|     illegal: /\n/,
 | |
|     contains: [
 | |
|       {
 | |
|         begin: /\{\{/
 | |
|       },
 | |
|       {
 | |
|         begin: /\}\}/
 | |
|       },
 | |
|       hljs.BACKSLASH_ESCAPE,
 | |
|       SUBST_NO_LF
 | |
|     ]
 | |
|   };
 | |
|   const INTERPOLATED_VERBATIM_STRING = {
 | |
|     className: 'string',
 | |
|     begin: /\$@"/,
 | |
|     end: '"',
 | |
|     contains: [
 | |
|       {
 | |
|         begin: /\{\{/
 | |
|       },
 | |
|       {
 | |
|         begin: /\}\}/
 | |
|       },
 | |
|       {
 | |
|         begin: '""'
 | |
|       },
 | |
|       SUBST
 | |
|     ]
 | |
|   };
 | |
|   const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
 | |
|     illegal: /\n/,
 | |
|     contains: [
 | |
|       {
 | |
|         begin: /\{\{/
 | |
|       },
 | |
|       {
 | |
|         begin: /\}\}/
 | |
|       },
 | |
|       {
 | |
|         begin: '""'
 | |
|       },
 | |
|       SUBST_NO_LF
 | |
|     ]
 | |
|   });
 | |
|   SUBST.contains = [
 | |
|     INTERPOLATED_VERBATIM_STRING,
 | |
|     INTERPOLATED_STRING,
 | |
|     VERBATIM_STRING,
 | |
|     hljs.APOS_STRING_MODE,
 | |
|     hljs.QUOTE_STRING_MODE,
 | |
|     NUMBERS,
 | |
|     hljs.C_BLOCK_COMMENT_MODE
 | |
|   ];
 | |
|   SUBST_NO_LF.contains = [
 | |
|     INTERPOLATED_VERBATIM_STRING_NO_LF,
 | |
|     INTERPOLATED_STRING,
 | |
|     VERBATIM_STRING_NO_LF,
 | |
|     hljs.APOS_STRING_MODE,
 | |
|     hljs.QUOTE_STRING_MODE,
 | |
|     NUMBERS,
 | |
|     hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, {
 | |
|       illegal: /\n/
 | |
|     })
 | |
|   ];
 | |
|   const STRING = {
 | |
|     variants: [
 | |
|       INTERPOLATED_VERBATIM_STRING,
 | |
|       INTERPOLATED_STRING,
 | |
|       VERBATIM_STRING,
 | |
|       hljs.APOS_STRING_MODE,
 | |
|       hljs.QUOTE_STRING_MODE
 | |
|     ]
 | |
|   };
 | |
| 
 | |
|   const GENERIC_MODIFIER = {
 | |
|     begin: "<",
 | |
|     end: ">",
 | |
|     contains: [
 | |
|       {
 | |
|         beginKeywords: "in out"
 | |
|       },
 | |
|       TITLE_MODE
 | |
|     ]
 | |
|   };
 | |
|   const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
 | |
|   const AT_IDENTIFIER = {
 | |
|     // prevents expressions like `@class` from incorrect flagging
 | |
|     // `class` as a keyword
 | |
|     begin: "@" + hljs.IDENT_RE,
 | |
|     relevance: 0
 | |
|   };
 | |
| 
 | |
|   return {
 | |
|     name: 'C#',
 | |
|     aliases: [
 | |
|       'cs',
 | |
|       'c#'
 | |
|     ],
 | |
|     keywords: KEYWORDS,
 | |
|     illegal: /::/,
 | |
|     contains: [
 | |
|       hljs.COMMENT(
 | |
|         '///',
 | |
|         '$',
 | |
|         {
 | |
|           returnBegin: true,
 | |
|           contains: [
 | |
|             {
 | |
|               className: 'doctag',
 | |
|               variants: [
 | |
|                 {
 | |
|                   begin: '///',
 | |
|                   relevance: 0
 | |
|                 },
 | |
|                 {
 | |
|                   begin: '<!--|-->'
 | |
|                 },
 | |
|                 {
 | |
|                   begin: '</?',
 | |
|                   end: '>'
 | |
|                 }
 | |
|               ]
 | |
|             }
 | |
|           ]
 | |
|         }
 | |
|       ),
 | |
|       hljs.C_LINE_COMMENT_MODE,
 | |
|       hljs.C_BLOCK_COMMENT_MODE,
 | |
|       {
 | |
|         className: 'meta',
 | |
|         begin: '#',
 | |
|         end: '$',
 | |
|         keywords: {
 | |
|           'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'
 | |
|         }
 | |
|       },
 | |
|       STRING,
 | |
|       NUMBERS,
 | |
|       {
 | |
|         beginKeywords: 'class interface',
 | |
|         relevance: 0,
 | |
|         end: /[{;=]/,
 | |
|         illegal: /[^\s:,]/,
 | |
|         contains: [
 | |
|           {
 | |
|             beginKeywords: "where class"
 | |
|           },
 | |
|           TITLE_MODE,
 | |
|           GENERIC_MODIFIER,
 | |
|           hljs.C_LINE_COMMENT_MODE,
 | |
|           hljs.C_BLOCK_COMMENT_MODE
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         beginKeywords: 'namespace',
 | |
|         relevance: 0,
 | |
|         end: /[{;=]/,
 | |
|         illegal: /[^\s:]/,
 | |
|         contains: [
 | |
|           TITLE_MODE,
 | |
|           hljs.C_LINE_COMMENT_MODE,
 | |
|           hljs.C_BLOCK_COMMENT_MODE
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         beginKeywords: 'record',
 | |
|         relevance: 0,
 | |
|         end: /[{;=]/,
 | |
|         illegal: /[^\s:]/,
 | |
|         contains: [
 | |
|           TITLE_MODE,
 | |
|           GENERIC_MODIFIER,
 | |
|           hljs.C_LINE_COMMENT_MODE,
 | |
|           hljs.C_BLOCK_COMMENT_MODE
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         // [Attributes("")]
 | |
|         className: 'meta',
 | |
|         begin: '^\\s*\\[',
 | |
|         excludeBegin: true,
 | |
|         end: '\\]',
 | |
|         excludeEnd: true,
 | |
|         contains: [
 | |
|           {
 | |
|             className: 'meta-string',
 | |
|             begin: /"/,
 | |
|             end: /"/
 | |
|           }
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         // Expression keywords prevent 'keyword Name(...)' from being
 | |
|         // recognized as a function definition
 | |
|         beginKeywords: 'new return throw await else',
 | |
|         relevance: 0
 | |
|       },
 | |
|       {
 | |
|         className: 'function',
 | |
|         begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(<.+>\\s*)?\\(',
 | |
|         returnBegin: true,
 | |
|         end: /\s*[{;=]/,
 | |
|         excludeEnd: true,
 | |
|         keywords: KEYWORDS,
 | |
|         contains: [
 | |
|           // prevents these from being highlighted `title`
 | |
|           {
 | |
|             beginKeywords: FUNCTION_MODIFIERS.join(" "),
 | |
|             relevance: 0
 | |
|           },
 | |
|           {
 | |
|             begin: hljs.IDENT_RE + '\\s*(<.+>\\s*)?\\(',
 | |
|             returnBegin: true,
 | |
|             contains: [
 | |
|               hljs.TITLE_MODE,
 | |
|               GENERIC_MODIFIER
 | |
|             ],
 | |
|             relevance: 0
 | |
|           },
 | |
|           {
 | |
|             className: 'params',
 | |
|             begin: /\(/,
 | |
|             end: /\)/,
 | |
|             excludeBegin: true,
 | |
|             excludeEnd: true,
 | |
|             keywords: KEYWORDS,
 | |
|             relevance: 0,
 | |
|             contains: [
 | |
|               STRING,
 | |
|               NUMBERS,
 | |
|               hljs.C_BLOCK_COMMENT_MODE
 | |
|             ]
 | |
|           },
 | |
|           hljs.C_LINE_COMMENT_MODE,
 | |
|           hljs.C_BLOCK_COMMENT_MODE
 | |
|         ]
 | |
|       },
 | |
|       AT_IDENTIFIER
 | |
|     ]
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = csharp;
 |