csharp.js 7.9 KB

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