app-ai-solution-exp 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/bin/app-ai-solution-exp.js +20 -0
  2. package/out/main/index.js +1631 -0
  3. package/out/preload/index.js +108 -0
  4. package/out/renderer/assets/abap-D5KwWAsZ.js +1399 -0
  5. package/out/renderer/assets/apex-DVGUZ64i.js +331 -0
  6. package/out/renderer/assets/azcli-BEAhqcuE.js +69 -0
  7. package/out/renderer/assets/bat-Bqkp9Cfu.js +101 -0
  8. package/out/renderer/assets/bicep-DIlfshcM.js +110 -0
  9. package/out/renderer/assets/cameligo-CLaaYNMV.js +175 -0
  10. package/out/renderer/assets/clojure-fcgFaMHx.js +762 -0
  11. package/out/renderer/assets/codicon-ngg6Pgfi.ttf +0 -0
  12. package/out/renderer/assets/coffee-CzJ5oEdj.js +233 -0
  13. package/out/renderer/assets/cpp-CcN6f0ik.js +390 -0
  14. package/out/renderer/assets/csharp-BJeIuvde.js +327 -0
  15. package/out/renderer/assets/csp-D_3BK2Wp.js +54 -0
  16. package/out/renderer/assets/css-i3rI3_64.js +186 -0
  17. package/out/renderer/assets/css.worker-umuuUiIb.js +53567 -0
  18. package/out/renderer/assets/cssMode-BlKZF8mS.js +208 -0
  19. package/out/renderer/assets/cypher-D0--_GAN.js +264 -0
  20. package/out/renderer/assets/dart-vLMHv35g.js +282 -0
  21. package/out/renderer/assets/dockerfile--oxj0cAH.js +131 -0
  22. package/out/renderer/assets/ecl-CeuUgzaZ.js +457 -0
  23. package/out/renderer/assets/editor.worker-CNgWLVu7.js +13695 -0
  24. package/out/renderer/assets/elixir-eLfY1jWH.js +570 -0
  25. package/out/renderer/assets/flow9-ZSTChSMd.js +143 -0
  26. package/out/renderer/assets/freemarker2-BTb0QKKy.js +995 -0
  27. package/out/renderer/assets/fsharp-D2uoxuLH.js +218 -0
  28. package/out/renderer/assets/go-brnMpFrj.js +219 -0
  29. package/out/renderer/assets/graphql-BeiGgjIU.js +152 -0
  30. package/out/renderer/assets/handlebars-DKVnkZoO.js +414 -0
  31. package/out/renderer/assets/hcl-CrX1Es2W.js +184 -0
  32. package/out/renderer/assets/html-DSHBWNSF.js +303 -0
  33. package/out/renderer/assets/html.worker-BT47iy49.js +29777 -0
  34. package/out/renderer/assets/htmlMode-hdSFcfq-.js +224 -0
  35. package/out/renderer/assets/index-ByP1RhpK.js +309272 -0
  36. package/out/renderer/assets/index-CgixHIqL.css +11502 -0
  37. package/out/renderer/assets/ini-BcQysCTb.js +72 -0
  38. package/out/renderer/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  39. package/out/renderer/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  40. package/out/renderer/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  41. package/out/renderer/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  42. package/out/renderer/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  43. package/out/renderer/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  44. package/out/renderer/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  45. package/out/renderer/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  46. package/out/renderer/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  47. package/out/renderer/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  48. package/out/renderer/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  49. package/out/renderer/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  50. package/out/renderer/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  51. package/out/renderer/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  52. package/out/renderer/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  53. package/out/renderer/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  54. package/out/renderer/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  55. package/out/renderer/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  56. package/out/renderer/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  57. package/out/renderer/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  58. package/out/renderer/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  59. package/out/renderer/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  60. package/out/renderer/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  61. package/out/renderer/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  62. package/out/renderer/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  63. package/out/renderer/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  64. package/out/renderer/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  65. package/out/renderer/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  66. package/out/renderer/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  67. package/out/renderer/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  68. package/out/renderer/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  69. package/out/renderer/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  70. package/out/renderer/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  71. package/out/renderer/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  72. package/out/renderer/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  73. package/out/renderer/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  74. package/out/renderer/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  75. package/out/renderer/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  76. package/out/renderer/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  77. package/out/renderer/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  78. package/out/renderer/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  79. package/out/renderer/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  80. package/out/renderer/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  81. package/out/renderer/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  82. package/out/renderer/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  83. package/out/renderer/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  84. package/out/renderer/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  85. package/out/renderer/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  86. package/out/renderer/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  87. package/out/renderer/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  88. package/out/renderer/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  89. package/out/renderer/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  90. package/out/renderer/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  91. package/out/renderer/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  92. package/out/renderer/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  93. package/out/renderer/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  94. package/out/renderer/assets/java-Dt3iMn2o.js +233 -0
  95. package/out/renderer/assets/javascript-Ae6t5gfn.js +72 -0
  96. package/out/renderer/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  97. package/out/renderer/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  98. package/out/renderer/assets/jetbrains-mono-cyrillic-500-normal-DJqRU3vO.woff +0 -0
  99. package/out/renderer/assets/jetbrains-mono-cyrillic-500-normal-DmUKJPL_.woff2 +0 -0
  100. package/out/renderer/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  101. package/out/renderer/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  102. package/out/renderer/assets/jetbrains-mono-greek-500-normal-D7SFKleX.woff +0 -0
  103. package/out/renderer/assets/jetbrains-mono-greek-500-normal-JpySY46c.woff2 +0 -0
  104. package/out/renderer/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  105. package/out/renderer/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  106. package/out/renderer/assets/jetbrains-mono-latin-500-normal-BWZEU5yA.woff2 +0 -0
  107. package/out/renderer/assets/jetbrains-mono-latin-500-normal-CJOVTJB7.woff +0 -0
  108. package/out/renderer/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  109. package/out/renderer/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  110. package/out/renderer/assets/jetbrains-mono-latin-ext-500-normal-Cut-4mMH.woff2 +0 -0
  111. package/out/renderer/assets/jetbrains-mono-latin-ext-500-normal-ckzbgY84.woff +0 -0
  112. package/out/renderer/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  113. package/out/renderer/assets/jetbrains-mono-vietnamese-500-normal-DNRqzVM1.woff +0 -0
  114. package/out/renderer/assets/json.worker-D4JVmXIe.js +21424 -0
  115. package/out/renderer/assets/jsonMode-B3dQSNhP.js +931 -0
  116. package/out/renderer/assets/julia-Cm3ItYL_.js +512 -0
  117. package/out/renderer/assets/kotlin-Ddo1SjA5.js +253 -0
  118. package/out/renderer/assets/less-B7Qaxw-O.js +162 -0
  119. package/out/renderer/assets/lexon-C1U0m2n9.js +158 -0
  120. package/out/renderer/assets/liquid-Zgyb8DZ5.js +235 -0
  121. package/out/renderer/assets/lspLanguageFeatures-CkDn9c2y.js +1841 -0
  122. package/out/renderer/assets/lua-hNsuGJkO.js +163 -0
  123. package/out/renderer/assets/m3-6ko6q9-_.js +211 -0
  124. package/out/renderer/assets/markdown-B0YTnTxW.js +230 -0
  125. package/out/renderer/assets/mdx-C8e8DFOf.js +159 -0
  126. package/out/renderer/assets/mips-CJm71dS3.js +199 -0
  127. package/out/renderer/assets/msdax-BBeIktCY.js +376 -0
  128. package/out/renderer/assets/mysql-BWiizXSn.js +879 -0
  129. package/out/renderer/assets/objective-c-B1L1C5EC.js +184 -0
  130. package/out/renderer/assets/pascal-DMQyD4Xk.js +252 -0
  131. package/out/renderer/assets/pascaligo-VA_LQ1oU.js +165 -0
  132. package/out/renderer/assets/perl-DC0Z0tlO.js +627 -0
  133. package/out/renderer/assets/pgsql-DaSGFTLp.js +852 -0
  134. package/out/renderer/assets/php-Bkx1qpkQ.js +501 -0
  135. package/out/renderer/assets/pla-DEV89yYj.js +138 -0
  136. package/out/renderer/assets/postiats-CVVurEnu.js +908 -0
  137. package/out/renderer/assets/powerquery-BQ_t1ZiQ.js +891 -0
  138. package/out/renderer/assets/powershell-BXiKvz7Z.js +240 -0
  139. package/out/renderer/assets/protobuf-CndvAUGu.js +421 -0
  140. package/out/renderer/assets/pug-BxCXwerb.js +403 -0
  141. package/out/renderer/assets/python-8eSQckTG.js +295 -0
  142. package/out/renderer/assets/qsharp-BWK6YLKm.js +302 -0
  143. package/out/renderer/assets/r-CtqYUQ6l.js +244 -0
  144. package/out/renderer/assets/razor-eAkN4Qfv.js +545 -0
  145. package/out/renderer/assets/redis-O7gSt3oh.js +303 -0
  146. package/out/renderer/assets/redshift-CvYMMYZY.js +810 -0
  147. package/out/renderer/assets/restructuredtext-B-KQCVu_.js +175 -0
  148. package/out/renderer/assets/ruby-DCd4DmAr.js +512 -0
  149. package/out/renderer/assets/rust-B1c0VCeq.js +344 -0
  150. package/out/renderer/assets/sb-Chfc_wZF.js +116 -0
  151. package/out/renderer/assets/scala-DbVzH-3O.js +371 -0
  152. package/out/renderer/assets/scheme-D7PxodDG.js +109 -0
  153. package/out/renderer/assets/scss-B42qMyAu.js +261 -0
  154. package/out/renderer/assets/shell-vZEubQ82.js +222 -0
  155. package/out/renderer/assets/solidity-yHOxYChb.js +1368 -0
  156. package/out/renderer/assets/sophia-D7pU0Y1d.js +200 -0
  157. package/out/renderer/assets/sparql-DxuVdnRl.js +202 -0
  158. package/out/renderer/assets/sql-BAGepFCR.js +854 -0
  159. package/out/renderer/assets/st-C-b0Dh53.js +417 -0
  160. package/out/renderer/assets/swift-BmOZGynf.js +313 -0
  161. package/out/renderer/assets/systemverilog-BOC0OOdC.js +577 -0
  162. package/out/renderer/assets/tcl-Bb4GCwBr.js +233 -0
  163. package/out/renderer/assets/ts.worker-C7hW3aY-.js +225330 -0
  164. package/out/renderer/assets/tsMode-D7ET908H.js +1265 -0
  165. package/out/renderer/assets/twig-DvgEGWAV.js +393 -0
  166. package/out/renderer/assets/typescript-BhqUlrW4.js +337 -0
  167. package/out/renderer/assets/typespec-R77Ln7Jb.js +128 -0
  168. package/out/renderer/assets/vb-Bm6ESA0Q.js +373 -0
  169. package/out/renderer/assets/wgsl-_KPae5vw.js +454 -0
  170. package/out/renderer/assets/xml-Bg3Ctug6.js +89 -0
  171. package/out/renderer/assets/yaml-C9aCL4uU.js +200 -0
  172. package/out/renderer/index.html +13 -0
  173. package/package.json +110 -0
@@ -0,0 +1,570 @@
1
+ const conf = {
2
+ comments: {
3
+ lineComment: "#"
4
+ },
5
+ brackets: [
6
+ ["{", "}"],
7
+ ["[", "]"],
8
+ ["(", ")"]
9
+ ],
10
+ surroundingPairs: [
11
+ { open: "{", close: "}" },
12
+ { open: "[", close: "]" },
13
+ { open: "(", close: ")" },
14
+ { open: "'", close: "'" },
15
+ { open: '"', close: '"' }
16
+ ],
17
+ autoClosingPairs: [
18
+ { open: "'", close: "'", notIn: ["string", "comment"] },
19
+ { open: '"', close: '"', notIn: ["comment"] },
20
+ { open: '"""', close: '"""' },
21
+ { open: "`", close: "`", notIn: ["string", "comment"] },
22
+ { open: "(", close: ")" },
23
+ { open: "{", close: "}" },
24
+ { open: "[", close: "]" },
25
+ { open: "<<", close: ">>" }
26
+ ],
27
+ indentationRules: {
28
+ increaseIndentPattern: /^\s*(after|else|catch|rescue|fn|[^#]*(do|<\-|\->|\{|\[|\=))\s*$/,
29
+ decreaseIndentPattern: /^\s*((\}|\])\s*$|(after|else|catch|rescue|end)\b)/
30
+ }
31
+ };
32
+ const language = {
33
+ defaultToken: "source",
34
+ tokenPostfix: ".elixir",
35
+ brackets: [
36
+ { open: "[", close: "]", token: "delimiter.square" },
37
+ { open: "(", close: ")", token: "delimiter.parenthesis" },
38
+ { open: "{", close: "}", token: "delimiter.curly" },
39
+ { open: "<<", close: ">>", token: "delimiter.angle.special" }
40
+ ],
41
+ // Below are lists/regexps to which we reference later.
42
+ declarationKeywords: [
43
+ "def",
44
+ "defp",
45
+ "defn",
46
+ "defnp",
47
+ "defguard",
48
+ "defguardp",
49
+ "defmacro",
50
+ "defmacrop",
51
+ "defdelegate",
52
+ "defcallback",
53
+ "defmacrocallback",
54
+ "defmodule",
55
+ "defprotocol",
56
+ "defexception",
57
+ "defimpl",
58
+ "defstruct"
59
+ ],
60
+ operatorKeywords: ["and", "in", "not", "or", "when"],
61
+ namespaceKeywords: ["alias", "import", "require", "use"],
62
+ otherKeywords: [
63
+ "after",
64
+ "case",
65
+ "catch",
66
+ "cond",
67
+ "do",
68
+ "else",
69
+ "end",
70
+ "fn",
71
+ "for",
72
+ "if",
73
+ "quote",
74
+ "raise",
75
+ "receive",
76
+ "rescue",
77
+ "super",
78
+ "throw",
79
+ "try",
80
+ "unless",
81
+ "unquote_splicing",
82
+ "unquote",
83
+ "with"
84
+ ],
85
+ constants: ["true", "false", "nil"],
86
+ nameBuiltin: ["__MODULE__", "__DIR__", "__ENV__", "__CALLER__", "__STACKTRACE__"],
87
+ // Matches any of the operator names:
88
+ // <<< >>> ||| &&& ^^^ ~~~ === !== ~>> <~> |~> <|> == != <= >= && || \\ <> ++ -- |> =~ -> <- ~> <~ :: .. = < > + - * / | . ^ & !
89
+ operator: /-[->]?|!={0,2}|\*{1,2}|\/|\\\\|&{1,3}|\.\.?|\^(?:\^\^)?|\+\+?|<(?:-|<<|=|>|\|>|~>?)?|=~|={1,3}|>(?:=|>>)?|\|~>|\|>|\|{1,3}|~>>?|~~~|::/,
90
+ // See https://hexdocs.pm/elixir/syntax-reference.html#variables
91
+ variableName: /[a-z_][a-zA-Z0-9_]*[?!]?/,
92
+ // See https://hexdocs.pm/elixir/syntax-reference.html#atoms
93
+ atomName: /[a-zA-Z_][a-zA-Z0-9_@]*[?!]?|@specialAtomName|@operator/,
94
+ specialAtomName: /\.\.\.|<<>>|%\{\}|%|\{\}/,
95
+ aliasPart: /[A-Z][a-zA-Z0-9_]*/,
96
+ moduleName: /@aliasPart(?:\.@aliasPart)*/,
97
+ // Sigil pairs are: """ """, ''' ''', " ", ' ', / /, | |, < >, { }, [ ], ( )
98
+ sigilSymmetricDelimiter: /"""|'''|"|'|\/|\|/,
99
+ sigilStartDelimiter: /@sigilSymmetricDelimiter|<|\{|\[|\(/,
100
+ sigilEndDelimiter: /@sigilSymmetricDelimiter|>|\}|\]|\)/,
101
+ sigilModifiers: /[a-zA-Z0-9]*/,
102
+ decimal: /\d(?:_?\d)*/,
103
+ hex: /[0-9a-fA-F](_?[0-9a-fA-F])*/,
104
+ octal: /[0-7](_?[0-7])*/,
105
+ binary: /[01](_?[01])*/,
106
+ // See https://hexdocs.pm/elixir/master/String.html#module-escape-characters
107
+ escape: /\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}|\\./,
108
+ // The keys below correspond to tokenizer states.
109
+ // We start from the root state and match against its rules
110
+ // until we explicitly transition into another state.
111
+ // The `include` simply brings in all operations from the given state
112
+ // and is useful for improving readability.
113
+ tokenizer: {
114
+ root: [
115
+ { include: "@whitespace" },
116
+ { include: "@comments" },
117
+ // Keywords start as either an identifier or a string,
118
+ // but end with a : so it's important to match this first.
119
+ { include: "@keywordsShorthand" },
120
+ { include: "@numbers" },
121
+ { include: "@identifiers" },
122
+ { include: "@strings" },
123
+ { include: "@atoms" },
124
+ { include: "@sigils" },
125
+ { include: "@attributes" },
126
+ { include: "@symbols" }
127
+ ],
128
+ // Whitespace
129
+ whitespace: [[/\s+/, "white"]],
130
+ // Comments
131
+ comments: [[/(#)(.*)/, ["comment.punctuation", "comment"]]],
132
+ // Keyword list shorthand
133
+ keywordsShorthand: [
134
+ [/(@atomName)(:)(\s+)/, ["constant", "constant.punctuation", "white"]],
135
+ // Use positive look-ahead to ensure the string is followed by :
136
+ // and should be considered a keyword.
137
+ [
138
+ /"(?=([^"]|#\{.*?\}|\\")*":)/,
139
+ { token: "constant.delimiter", next: "@doubleQuotedStringKeyword" }
140
+ ],
141
+ [
142
+ /'(?=([^']|#\{.*?\}|\\')*':)/,
143
+ { token: "constant.delimiter", next: "@singleQuotedStringKeyword" }
144
+ ]
145
+ ],
146
+ doubleQuotedStringKeyword: [
147
+ [/":/, { token: "constant.delimiter", next: "@pop" }],
148
+ { include: "@stringConstantContentInterpol" }
149
+ ],
150
+ singleQuotedStringKeyword: [
151
+ [/':/, { token: "constant.delimiter", next: "@pop" }],
152
+ { include: "@stringConstantContentInterpol" }
153
+ ],
154
+ // Numbers
155
+ numbers: [
156
+ [/0b@binary/, "number.binary"],
157
+ [/0o@octal/, "number.octal"],
158
+ [/0x@hex/, "number.hex"],
159
+ [/@decimal\.@decimal([eE]-?@decimal)?/, "number.float"],
160
+ [/@decimal/, "number"]
161
+ ],
162
+ // Identifiers
163
+ identifiers: [
164
+ // Tokenize identifier name in function-like definitions.
165
+ // Note: given `def a + b, do: nil`, `a` is not a function name,
166
+ // so we use negative look-ahead to ensure there's no operator.
167
+ [
168
+ /\b(defp?|defnp?|defmacrop?|defguardp?|defdelegate)(\s+)(@variableName)(?!\s+@operator)/,
169
+ [
170
+ "keyword.declaration",
171
+ "white",
172
+ {
173
+ cases: {
174
+ unquote: "keyword",
175
+ "@default": "function"
176
+ }
177
+ }
178
+ ]
179
+ ],
180
+ // Tokenize function calls
181
+ [
182
+ // In-scope call - an identifier followed by ( or .(
183
+ /(@variableName)(?=\s*\.?\s*\()/,
184
+ {
185
+ cases: {
186
+ // Tokenize as keyword in cases like `if(..., do: ..., else: ...)`
187
+ "@declarationKeywords": "keyword.declaration",
188
+ "@namespaceKeywords": "keyword",
189
+ "@otherKeywords": "keyword",
190
+ "@default": "function.call"
191
+ }
192
+ }
193
+ ],
194
+ [
195
+ // Referencing function in a module
196
+ /(@moduleName)(\s*)(\.)(\s*)(@variableName)/,
197
+ ["type.identifier", "white", "operator", "white", "function.call"]
198
+ ],
199
+ [
200
+ // Referencing function in an Erlang module
201
+ /(:)(@atomName)(\s*)(\.)(\s*)(@variableName)/,
202
+ ["constant.punctuation", "constant", "white", "operator", "white", "function.call"]
203
+ ],
204
+ [
205
+ // Piping into a function (tokenized separately as it may not have parentheses)
206
+ /(\|>)(\s*)(@variableName)/,
207
+ [
208
+ "operator",
209
+ "white",
210
+ {
211
+ cases: {
212
+ "@otherKeywords": "keyword",
213
+ "@default": "function.call"
214
+ }
215
+ }
216
+ ]
217
+ ],
218
+ [
219
+ // Function reference passed to another function
220
+ /(&)(\s*)(@variableName)/,
221
+ ["operator", "white", "function.call"]
222
+ ],
223
+ // Language keywords, builtins, constants and variables
224
+ [
225
+ /@variableName/,
226
+ {
227
+ cases: {
228
+ "@declarationKeywords": "keyword.declaration",
229
+ "@operatorKeywords": "keyword.operator",
230
+ "@namespaceKeywords": "keyword",
231
+ "@otherKeywords": "keyword",
232
+ "@constants": "constant.language",
233
+ "@nameBuiltin": "variable.language",
234
+ "_.*": "comment.unused",
235
+ "@default": "identifier"
236
+ }
237
+ }
238
+ ],
239
+ // Module names
240
+ [/@moduleName/, "type.identifier"]
241
+ ],
242
+ // Strings
243
+ strings: [
244
+ [/"""/, { token: "string.delimiter", next: "@doubleQuotedHeredoc" }],
245
+ [/'''/, { token: "string.delimiter", next: "@singleQuotedHeredoc" }],
246
+ [/"/, { token: "string.delimiter", next: "@doubleQuotedString" }],
247
+ [/'/, { token: "string.delimiter", next: "@singleQuotedString" }]
248
+ ],
249
+ doubleQuotedHeredoc: [
250
+ [/"""/, { token: "string.delimiter", next: "@pop" }],
251
+ { include: "@stringContentInterpol" }
252
+ ],
253
+ singleQuotedHeredoc: [
254
+ [/'''/, { token: "string.delimiter", next: "@pop" }],
255
+ { include: "@stringContentInterpol" }
256
+ ],
257
+ doubleQuotedString: [
258
+ [/"/, { token: "string.delimiter", next: "@pop" }],
259
+ { include: "@stringContentInterpol" }
260
+ ],
261
+ singleQuotedString: [
262
+ [/'/, { token: "string.delimiter", next: "@pop" }],
263
+ { include: "@stringContentInterpol" }
264
+ ],
265
+ // Atoms
266
+ atoms: [
267
+ [/(:)(@atomName)/, ["constant.punctuation", "constant"]],
268
+ [/:"/, { token: "constant.delimiter", next: "@doubleQuotedStringAtom" }],
269
+ [/:'/, { token: "constant.delimiter", next: "@singleQuotedStringAtom" }]
270
+ ],
271
+ doubleQuotedStringAtom: [
272
+ [/"/, { token: "constant.delimiter", next: "@pop" }],
273
+ { include: "@stringConstantContentInterpol" }
274
+ ],
275
+ singleQuotedStringAtom: [
276
+ [/'/, { token: "constant.delimiter", next: "@pop" }],
277
+ { include: "@stringConstantContentInterpol" }
278
+ ],
279
+ // Sigils
280
+ // See https://elixir-lang.org/getting-started/sigils.html
281
+ // Sigils allow for typing values using their textual representation.
282
+ // All sigils start with ~ followed by a letter or
283
+ // multi-letter uppercase starting at Elixir v1.15.0, indicating sigil type
284
+ // and then a delimiter pair enclosing the textual representation.
285
+ // Optional modifiers are allowed after the closing delimiter.
286
+ // For instance a regular expressions can be written as:
287
+ // ~r/foo|bar/ ~r{foo|bar} ~r/foo|bar/g
288
+ //
289
+ // In general lowercase sigils allow for interpolation
290
+ // and escaped characters, whereas uppercase sigils don't
291
+ //
292
+ // During tokenization we want to distinguish some
293
+ // specific sigil types, namely string and regexp,
294
+ // so that they cen be themed separately.
295
+ //
296
+ // To reasonably handle all those combinations we leverage
297
+ // dot-separated states, so if we transition to @sigilStart.interpol.s.{.}
298
+ // then "sigilStart.interpol.s" state will match and also all
299
+ // the individual dot-separated parameters can be accessed.
300
+ sigils: [
301
+ [/~[a-z]@sigilStartDelimiter/, { token: "@rematch", next: "@sigil.interpol" }],
302
+ [/~([A-Z]+)@sigilStartDelimiter/, { token: "@rematch", next: "@sigil.noInterpol" }]
303
+ ],
304
+ sigil: [
305
+ [/~([a-z]|[A-Z]+)\{/, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.{.}" }],
306
+ [/~([a-z]|[A-Z]+)\[/, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.[.]" }],
307
+ [/~([a-z]|[A-Z]+)\(/, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.(.)" }],
308
+ [/~([a-z]|[A-Z]+)\</, { token: "@rematch", switchTo: "@sigilStart.$S2.$1.<.>" }],
309
+ [
310
+ /~([a-z]|[A-Z]+)(@sigilSymmetricDelimiter)/,
311
+ { token: "@rematch", switchTo: "@sigilStart.$S2.$1.$2.$2" }
312
+ ]
313
+ ],
314
+ // The definitions below expect states to be of the form:
315
+ //
316
+ // sigilStart.<interpol-or-noInterpol>.<sigil-letter>.<start-delimiter>.<end-delimiter>
317
+ // sigilContinue.<interpol-or-noInterpol>.<sigil-letter>.<start-delimiter>.<end-delimiter>
318
+ //
319
+ // The sigilStart state is used only to properly classify the token (as string/regex/sigil)
320
+ // and immediately switches to the sigilContinue sate, which handles the actual content
321
+ // and waits for the corresponding end delimiter.
322
+ "sigilStart.interpol.s": [
323
+ [
324
+ /~s@sigilStartDelimiter/,
325
+ {
326
+ token: "string.delimiter",
327
+ switchTo: "@sigilContinue.$S2.$S3.$S4.$S5"
328
+ }
329
+ ]
330
+ ],
331
+ "sigilContinue.interpol.s": [
332
+ [
333
+ /(@sigilEndDelimiter)@sigilModifiers/,
334
+ {
335
+ cases: {
336
+ "$1==$S5": { token: "string.delimiter", next: "@pop" },
337
+ "@default": "string"
338
+ }
339
+ }
340
+ ],
341
+ { include: "@stringContentInterpol" }
342
+ ],
343
+ "sigilStart.noInterpol.S": [
344
+ [
345
+ /~S@sigilStartDelimiter/,
346
+ {
347
+ token: "string.delimiter",
348
+ switchTo: "@sigilContinue.$S2.$S3.$S4.$S5"
349
+ }
350
+ ]
351
+ ],
352
+ "sigilContinue.noInterpol.S": [
353
+ // Ignore escaped sigil end
354
+ [/(^|[^\\])\\@sigilEndDelimiter/, "string"],
355
+ [
356
+ /(@sigilEndDelimiter)@sigilModifiers/,
357
+ {
358
+ cases: {
359
+ "$1==$S5": { token: "string.delimiter", next: "@pop" },
360
+ "@default": "string"
361
+ }
362
+ }
363
+ ],
364
+ { include: "@stringContent" }
365
+ ],
366
+ "sigilStart.interpol.r": [
367
+ [
368
+ /~r@sigilStartDelimiter/,
369
+ {
370
+ token: "regexp.delimiter",
371
+ switchTo: "@sigilContinue.$S2.$S3.$S4.$S5"
372
+ }
373
+ ]
374
+ ],
375
+ "sigilContinue.interpol.r": [
376
+ [
377
+ /(@sigilEndDelimiter)@sigilModifiers/,
378
+ {
379
+ cases: {
380
+ "$1==$S5": { token: "regexp.delimiter", next: "@pop" },
381
+ "@default": "regexp"
382
+ }
383
+ }
384
+ ],
385
+ { include: "@regexpContentInterpol" }
386
+ ],
387
+ "sigilStart.noInterpol.R": [
388
+ [
389
+ /~R@sigilStartDelimiter/,
390
+ {
391
+ token: "regexp.delimiter",
392
+ switchTo: "@sigilContinue.$S2.$S3.$S4.$S5"
393
+ }
394
+ ]
395
+ ],
396
+ "sigilContinue.noInterpol.R": [
397
+ // Ignore escaped sigil end
398
+ [/(^|[^\\])\\@sigilEndDelimiter/, "regexp"],
399
+ [
400
+ /(@sigilEndDelimiter)@sigilModifiers/,
401
+ {
402
+ cases: {
403
+ "$1==$S5": { token: "regexp.delimiter", next: "@pop" },
404
+ "@default": "regexp"
405
+ }
406
+ }
407
+ ],
408
+ { include: "@regexpContent" }
409
+ ],
410
+ // Fallback to the generic sigil by default
411
+ "sigilStart.interpol": [
412
+ [
413
+ /~([a-z]|[A-Z]+)@sigilStartDelimiter/,
414
+ {
415
+ token: "sigil.delimiter",
416
+ switchTo: "@sigilContinue.$S2.$S3.$S4.$S5"
417
+ }
418
+ ]
419
+ ],
420
+ "sigilContinue.interpol": [
421
+ [
422
+ /(@sigilEndDelimiter)@sigilModifiers/,
423
+ {
424
+ cases: {
425
+ "$1==$S5": { token: "sigil.delimiter", next: "@pop" },
426
+ "@default": "sigil"
427
+ }
428
+ }
429
+ ],
430
+ { include: "@sigilContentInterpol" }
431
+ ],
432
+ "sigilStart.noInterpol": [
433
+ [
434
+ /~([a-z]|[A-Z]+)@sigilStartDelimiter/,
435
+ {
436
+ token: "sigil.delimiter",
437
+ switchTo: "@sigilContinue.$S2.$S3.$S4.$S5"
438
+ }
439
+ ]
440
+ ],
441
+ "sigilContinue.noInterpol": [
442
+ // Ignore escaped sigil end
443
+ [/(^|[^\\])\\@sigilEndDelimiter/, "sigil"],
444
+ [
445
+ /(@sigilEndDelimiter)@sigilModifiers/,
446
+ {
447
+ cases: {
448
+ "$1==$S5": { token: "sigil.delimiter", next: "@pop" },
449
+ "@default": "sigil"
450
+ }
451
+ }
452
+ ],
453
+ { include: "@sigilContent" }
454
+ ],
455
+ // Attributes
456
+ attributes: [
457
+ // Module @doc* attributes - tokenized as comments
458
+ [
459
+ /\@(module|type)?doc (~[sS])?"""/,
460
+ {
461
+ token: "comment.block.documentation",
462
+ next: "@doubleQuotedHeredocDocstring"
463
+ }
464
+ ],
465
+ [
466
+ /\@(module|type)?doc (~[sS])?'''/,
467
+ {
468
+ token: "comment.block.documentation",
469
+ next: "@singleQuotedHeredocDocstring"
470
+ }
471
+ ],
472
+ [
473
+ /\@(module|type)?doc (~[sS])?"/,
474
+ {
475
+ token: "comment.block.documentation",
476
+ next: "@doubleQuotedStringDocstring"
477
+ }
478
+ ],
479
+ [
480
+ /\@(module|type)?doc (~[sS])?'/,
481
+ {
482
+ token: "comment.block.documentation",
483
+ next: "@singleQuotedStringDocstring"
484
+ }
485
+ ],
486
+ [/\@(module|type)?doc false/, "comment.block.documentation"],
487
+ // Module attributes
488
+ [/\@(@variableName)/, "variable"]
489
+ ],
490
+ doubleQuotedHeredocDocstring: [
491
+ [/"""/, { token: "comment.block.documentation", next: "@pop" }],
492
+ { include: "@docstringContent" }
493
+ ],
494
+ singleQuotedHeredocDocstring: [
495
+ [/'''/, { token: "comment.block.documentation", next: "@pop" }],
496
+ { include: "@docstringContent" }
497
+ ],
498
+ doubleQuotedStringDocstring: [
499
+ [/"/, { token: "comment.block.documentation", next: "@pop" }],
500
+ { include: "@docstringContent" }
501
+ ],
502
+ singleQuotedStringDocstring: [
503
+ [/'/, { token: "comment.block.documentation", next: "@pop" }],
504
+ { include: "@docstringContent" }
505
+ ],
506
+ // Operators, punctuation, brackets
507
+ symbols: [
508
+ // Code point operator (either with regular character ?a or an escaped one ?\n)
509
+ [/\?(\\.|[^\\\s])/, "number.constant"],
510
+ // Anonymous function arguments
511
+ [/&\d+/, "operator"],
512
+ // Bitshift operators (must go before delimiters, so that << >> don't match first)
513
+ [/<<<|>>>/, "operator"],
514
+ // Delimiter pairs
515
+ [/[()\[\]\{\}]|<<|>>/, "@brackets"],
516
+ // Triple dot is a valid name (must go before operators, so that .. doesn't match instead)
517
+ [/\.\.\./, "identifier"],
518
+ // Punctuation => (must go before operators, so it's not tokenized as = then >)
519
+ [/=>/, "punctuation"],
520
+ // Operators
521
+ [/@operator/, "operator"],
522
+ // Punctuation
523
+ [/[:;,.%]/, "punctuation"]
524
+ ],
525
+ // Generic helpers
526
+ stringContentInterpol: [
527
+ { include: "@interpolation" },
528
+ { include: "@escapeChar" },
529
+ { include: "@stringContent" }
530
+ ],
531
+ stringContent: [[/./, "string"]],
532
+ stringConstantContentInterpol: [
533
+ { include: "@interpolation" },
534
+ { include: "@escapeChar" },
535
+ { include: "@stringConstantContent" }
536
+ ],
537
+ stringConstantContent: [[/./, "constant"]],
538
+ regexpContentInterpol: [
539
+ { include: "@interpolation" },
540
+ { include: "@escapeChar" },
541
+ { include: "@regexpContent" }
542
+ ],
543
+ regexpContent: [
544
+ // # may be a regular regexp char, so we use a heuristic
545
+ // assuming a # surrounded by whitespace is actually a comment.
546
+ [/(\s)(#)(\s.*)$/, ["white", "comment.punctuation", "comment"]],
547
+ [/./, "regexp"]
548
+ ],
549
+ sigilContentInterpol: [
550
+ { include: "@interpolation" },
551
+ { include: "@escapeChar" },
552
+ { include: "@sigilContent" }
553
+ ],
554
+ sigilContent: [[/./, "sigil"]],
555
+ docstringContent: [[/./, "comment.block.documentation"]],
556
+ escapeChar: [[/@escape/, "constant.character.escape"]],
557
+ interpolation: [[/#{/, { token: "delimiter.bracket.embed", next: "@interpolationContinue" }]],
558
+ interpolationContinue: [
559
+ [/}/, { token: "delimiter.bracket.embed", next: "@pop" }],
560
+ // Interpolation brackets may contain arbitrary code,
561
+ // so we simply match against all the root rules,
562
+ // until we reach interpolation end (the above matches).
563
+ { include: "@root" }
564
+ ]
565
+ }
566
+ };
567
+ export {
568
+ conf,
569
+ language
570
+ };