csharp.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. /*
  2. Language: C#
  3. Author: Jason Diamond <jason@diamond.name>
  4. Contributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>
  5. Website: https://docs.microsoft.com/en-us/dotnet/csharp/
  6. Category: common
  7. */
  8. /** @type LanguageFn */
  9. function csharp(hljs) {
  10. var KEYWORDS = {
  11. keyword:
  12. // Normal keywords.
  13. 'abstract as base bool break byte case catch char checked const continue decimal ' +
  14. 'default delegate do double enum event explicit extern finally fixed float ' +
  15. 'for foreach goto if implicit in int interface internal is lock long ' +
  16. 'object operator out override params private protected public readonly ref sbyte ' +
  17. 'sealed short sizeof stackalloc static string struct switch this try typeof ' +
  18. 'uint ulong unchecked unsafe ushort using virtual void volatile while ' +
  19. // Contextual keywords.
  20. 'add alias ascending async await by descending dynamic equals from get global group into join ' +
  21. 'let nameof on orderby partial remove select set value var when where yield',
  22. literal:
  23. 'null false true'
  24. };
  25. var TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, {begin: '[a-zA-Z](\\.?\\w)*'});
  26. var NUMBERS = {
  27. className: 'number',
  28. variants: [
  29. { begin: '\\b(0b[01\']+)' },
  30. { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
  31. { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
  32. ],
  33. relevance: 0
  34. };
  35. var VERBATIM_STRING = {
  36. className: 'string',
  37. begin: '@"', end: '"',
  38. contains: [{begin: '""'}]
  39. };
  40. var VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, {illegal: /\n/});
  41. var SUBST = {
  42. className: 'subst',
  43. begin: '{', end: '}',
  44. keywords: KEYWORDS
  45. };
  46. var SUBST_NO_LF = hljs.inherit(SUBST, {illegal: /\n/});
  47. var INTERPOLATED_STRING = {
  48. className: 'string',
  49. begin: /\$"/, end: '"',
  50. illegal: /\n/,
  51. contains: [{begin: '{{'}, {begin: '}}'}, hljs.BACKSLASH_ESCAPE, SUBST_NO_LF]
  52. };
  53. var INTERPOLATED_VERBATIM_STRING = {
  54. className: 'string',
  55. begin: /\$@"/, end: '"',
  56. contains: [{begin: '{{'}, {begin: '}}'}, {begin: '""'}, SUBST]
  57. };
  58. var INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
  59. illegal: /\n/,
  60. contains: [{begin: '{{'}, {begin: '}}'}, {begin: '""'}, SUBST_NO_LF]
  61. });
  62. SUBST.contains = [
  63. INTERPOLATED_VERBATIM_STRING,
  64. INTERPOLATED_STRING,
  65. VERBATIM_STRING,
  66. hljs.APOS_STRING_MODE,
  67. hljs.QUOTE_STRING_MODE,
  68. NUMBERS,
  69. hljs.C_BLOCK_COMMENT_MODE
  70. ];
  71. SUBST_NO_LF.contains = [
  72. INTERPOLATED_VERBATIM_STRING_NO_LF,
  73. INTERPOLATED_STRING,
  74. VERBATIM_STRING_NO_LF,
  75. hljs.APOS_STRING_MODE,
  76. hljs.QUOTE_STRING_MODE,
  77. NUMBERS,
  78. hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, {illegal: /\n/})
  79. ];
  80. var STRING = {
  81. variants: [
  82. INTERPOLATED_VERBATIM_STRING,
  83. INTERPOLATED_STRING,
  84. VERBATIM_STRING,
  85. hljs.APOS_STRING_MODE,
  86. hljs.QUOTE_STRING_MODE
  87. ]
  88. };
  89. var GENERIC_MODIFIER = {
  90. begin: "<",
  91. end: ">",
  92. contains: [
  93. { beginKeywords: "in out"},
  94. TITLE_MODE
  95. ]
  96. };
  97. var TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
  98. var AT_IDENTIFIER = {
  99. // prevents expressions like `@class` from incorrect flagging
  100. // `class` as a keyword
  101. begin: "@" + hljs.IDENT_RE,
  102. relevance: 0
  103. };
  104. return {
  105. name: 'C#',
  106. aliases: ['cs', 'c#'],
  107. keywords: KEYWORDS,
  108. illegal: /::/,
  109. contains: [
  110. hljs.COMMENT(
  111. '///',
  112. '$',
  113. {
  114. returnBegin: true,
  115. contains: [
  116. {
  117. className: 'doctag',
  118. variants: [
  119. {
  120. begin: '///', relevance: 0
  121. },
  122. {
  123. begin: '<!--|-->'
  124. },
  125. {
  126. begin: '</?', end: '>'
  127. }
  128. ]
  129. }
  130. ]
  131. }
  132. ),
  133. hljs.C_LINE_COMMENT_MODE,
  134. hljs.C_BLOCK_COMMENT_MODE,
  135. {
  136. className: 'meta',
  137. begin: '#', end: '$',
  138. keywords: {
  139. 'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'
  140. }
  141. },
  142. STRING,
  143. NUMBERS,
  144. {
  145. beginKeywords: 'class interface', end: /[{;=]/,
  146. illegal: /[^\s:,]/,
  147. contains: [
  148. { beginKeywords: "where class" },
  149. TITLE_MODE,
  150. GENERIC_MODIFIER,
  151. hljs.C_LINE_COMMENT_MODE,
  152. hljs.C_BLOCK_COMMENT_MODE
  153. ]
  154. },
  155. {
  156. beginKeywords: 'namespace', end: /[{;=]/,
  157. illegal: /[^\s:]/,
  158. contains: [
  159. TITLE_MODE,
  160. hljs.C_LINE_COMMENT_MODE,
  161. hljs.C_BLOCK_COMMENT_MODE
  162. ]
  163. },
  164. {
  165. // [Attributes("")]
  166. className: 'meta',
  167. begin: '^\\s*\\[', excludeBegin: true, end: '\\]', excludeEnd: true,
  168. contains: [
  169. {className: 'meta-string', begin: /"/, end: /"/}
  170. ]
  171. },
  172. {
  173. // Expression keywords prevent 'keyword Name(...)' from being
  174. // recognized as a function definition
  175. beginKeywords: 'new return throw await else',
  176. relevance: 0
  177. },
  178. {
  179. className: 'function',
  180. begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(\\<.+\\>)?\\s*\\(', returnBegin: true,
  181. end: /\s*[{;=]/, excludeEnd: true,
  182. keywords: KEYWORDS,
  183. contains: [
  184. {
  185. begin: hljs.IDENT_RE + '\\s*(\\<.+\\>)?\\s*\\(', returnBegin: true,
  186. contains: [
  187. hljs.TITLE_MODE,
  188. GENERIC_MODIFIER
  189. ],
  190. relevance: 0
  191. },
  192. {
  193. className: 'params',
  194. begin: /\(/, end: /\)/,
  195. excludeBegin: true,
  196. excludeEnd: true,
  197. keywords: KEYWORDS,
  198. relevance: 0,
  199. contains: [
  200. STRING,
  201. NUMBERS,
  202. hljs.C_BLOCK_COMMENT_MODE
  203. ]
  204. },
  205. hljs.C_LINE_COMMENT_MODE,
  206. hljs.C_BLOCK_COMMENT_MODE
  207. ]
  208. },
  209. AT_IDENTIFIER
  210. ]
  211. };
  212. }
  213. module.exports = csharp;