csharp.js 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  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/dotnet/csharp/
  6. Category: common
  7. */
  8. /** @type LanguageFn */
  9. function csharp(hljs) {
  10. const 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. 'uint',
  30. 'ushort'
  31. ];
  32. const 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. const LITERAL_KEYWORDS = [
  50. 'default',
  51. 'false',
  52. 'null',
  53. 'true'
  54. ];
  55. const NORMAL_KEYWORDS = [
  56. 'abstract',
  57. 'as',
  58. 'base',
  59. 'break',
  60. 'case',
  61. 'catch',
  62. 'class',
  63. 'const',
  64. 'continue',
  65. 'do',
  66. 'else',
  67. 'event',
  68. 'explicit',
  69. 'extern',
  70. 'finally',
  71. 'fixed',
  72. 'for',
  73. 'foreach',
  74. 'goto',
  75. 'if',
  76. 'implicit',
  77. 'in',
  78. 'interface',
  79. 'internal',
  80. 'is',
  81. 'lock',
  82. 'namespace',
  83. 'new',
  84. 'operator',
  85. 'out',
  86. 'override',
  87. 'params',
  88. 'private',
  89. 'protected',
  90. 'public',
  91. 'readonly',
  92. 'record',
  93. 'ref',
  94. 'return',
  95. 'scoped',
  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. 'args',
  120. 'async',
  121. 'await',
  122. 'by',
  123. 'descending',
  124. 'dynamic',
  125. 'equals',
  126. 'file',
  127. 'from',
  128. 'get',
  129. 'global',
  130. 'group',
  131. 'init',
  132. 'into',
  133. 'join',
  134. 'let',
  135. 'nameof',
  136. 'not',
  137. 'notnull',
  138. 'on',
  139. 'or',
  140. 'orderby',
  141. 'partial',
  142. 'record',
  143. 'remove',
  144. 'required',
  145. 'scoped',
  146. 'select',
  147. 'set',
  148. 'unmanaged',
  149. 'value|0',
  150. 'var',
  151. 'when',
  152. 'where',
  153. 'with',
  154. 'yield'
  155. ];
  156. const KEYWORDS = {
  157. keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),
  158. built_in: BUILT_IN_KEYWORDS,
  159. literal: LITERAL_KEYWORDS
  160. };
  161. const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, { begin: '[a-zA-Z](\\.?\\w)*' });
  162. const NUMBERS = {
  163. className: 'number',
  164. variants: [
  165. { begin: '\\b(0b[01\']+)' },
  166. { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
  167. { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
  168. ],
  169. relevance: 0
  170. };
  171. const RAW_STRING = {
  172. className: 'string',
  173. begin: /"""("*)(?!")(.|\n)*?"""\1/,
  174. relevance: 1
  175. };
  176. const VERBATIM_STRING = {
  177. className: 'string',
  178. begin: '@"',
  179. end: '"',
  180. contains: [ { begin: '""' } ]
  181. };
  182. const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\n/ });
  183. const SUBST = {
  184. className: 'subst',
  185. begin: /\{/,
  186. end: /\}/,
  187. keywords: KEYWORDS
  188. };
  189. const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\n/ });
  190. const INTERPOLATED_STRING = {
  191. className: 'string',
  192. begin: /\$"/,
  193. end: '"',
  194. illegal: /\n/,
  195. contains: [
  196. { begin: /\{\{/ },
  197. { begin: /\}\}/ },
  198. hljs.BACKSLASH_ESCAPE,
  199. SUBST_NO_LF
  200. ]
  201. };
  202. const INTERPOLATED_VERBATIM_STRING = {
  203. className: 'string',
  204. begin: /\$@"/,
  205. end: '"',
  206. contains: [
  207. { begin: /\{\{/ },
  208. { begin: /\}\}/ },
  209. { begin: '""' },
  210. SUBST
  211. ]
  212. };
  213. const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
  214. illegal: /\n/,
  215. contains: [
  216. { begin: /\{\{/ },
  217. { begin: /\}\}/ },
  218. { begin: '""' },
  219. SUBST_NO_LF
  220. ]
  221. });
  222. SUBST.contains = [
  223. INTERPOLATED_VERBATIM_STRING,
  224. INTERPOLATED_STRING,
  225. VERBATIM_STRING,
  226. hljs.APOS_STRING_MODE,
  227. hljs.QUOTE_STRING_MODE,
  228. NUMBERS,
  229. hljs.C_BLOCK_COMMENT_MODE
  230. ];
  231. SUBST_NO_LF.contains = [
  232. INTERPOLATED_VERBATIM_STRING_NO_LF,
  233. INTERPOLATED_STRING,
  234. VERBATIM_STRING_NO_LF,
  235. hljs.APOS_STRING_MODE,
  236. hljs.QUOTE_STRING_MODE,
  237. NUMBERS,
  238. hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\n/ })
  239. ];
  240. const STRING = { variants: [
  241. RAW_STRING,
  242. INTERPOLATED_VERBATIM_STRING,
  243. INTERPOLATED_STRING,
  244. VERBATIM_STRING,
  245. hljs.APOS_STRING_MODE,
  246. hljs.QUOTE_STRING_MODE
  247. ] };
  248. const GENERIC_MODIFIER = {
  249. begin: "<",
  250. end: ">",
  251. contains: [
  252. { beginKeywords: "in out" },
  253. TITLE_MODE
  254. ]
  255. };
  256. const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
  257. const AT_IDENTIFIER = {
  258. // prevents expressions like `@class` from incorrect flagging
  259. // `class` as a keyword
  260. begin: "@" + hljs.IDENT_RE,
  261. relevance: 0
  262. };
  263. return {
  264. name: 'C#',
  265. aliases: [
  266. 'cs',
  267. 'c#'
  268. ],
  269. keywords: KEYWORDS,
  270. illegal: /::/,
  271. contains: [
  272. hljs.COMMENT(
  273. '///',
  274. '$',
  275. {
  276. returnBegin: true,
  277. contains: [
  278. {
  279. className: 'doctag',
  280. variants: [
  281. {
  282. begin: '///',
  283. relevance: 0
  284. },
  285. { begin: '<!--|-->' },
  286. {
  287. begin: '</?',
  288. end: '>'
  289. }
  290. ]
  291. }
  292. ]
  293. }
  294. ),
  295. hljs.C_LINE_COMMENT_MODE,
  296. hljs.C_BLOCK_COMMENT_MODE,
  297. {
  298. className: 'meta',
  299. begin: '#',
  300. end: '$',
  301. keywords: { keyword: 'if else elif endif define undef warning error line region endregion pragma checksum' }
  302. },
  303. STRING,
  304. NUMBERS,
  305. {
  306. beginKeywords: 'class interface',
  307. relevance: 0,
  308. end: /[{;=]/,
  309. illegal: /[^\s:,]/,
  310. contains: [
  311. { beginKeywords: "where class" },
  312. TITLE_MODE,
  313. GENERIC_MODIFIER,
  314. hljs.C_LINE_COMMENT_MODE,
  315. hljs.C_BLOCK_COMMENT_MODE
  316. ]
  317. },
  318. {
  319. beginKeywords: 'namespace',
  320. relevance: 0,
  321. end: /[{;=]/,
  322. illegal: /[^\s:]/,
  323. contains: [
  324. TITLE_MODE,
  325. hljs.C_LINE_COMMENT_MODE,
  326. hljs.C_BLOCK_COMMENT_MODE
  327. ]
  328. },
  329. {
  330. beginKeywords: 'record',
  331. relevance: 0,
  332. end: /[{;=]/,
  333. illegal: /[^\s:]/,
  334. contains: [
  335. TITLE_MODE,
  336. GENERIC_MODIFIER,
  337. hljs.C_LINE_COMMENT_MODE,
  338. hljs.C_BLOCK_COMMENT_MODE
  339. ]
  340. },
  341. {
  342. // [Attributes("")]
  343. className: 'meta',
  344. begin: '^\\s*\\[(?=[\\w])',
  345. excludeBegin: true,
  346. end: '\\]',
  347. excludeEnd: true,
  348. contains: [
  349. {
  350. className: 'string',
  351. begin: /"/,
  352. end: /"/
  353. }
  354. ]
  355. },
  356. {
  357. // Expression keywords prevent 'keyword Name(...)' from being
  358. // recognized as a function definition
  359. beginKeywords: 'new return throw await else',
  360. relevance: 0
  361. },
  362. {
  363. className: 'function',
  364. begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(',
  365. returnBegin: true,
  366. end: /\s*[{;=]/,
  367. excludeEnd: true,
  368. keywords: KEYWORDS,
  369. contains: [
  370. // prevents these from being highlighted `title`
  371. {
  372. beginKeywords: FUNCTION_MODIFIERS.join(" "),
  373. relevance: 0
  374. },
  375. {
  376. begin: hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(',
  377. returnBegin: true,
  378. contains: [
  379. hljs.TITLE_MODE,
  380. GENERIC_MODIFIER
  381. ],
  382. relevance: 0
  383. },
  384. { match: /\(\)/ },
  385. {
  386. className: 'params',
  387. begin: /\(/,
  388. end: /\)/,
  389. excludeBegin: true,
  390. excludeEnd: true,
  391. keywords: KEYWORDS,
  392. relevance: 0,
  393. contains: [
  394. STRING,
  395. NUMBERS,
  396. hljs.C_BLOCK_COMMENT_MODE
  397. ]
  398. },
  399. hljs.C_LINE_COMMENT_MODE,
  400. hljs.C_BLOCK_COMMENT_MODE
  401. ]
  402. },
  403. AT_IDENTIFIER
  404. ]
  405. };
  406. }
  407. export { csharp as default };