scala.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /*!-----------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Version: 0.31.1(337587859b1c171314b40503171188b6cea6a32a)
  4. * Released under the MIT license
  5. * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt
  6. *-----------------------------------------------------------------------------*/
  7. // src/basic-languages/scala/scala.ts
  8. var conf = {
  9. wordPattern: /(unary_[@~!#%^&*()\-=+\\|:<>\/?]+)|([a-zA-Z_$][\w$]*?_=)|(`[^`]+`)|([a-zA-Z_$][\w$]*)/g,
  10. comments: {
  11. lineComment: "//",
  12. blockComment: ["/*", "*/"]
  13. },
  14. brackets: [
  15. ["{", "}"],
  16. ["[", "]"],
  17. ["(", ")"]
  18. ],
  19. autoClosingPairs: [
  20. { open: "{", close: "}" },
  21. { open: "[", close: "]" },
  22. { open: "(", close: ")" },
  23. { open: '"', close: '"' },
  24. { open: "'", close: "'" }
  25. ],
  26. surroundingPairs: [
  27. { open: "{", close: "}" },
  28. { open: "[", close: "]" },
  29. { open: "(", close: ")" },
  30. { open: '"', close: '"' },
  31. { open: "'", close: "'" }
  32. ],
  33. folding: {
  34. markers: {
  35. start: new RegExp("^\\s*//\\s*(?:(?:#?region\\b)|(?:<editor-fold\\b))"),
  36. end: new RegExp("^\\s*//\\s*(?:(?:#?endregion\\b)|(?:</editor-fold>))")
  37. }
  38. }
  39. };
  40. var language = {
  41. tokenPostfix: ".scala",
  42. keywords: [
  43. "asInstanceOf",
  44. "catch",
  45. "class",
  46. "classOf",
  47. "def",
  48. "do",
  49. "else",
  50. "extends",
  51. "finally",
  52. "for",
  53. "foreach",
  54. "forSome",
  55. "if",
  56. "import",
  57. "isInstanceOf",
  58. "macro",
  59. "match",
  60. "new",
  61. "object",
  62. "package",
  63. "return",
  64. "throw",
  65. "trait",
  66. "try",
  67. "type",
  68. "until",
  69. "val",
  70. "var",
  71. "while",
  72. "with",
  73. "yield",
  74. "given",
  75. "enum",
  76. "then"
  77. ],
  78. softKeywords: ["as", "export", "extension", "end", "derives", "on"],
  79. constants: ["true", "false", "null", "this", "super"],
  80. modifiers: [
  81. "abstract",
  82. "final",
  83. "implicit",
  84. "lazy",
  85. "override",
  86. "private",
  87. "protected",
  88. "sealed"
  89. ],
  90. softModifiers: ["inline", "opaque", "open", "transparent", "using"],
  91. name: /(?:[a-z_$][\w$]*|`[^`]+`)/,
  92. type: /(?:[A-Z][\w$]*)/,
  93. symbols: /[=><!~?:&|+\-*\/^\\%@#]+/,
  94. digits: /\d+(_+\d+)*/,
  95. hexdigits: /[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,
  96. escapes: /\\(?:[btnfr\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
  97. fstring_conv: /[bBhHsScCdoxXeEfgGaAt]|[Tn](?:[HIklMSLNpzZsQ]|[BbhAaCYyjmde]|[RTrDFC])/,
  98. tokenizer: {
  99. root: [
  100. [/\braw"""/, { token: "string.quote", bracket: "@open", next: "@rawstringt" }],
  101. [/\braw"/, { token: "string.quote", bracket: "@open", next: "@rawstring" }],
  102. [/\bs"""/, { token: "string.quote", bracket: "@open", next: "@sstringt" }],
  103. [/\bs"/, { token: "string.quote", bracket: "@open", next: "@sstring" }],
  104. [/\bf""""/, { token: "string.quote", bracket: "@open", next: "@fstringt" }],
  105. [/\bf"/, { token: "string.quote", bracket: "@open", next: "@fstring" }],
  106. [/"""/, { token: "string.quote", bracket: "@open", next: "@stringt" }],
  107. [/"/, { token: "string.quote", bracket: "@open", next: "@string" }],
  108. [/(@digits)[eE]([\-+]?(@digits))?[fFdD]?/, "number.float", "@allowMethod"],
  109. [/(@digits)\.(@digits)([eE][\-+]?(@digits))?[fFdD]?/, "number.float", "@allowMethod"],
  110. [/0[xX](@hexdigits)[Ll]?/, "number.hex", "@allowMethod"],
  111. [/(@digits)[fFdD]/, "number.float", "@allowMethod"],
  112. [/(@digits)[lL]?/, "number", "@allowMethod"],
  113. [/\b_\*/, "key"],
  114. [/\b(_)\b/, "keyword", "@allowMethod"],
  115. [/\bimport\b/, "keyword", "@import"],
  116. [/\b(case)([ \t]+)(class)\b/, ["keyword.modifier", "white", "keyword"]],
  117. [/\bcase\b/, "keyword", "@case"],
  118. [/\bva[lr]\b/, "keyword", "@vardef"],
  119. [
  120. /\b(def)([ \t]+)((?:unary_)?@symbols|@name(?:_=)|@name)/,
  121. ["keyword", "white", "identifier"]
  122. ],
  123. [/@name(?=[ \t]*:(?!:))/, "variable"],
  124. [/(\.)(@name|@symbols)/, ["operator", { token: "@rematch", next: "@allowMethod" }]],
  125. [/([{(])(\s*)(@name(?=\s*=>))/, ["@brackets", "white", "variable"]],
  126. [
  127. /@name/,
  128. {
  129. cases: {
  130. "@keywords": "keyword",
  131. "@softKeywords": "keyword",
  132. "@modifiers": "keyword.modifier",
  133. "@softModifiers": "keyword.modifier",
  134. "@constants": {
  135. token: "constant",
  136. next: "@allowMethod"
  137. },
  138. "@default": {
  139. token: "identifier",
  140. next: "@allowMethod"
  141. }
  142. }
  143. }
  144. ],
  145. [/@type/, "type", "@allowMethod"],
  146. { include: "@whitespace" },
  147. [/@[a-zA-Z_$][\w$]*(?:\.[a-zA-Z_$][\w$]*)*/, "annotation"],
  148. [/[{(]/, "@brackets"],
  149. [/[})]/, "@brackets", "@allowMethod"],
  150. [/\[/, "operator.square"],
  151. [/](?!\s*(?:va[rl]|def|type)\b)/, "operator.square", "@allowMethod"],
  152. [/]/, "operator.square"],
  153. [/([=-]>|<-|>:|<:|:>|<%)(?=[\s\w()[\]{},\."'`])/, "keyword"],
  154. [/@symbols/, "operator"],
  155. [/[;,\.]/, "delimiter"],
  156. [/'[a-zA-Z$][\w$]*(?!')/, "attribute.name"],
  157. [/'[^\\']'/, "string", "@allowMethod"],
  158. [/(')(@escapes)(')/, ["string", "string.escape", { token: "string", next: "@allowMethod" }]],
  159. [/'/, "string.invalid"]
  160. ],
  161. import: [
  162. [/;/, "delimiter", "@pop"],
  163. [/^|$/, "", "@pop"],
  164. [/[ \t]+/, "white"],
  165. [/[\n\r]+/, "white", "@pop"],
  166. [/\/\*/, "comment", "@comment"],
  167. [/@name|@type/, "type"],
  168. [/[(){}]/, "@brackets"],
  169. [/[[\]]/, "operator.square"],
  170. [/[\.,]/, "delimiter"]
  171. ],
  172. allowMethod: [
  173. [/^|$/, "", "@pop"],
  174. [/[ \t]+/, "white"],
  175. [/[\n\r]+/, "white", "@pop"],
  176. [/\/\*/, "comment", "@comment"],
  177. [/(?==>[\s\w([{])/, "keyword", "@pop"],
  178. [
  179. /(@name|@symbols)(?=[ \t]*[[({"'`]|[ \t]+(?:[+-]?\.?\d|\w))/,
  180. {
  181. cases: {
  182. "@keywords": { token: "keyword", next: "@pop" },
  183. "->|<-|>:|<:|<%": { token: "keyword", next: "@pop" },
  184. "@default": { token: "@rematch", next: "@pop" }
  185. }
  186. }
  187. ],
  188. ["", "", "@pop"]
  189. ],
  190. comment: [
  191. [/[^\/*]+/, "comment"],
  192. [/\/\*/, "comment", "@push"],
  193. [/\*\//, "comment", "@pop"],
  194. [/[\/*]/, "comment"]
  195. ],
  196. case: [
  197. [/\b_\*/, "key"],
  198. [/\b(_|true|false|null|this|super)\b/, "keyword", "@allowMethod"],
  199. [/\bif\b|=>/, "keyword", "@pop"],
  200. [/`[^`]+`/, "identifier", "@allowMethod"],
  201. [/@name/, "variable", "@allowMethod"],
  202. [/:::?|\||@(?![a-z_$])/, "keyword"],
  203. { include: "@root" }
  204. ],
  205. vardef: [
  206. [/\b_\*/, "key"],
  207. [/\b(_|true|false|null|this|super)\b/, "keyword"],
  208. [/@name/, "variable"],
  209. [/:::?|\||@(?![a-z_$])/, "keyword"],
  210. [/=|:(?!:)/, "operator", "@pop"],
  211. [/$/, "white", "@pop"],
  212. { include: "@root" }
  213. ],
  214. string: [
  215. [/[^\\"\n\r]+/, "string"],
  216. [/@escapes/, "string.escape"],
  217. [/\\./, "string.escape.invalid"],
  218. [
  219. /"/,
  220. {
  221. token: "string.quote",
  222. bracket: "@close",
  223. switchTo: "@allowMethod"
  224. }
  225. ]
  226. ],
  227. stringt: [
  228. [/[^\\"\n\r]+/, "string"],
  229. [/@escapes/, "string.escape"],
  230. [/\\./, "string.escape.invalid"],
  231. [/"(?=""")/, "string"],
  232. [
  233. /"""/,
  234. {
  235. token: "string.quote",
  236. bracket: "@close",
  237. switchTo: "@allowMethod"
  238. }
  239. ],
  240. [/"/, "string"]
  241. ],
  242. fstring: [
  243. [/@escapes/, "string.escape"],
  244. [
  245. /"/,
  246. {
  247. token: "string.quote",
  248. bracket: "@close",
  249. switchTo: "@allowMethod"
  250. }
  251. ],
  252. [/\$\$/, "string"],
  253. [/(\$)([a-z_]\w*)/, ["operator", "identifier"]],
  254. [/\$\{/, "operator", "@interp"],
  255. [/%%/, "string"],
  256. [
  257. /(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,
  258. ["metatag", "keyword.modifier", "number", "metatag"]
  259. ],
  260. [/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/, ["metatag", "number", "metatag"]],
  261. [/(%)([\-#+ 0,(])(@fstring_conv)/, ["metatag", "keyword.modifier", "metatag"]],
  262. [/(%)(@fstring_conv)/, ["metatag", "metatag"]],
  263. [/./, "string"]
  264. ],
  265. fstringt: [
  266. [/@escapes/, "string.escape"],
  267. [/"(?=""")/, "string"],
  268. [
  269. /"""/,
  270. {
  271. token: "string.quote",
  272. bracket: "@close",
  273. switchTo: "@allowMethod"
  274. }
  275. ],
  276. [/\$\$/, "string"],
  277. [/(\$)([a-z_]\w*)/, ["operator", "identifier"]],
  278. [/\$\{/, "operator", "@interp"],
  279. [/%%/, "string"],
  280. [
  281. /(%)([\-#+ 0,(])(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/,
  282. ["metatag", "keyword.modifier", "number", "metatag"]
  283. ],
  284. [/(%)(\d+|\.\d+|\d+\.\d+)(@fstring_conv)/, ["metatag", "number", "metatag"]],
  285. [/(%)([\-#+ 0,(])(@fstring_conv)/, ["metatag", "keyword.modifier", "metatag"]],
  286. [/(%)(@fstring_conv)/, ["metatag", "metatag"]],
  287. [/./, "string"]
  288. ],
  289. sstring: [
  290. [/@escapes/, "string.escape"],
  291. [
  292. /"/,
  293. {
  294. token: "string.quote",
  295. bracket: "@close",
  296. switchTo: "@allowMethod"
  297. }
  298. ],
  299. [/\$\$/, "string"],
  300. [/(\$)([a-z_]\w*)/, ["operator", "identifier"]],
  301. [/\$\{/, "operator", "@interp"],
  302. [/./, "string"]
  303. ],
  304. sstringt: [
  305. [/@escapes/, "string.escape"],
  306. [/"(?=""")/, "string"],
  307. [
  308. /"""/,
  309. {
  310. token: "string.quote",
  311. bracket: "@close",
  312. switchTo: "@allowMethod"
  313. }
  314. ],
  315. [/\$\$/, "string"],
  316. [/(\$)([a-z_]\w*)/, ["operator", "identifier"]],
  317. [/\$\{/, "operator", "@interp"],
  318. [/./, "string"]
  319. ],
  320. interp: [[/{/, "operator", "@push"], [/}/, "operator", "@pop"], { include: "@root" }],
  321. rawstring: [
  322. [/[^"]/, "string"],
  323. [
  324. /"/,
  325. {
  326. token: "string.quote",
  327. bracket: "@close",
  328. switchTo: "@allowMethod"
  329. }
  330. ]
  331. ],
  332. rawstringt: [
  333. [/[^"]/, "string"],
  334. [/"(?=""")/, "string"],
  335. [
  336. /"""/,
  337. {
  338. token: "string.quote",
  339. bracket: "@close",
  340. switchTo: "@allowMethod"
  341. }
  342. ],
  343. [/"/, "string"]
  344. ],
  345. whitespace: [
  346. [/[ \t\r\n]+/, "white"],
  347. [/\/\*/, "comment", "@comment"],
  348. [/\/\/.*$/, "comment"]
  349. ]
  350. }
  351. };
  352. export {
  353. conf,
  354. language
  355. };