rust.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /*
  2. Language: Rust
  3. Author: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
  4. Contributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com>
  5. Website: https://www.rust-lang.org
  6. Category: common, system
  7. */
  8. /** @type LanguageFn */
  9. function rust(hljs) {
  10. const regex = hljs.regex;
  11. const FUNCTION_INVOKE = {
  12. className: "title.function.invoke",
  13. relevance: 0,
  14. begin: regex.concat(
  15. /\b/,
  16. /(?!let\b)/,
  17. hljs.IDENT_RE,
  18. regex.lookahead(/\s*\(/))
  19. };
  20. const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\?';
  21. const KEYWORDS = [
  22. "abstract",
  23. "as",
  24. "async",
  25. "await",
  26. "become",
  27. "box",
  28. "break",
  29. "const",
  30. "continue",
  31. "crate",
  32. "do",
  33. "dyn",
  34. "else",
  35. "enum",
  36. "extern",
  37. "false",
  38. "final",
  39. "fn",
  40. "for",
  41. "if",
  42. "impl",
  43. "in",
  44. "let",
  45. "loop",
  46. "macro",
  47. "match",
  48. "mod",
  49. "move",
  50. "mut",
  51. "override",
  52. "priv",
  53. "pub",
  54. "ref",
  55. "return",
  56. "self",
  57. "Self",
  58. "static",
  59. "struct",
  60. "super",
  61. "trait",
  62. "true",
  63. "try",
  64. "type",
  65. "typeof",
  66. "unsafe",
  67. "unsized",
  68. "use",
  69. "virtual",
  70. "where",
  71. "while",
  72. "yield"
  73. ];
  74. const LITERALS = [
  75. "true",
  76. "false",
  77. "Some",
  78. "None",
  79. "Ok",
  80. "Err"
  81. ];
  82. const BUILTINS = [
  83. // functions
  84. 'drop ',
  85. // traits
  86. "Copy",
  87. "Send",
  88. "Sized",
  89. "Sync",
  90. "Drop",
  91. "Fn",
  92. "FnMut",
  93. "FnOnce",
  94. "ToOwned",
  95. "Clone",
  96. "Debug",
  97. "PartialEq",
  98. "PartialOrd",
  99. "Eq",
  100. "Ord",
  101. "AsRef",
  102. "AsMut",
  103. "Into",
  104. "From",
  105. "Default",
  106. "Iterator",
  107. "Extend",
  108. "IntoIterator",
  109. "DoubleEndedIterator",
  110. "ExactSizeIterator",
  111. "SliceConcatExt",
  112. "ToString",
  113. // macros
  114. "assert!",
  115. "assert_eq!",
  116. "bitflags!",
  117. "bytes!",
  118. "cfg!",
  119. "col!",
  120. "concat!",
  121. "concat_idents!",
  122. "debug_assert!",
  123. "debug_assert_eq!",
  124. "env!",
  125. "panic!",
  126. "file!",
  127. "format!",
  128. "format_args!",
  129. "include_bytes!",
  130. "include_str!",
  131. "line!",
  132. "local_data_key!",
  133. "module_path!",
  134. "option_env!",
  135. "print!",
  136. "println!",
  137. "select!",
  138. "stringify!",
  139. "try!",
  140. "unimplemented!",
  141. "unreachable!",
  142. "vec!",
  143. "write!",
  144. "writeln!",
  145. "macro_rules!",
  146. "assert_ne!",
  147. "debug_assert_ne!"
  148. ];
  149. const TYPES = [
  150. "i8",
  151. "i16",
  152. "i32",
  153. "i64",
  154. "i128",
  155. "isize",
  156. "u8",
  157. "u16",
  158. "u32",
  159. "u64",
  160. "u128",
  161. "usize",
  162. "f32",
  163. "f64",
  164. "str",
  165. "char",
  166. "bool",
  167. "Box",
  168. "Option",
  169. "Result",
  170. "String",
  171. "Vec"
  172. ];
  173. return {
  174. name: 'Rust',
  175. aliases: [ 'rs' ],
  176. keywords: {
  177. $pattern: hljs.IDENT_RE + '!?',
  178. type: TYPES,
  179. keyword: KEYWORDS,
  180. literal: LITERALS,
  181. built_in: BUILTINS
  182. },
  183. illegal: '</',
  184. contains: [
  185. hljs.C_LINE_COMMENT_MODE,
  186. hljs.COMMENT('/\\*', '\\*/', { contains: [ 'self' ] }),
  187. hljs.inherit(hljs.QUOTE_STRING_MODE, {
  188. begin: /b?"/,
  189. illegal: null
  190. }),
  191. {
  192. className: 'string',
  193. variants: [
  194. { begin: /b?r(#*)"(.|\n)*?"\1(?!#)/ },
  195. { begin: /b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/ }
  196. ]
  197. },
  198. {
  199. className: 'symbol',
  200. begin: /'[a-zA-Z_][a-zA-Z0-9_]*/
  201. },
  202. {
  203. className: 'number',
  204. variants: [
  205. { begin: '\\b0b([01_]+)' + NUMBER_SUFFIX },
  206. { begin: '\\b0o([0-7_]+)' + NUMBER_SUFFIX },
  207. { begin: '\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX },
  208. { begin: '\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)'
  209. + NUMBER_SUFFIX }
  210. ],
  211. relevance: 0
  212. },
  213. {
  214. begin: [
  215. /fn/,
  216. /\s+/,
  217. hljs.UNDERSCORE_IDENT_RE
  218. ],
  219. className: {
  220. 1: "keyword",
  221. 3: "title.function"
  222. }
  223. },
  224. {
  225. className: 'meta',
  226. begin: '#!?\\[',
  227. end: '\\]',
  228. contains: [
  229. {
  230. className: 'string',
  231. begin: /"/,
  232. end: /"/
  233. }
  234. ]
  235. },
  236. {
  237. begin: [
  238. /let/,
  239. /\s+/,
  240. /(?:mut\s+)?/,
  241. hljs.UNDERSCORE_IDENT_RE
  242. ],
  243. className: {
  244. 1: "keyword",
  245. 3: "keyword",
  246. 4: "variable"
  247. }
  248. },
  249. // must come before impl/for rule later
  250. {
  251. begin: [
  252. /for/,
  253. /\s+/,
  254. hljs.UNDERSCORE_IDENT_RE,
  255. /\s+/,
  256. /in/
  257. ],
  258. className: {
  259. 1: "keyword",
  260. 3: "variable",
  261. 5: "keyword"
  262. }
  263. },
  264. {
  265. begin: [
  266. /type/,
  267. /\s+/,
  268. hljs.UNDERSCORE_IDENT_RE
  269. ],
  270. className: {
  271. 1: "keyword",
  272. 3: "title.class"
  273. }
  274. },
  275. {
  276. begin: [
  277. /(?:trait|enum|struct|union|impl|for)/,
  278. /\s+/,
  279. hljs.UNDERSCORE_IDENT_RE
  280. ],
  281. className: {
  282. 1: "keyword",
  283. 3: "title.class"
  284. }
  285. },
  286. {
  287. begin: hljs.IDENT_RE + '::',
  288. keywords: {
  289. keyword: "Self",
  290. built_in: BUILTINS,
  291. type: TYPES
  292. }
  293. },
  294. {
  295. className: "punctuation",
  296. begin: '->'
  297. },
  298. FUNCTION_INVOKE
  299. ]
  300. };
  301. }
  302. module.exports = rust;