tm-grammars 0.0.0

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 (181) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE +6565 -0
  3. package/README.md +211 -0
  4. package/grammars/abap.json +380 -0
  5. package/grammars/actionscript-3.json +951 -0
  6. package/grammars/ada.json +3874 -0
  7. package/grammars/apache.json +562 -0
  8. package/grammars/apex.json +3203 -0
  9. package/grammars/apl.json +1479 -0
  10. package/grammars/applescript.json +1406 -0
  11. package/grammars/ara.json +428 -0
  12. package/grammars/asm.json +1741 -0
  13. package/grammars/astro.json +776 -0
  14. package/grammars/awk.json +388 -0
  15. package/grammars/ballerina.json +3768 -0
  16. package/grammars/bat.json +783 -0
  17. package/grammars/beancount.json +831 -0
  18. package/grammars/berry.json +172 -0
  19. package/grammars/bibtex.json +315 -0
  20. package/grammars/bicep.json +239 -0
  21. package/grammars/blade.json +3870 -0
  22. package/grammars/c.json +3552 -0
  23. package/grammars/cadence.json +738 -0
  24. package/grammars/clarity.json +877 -0
  25. package/grammars/clojure.json +426 -0
  26. package/grammars/cmake.json +143 -0
  27. package/grammars/cobol.json +1124 -0
  28. package/grammars/codeql.json +1540 -0
  29. package/grammars/coffee.json +1311 -0
  30. package/grammars/cpp-macro.json +9498 -0
  31. package/grammars/cpp.json +16635 -0
  32. package/grammars/crystal.json +1866 -0
  33. package/grammars/csharp.json +5722 -0
  34. package/grammars/css.json +1860 -0
  35. package/grammars/csv.json +46 -0
  36. package/grammars/cue.json +1128 -0
  37. package/grammars/cypher.json +353 -0
  38. package/grammars/d.json +3185 -0
  39. package/grammars/dart.json +522 -0
  40. package/grammars/dax.json +185 -0
  41. package/grammars/diff.json +155 -0
  42. package/grammars/docker.json +97 -0
  43. package/grammars/dream-maker.json +640 -0
  44. package/grammars/elixir.json +1014 -0
  45. package/grammars/elm.json +751 -0
  46. package/grammars/erb.json +156 -0
  47. package/grammars/erlang.json +1757 -0
  48. package/grammars/fish.json +189 -0
  49. package/grammars/fsharp.json +1831 -0
  50. package/grammars/gdresource.json +290 -0
  51. package/grammars/gdscript.json +969 -0
  52. package/grammars/gdshader.json +405 -0
  53. package/grammars/gherkin.json +133 -0
  54. package/grammars/git-commit.json +85 -0
  55. package/grammars/git-rebase.json +56 -0
  56. package/grammars/glimmer-js.json +98 -0
  57. package/grammars/glimmer-ts.json +98 -0
  58. package/grammars/glsl.json +57 -0
  59. package/grammars/gnuplot.json +892 -0
  60. package/grammars/go.json +1012 -0
  61. package/grammars/graphql.json +1295 -0
  62. package/grammars/groovy.json +1378 -0
  63. package/grammars/hack.json +2650 -0
  64. package/grammars/haml.json +598 -0
  65. package/grammars/handlebars.json +848 -0
  66. package/grammars/haskell.json +2431 -0
  67. package/grammars/hcl.json +787 -0
  68. package/grammars/hjson.json +821 -0
  69. package/grammars/hlsl.json +212 -0
  70. package/grammars/html.json +93 -0
  71. package/grammars/imba.json +2696 -0
  72. package/grammars/ini.json +108 -0
  73. package/grammars/java.json +1885 -0
  74. package/grammars/javascript.json +5984 -0
  75. package/grammars/jinja-html.json +16 -0
  76. package/grammars/jinja.json +345 -0
  77. package/grammars/jison.json +715 -0
  78. package/grammars/jsdoc.json +21 -0
  79. package/grammars/json.json +208 -0
  80. package/grammars/json5.json +244 -0
  81. package/grammars/jsonc.json +208 -0
  82. package/grammars/jsonl.json +208 -0
  83. package/grammars/jsonnet.json +211 -0
  84. package/grammars/jssm.json +159 -0
  85. package/grammars/jsx.json +5984 -0
  86. package/grammars/julia.json +1061 -0
  87. package/grammars/kotlin.json +580 -0
  88. package/grammars/kusto.json +687 -0
  89. package/grammars/latex.json +2395 -0
  90. package/grammars/less.json +5012 -0
  91. package/grammars/liquid.json +990 -0
  92. package/grammars/lisp.json +121 -0
  93. package/grammars/logo.json +55 -0
  94. package/grammars/lua.json +956 -0
  95. package/grammars/make.json +629 -0
  96. package/grammars/markdown.json +3066 -0
  97. package/grammars/marko.json +1344 -0
  98. package/grammars/matlab.json +1131 -0
  99. package/grammars/mdc.json +571 -0
  100. package/grammars/mdx.json +5629 -0
  101. package/grammars/mermaid.json +1382 -0
  102. package/grammars/mojo.json +4153 -0
  103. package/grammars/narrat.json +227 -0
  104. package/grammars/nextflow.json +298 -0
  105. package/grammars/nginx.json +2121 -0
  106. package/grammars/nim.json +1522 -0
  107. package/grammars/nix.json +1200 -0
  108. package/grammars/nushell.json +1047 -0
  109. package/grammars/objective-c.json +3750 -0
  110. package/grammars/objective-cpp.json +7242 -0
  111. package/grammars/ocaml.json +2967 -0
  112. package/grammars/pascal.json +154 -0
  113. package/grammars/perl.json +2971 -0
  114. package/grammars/php.json +4024 -0
  115. package/grammars/plsql.json +241 -0
  116. package/grammars/postcss.json +377 -0
  117. package/grammars/powerquery.json +349 -0
  118. package/grammars/powershell.json +1024 -0
  119. package/grammars/prisma.json +443 -0
  120. package/grammars/prolog.json +298 -0
  121. package/grammars/proto.json +507 -0
  122. package/grammars/pug.json +1033 -0
  123. package/grammars/puppet.json +777 -0
  124. package/grammars/purescript.json +871 -0
  125. package/grammars/python.json +4208 -0
  126. package/grammars/r.json +637 -0
  127. package/grammars/raku.json +310 -0
  128. package/grammars/razor.json +1813 -0
  129. package/grammars/reg.json +136 -0
  130. package/grammars/rel.json +200 -0
  131. package/grammars/riscv.json +298 -0
  132. package/grammars/rst.json +734 -0
  133. package/grammars/ruby.json +2769 -0
  134. package/grammars/rust.json +1171 -0
  135. package/grammars/sas.json +302 -0
  136. package/grammars/sass.json +618 -0
  137. package/grammars/scala.json +1313 -0
  138. package/grammars/scheme.json +384 -0
  139. package/grammars/scss.json +1874 -0
  140. package/grammars/shaderlab.json +199 -0
  141. package/grammars/shellscript.json +2025 -0
  142. package/grammars/shellsession.json +33 -0
  143. package/grammars/smalltalk.json +235 -0
  144. package/grammars/solidity.json +1210 -0
  145. package/grammars/sparql.json +45 -0
  146. package/grammars/splunk.json +91 -0
  147. package/grammars/sql.json +631 -0
  148. package/grammars/ssh-config.json +88 -0
  149. package/grammars/stata.json +3050 -0
  150. package/grammars/stylus.json +1208 -0
  151. package/grammars/svelte.json +1171 -0
  152. package/grammars/swift.json +4203 -0
  153. package/grammars/system-verilog.json +1063 -0
  154. package/grammars/tasl.json +292 -0
  155. package/grammars/tcl.json +291 -0
  156. package/grammars/tex.json +281 -0
  157. package/grammars/toml.json +431 -0
  158. package/grammars/tsx.json +5984 -0
  159. package/grammars/turtle.json +261 -0
  160. package/grammars/twig.json +1394 -0
  161. package/grammars/typescript.json +5735 -0
  162. package/grammars/v.json +1001 -0
  163. package/grammars/vb.json +232 -0
  164. package/grammars/verilog.json +305 -0
  165. package/grammars/vhdl.json +1484 -0
  166. package/grammars/viml.json +445 -0
  167. package/grammars/vue-html.json +559 -0
  168. package/grammars/vue.json +1237 -0
  169. package/grammars/vyper.json +5415 -0
  170. package/grammars/wasm.json +831 -0
  171. package/grammars/wenyan.json +129 -0
  172. package/grammars/wgsl.json +391 -0
  173. package/grammars/wolfram.json +2370 -0
  174. package/grammars/xml.json +382 -0
  175. package/grammars/xsl.json +89 -0
  176. package/grammars/yaml.json +616 -0
  177. package/grammars/zenscript.json +257 -0
  178. package/grammars/zig.json +312 -0
  179. package/index.d.ts +18 -0
  180. package/index.js +2165 -0
  181. package/package.json +46 -0
@@ -0,0 +1,1866 @@
1
+ {
2
+ "displayName": "Crystal",
3
+ "fileTypes": [
4
+ "cr"
5
+ ],
6
+ "firstLineMatch": "^#!/.*\\bcrystal",
7
+ "foldingStartMarker": "(?x)^(\\s*+(annotation|module|class|struct|union|enum|def(?!.*\\bend\\s*$)|unless|if|case|begin|for|while|until|^=begin|(\"(\\\\.|[^\"])*+\"|'(\\\\.|[^'])*+'|[^#\"'])*(\\s(do|begin|case)|(?<!\\$)[-+=&|*/~%^<>~]\\s*+(if|unless)))\\b(?![^;]*+;.*?\\bend\\b)|(\"(\\\\.|[^\"])*+\"|'(\\\\.|[^'])*+'|[^#\"'])*(\\{(?![^}]*+\\})|\\[(?![^\\]]*+\\]))).*$|[#].*?\\(fold\\)\\s*+$",
8
+ "foldingStopMarker": "(?x)((^|;)\\s*+end\\s*+([#].*)?$|(^|;)\\s*+end\\..*$|^\\s*+[}\\]] ,?\\s*+([#].*)?$|[#].*?\\(end\\)\\s*+$|^=end)",
9
+ "name": "crystal",
10
+ "patterns": [
11
+ {
12
+ "captures": {
13
+ "1": {
14
+ "name": "keyword.control.class.crystal"
15
+ },
16
+ "10": {
17
+ "name": "support.class.other.type-param.crystal"
18
+ },
19
+ "11": {
20
+ "name": "punctuation.definition.variable.crystal"
21
+ },
22
+ "2": {
23
+ "name": "keyword.control.class.crystal"
24
+ },
25
+ "3": {
26
+ "name": "entity.name.type.class.crystal"
27
+ },
28
+ "5": {
29
+ "name": "punctuation.separator.crystal"
30
+ },
31
+ "6": {
32
+ "name": "support.class.other.type-param.crystal"
33
+ },
34
+ "7": {
35
+ "name": "entity.other.inherited-class.crystal"
36
+ },
37
+ "8": {
38
+ "name": "punctuation.separator.crystal"
39
+ },
40
+ "9": {
41
+ "name": "punctuation.separator.crystal"
42
+ }
43
+ },
44
+ "match": "(?x)^\\s*(abstract)?\\s*(class|struct|union|annotation|enum)\\s+(([.A-Z_:\\x{80}-\\x{10FFFF}][.\\w:\\x{80}-\\x{10FFFF}]*(\\(([,\\s.a-zA-Z0-9_:\\x{80}-\\x{10FFFF}]+)\\))?(\\s*(<)\\s*[.:A-Z\\x{80}-\\x{10FFFF}][.:\\w\\x{80}-\\x{10FFFF}]*(\\(([.a-zA-Z0-9_:]+\\s,)\\))?)?)|((<<)\\s*[.A-Z0-9_:\\x{80}-\\x{10FFFF}]+))",
45
+ "name": "meta.class.crystal"
46
+ },
47
+ {
48
+ "captures": {
49
+ "1": {
50
+ "name": "keyword.control.module.crystal"
51
+ },
52
+ "2": {
53
+ "name": "entity.name.type.module.crystal"
54
+ },
55
+ "3": {
56
+ "name": "entity.other.inherited-class.module.first.crystal"
57
+ },
58
+ "4": {
59
+ "name": "punctuation.separator.inheritance.crystal"
60
+ },
61
+ "5": {
62
+ "name": "entity.other.inherited-class.module.second.crystal"
63
+ },
64
+ "6": {
65
+ "name": "punctuation.separator.inheritance.crystal"
66
+ },
67
+ "7": {
68
+ "name": "entity.other.inherited-class.module.third.crystal"
69
+ },
70
+ "8": {
71
+ "name": "punctuation.separator.inheritance.crystal"
72
+ }
73
+ },
74
+ "match": "^\\s*(module)\\s+(([A-Z\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*(::))?([A-Z\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*(::))?([A-Z\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*(::))*[A-Z\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*)",
75
+ "name": "meta.module.crystal"
76
+ },
77
+ {
78
+ "captures": {
79
+ "1": {
80
+ "name": "keyword.control.lib.crystal"
81
+ },
82
+ "2": {
83
+ "name": "entity.name.type.lib.crystal"
84
+ },
85
+ "3": {
86
+ "name": "entity.other.inherited-class.lib.first.crystal"
87
+ },
88
+ "4": {
89
+ "name": "punctuation.separator.inheritance.crystal"
90
+ },
91
+ "5": {
92
+ "name": "entity.other.inherited-class.lib.second.crystal"
93
+ },
94
+ "6": {
95
+ "name": "punctuation.separator.inheritance.crystal"
96
+ },
97
+ "7": {
98
+ "name": "entity.other.inherited-class.lib.third.crystal"
99
+ },
100
+ "8": {
101
+ "name": "punctuation.separator.inheritance.crystal"
102
+ }
103
+ },
104
+ "match": "^\\s*(lib)\\s+(([A-Z]\\w*(::))?([A-Z]\\w*(::))?([A-Z]\\w*(::))*[A-Z]\\w*)",
105
+ "name": "meta.lib.crystal"
106
+ },
107
+ {
108
+ "captures": {
109
+ "1": {
110
+ "name": "keyword.control.lib.type.crystal"
111
+ },
112
+ "2": {
113
+ "name": "entity.name.lib.type.crystal"
114
+ },
115
+ "3": {
116
+ "name": "keyword.control.lib.crystal"
117
+ },
118
+ "4": {
119
+ "name": "entity.name.lib.type.value.crystal"
120
+ }
121
+ },
122
+ "comment": "type in lib",
123
+ "match": "(?<!\\.)\\b(type)\\s+([A-Z]\\w+)\\s*(=)\\s*(.+)",
124
+ "name": "meta.lib.type.crystal"
125
+ },
126
+ {
127
+ "comment": "everything being a reserved word, not a value and needing a 'end' is a..",
128
+ "match": "(?<!\\.)\\b(fun|begin|case|class|else|elsif|end|ensure|enum|for|if|macro|module|rescue|struct|then|union|unless|until|when|while)\\b(?![?!:])",
129
+ "name": "keyword.control.crystal"
130
+ },
131
+ {
132
+ "comment": "everything being a reserved word, not a value and not needing a 'end' is a..",
133
+ "match": "(?<!\\.)\\b(abstract|alias|asm|break|extend|in|include|next|of|private|protected|struct|return|select|super|with|yield)\\b(?![?!:])",
134
+ "name": "keyword.control.primary.crystal"
135
+ },
136
+ {
137
+ "comment": "contextual smart pair support for block parameters",
138
+ "match": "(?<!\\.)\\bdo\\b\\s*",
139
+ "name": "keyword.control.start-block.crystal"
140
+ },
141
+ {
142
+ "comment": "contextual smart pair support",
143
+ "match": "(?<=\\{)(\\s+)",
144
+ "name": "meta.syntax.crystal.start-block"
145
+ },
146
+ {
147
+ "comment": "Just as above but being not a logical operation",
148
+ "match": "(?<!\\.)\\b(pointerof|typeof|sizeof|instance_sizeof|offsetof|previous_def|forall|out|uninitialized)\\b(?![?!:])|\\.(is_a\\?|nil\\?|responds_to\\?|as\\?|as\b)",
149
+ "name": "keyword.control.pseudo-method.crystal"
150
+ },
151
+ {
152
+ "match": "\\bnil\\b(?![?!:])",
153
+ "name": "constant.language.nil.crystal"
154
+ },
155
+ {
156
+ "match": "\\b(true|false)\\b(?![?!:])",
157
+ "name": "constant.language.boolean.crystal"
158
+ },
159
+ {
160
+ "match": "\\b(__(DIR|FILE|LINE|END_LINE)__)\\b(?![?!:])",
161
+ "name": "variable.language.crystal"
162
+ },
163
+ {
164
+ "match": "\\b(self)\\b(?![?!:])",
165
+ "name": "variable.language.self.crystal"
166
+ },
167
+ {
168
+ "comment": "https://crystal-lang.org/api/0.36.1/Object.html#macro-summary",
169
+ "match": "(?<!\\.)\\b(((class_)?((getter|property)\\b[!?]?|setter\\b))|(def_(clone|equals|equals_and_hash|hash)|delegate|forward_missing_to)\\b)(?![?!:])",
170
+ "name": "support.function.kernel.crystal"
171
+ },
172
+ {
173
+ "begin": "\\b(require)\\b",
174
+ "captures": {
175
+ "1": {
176
+ "name": "keyword.other.special-method.crystal"
177
+ }
178
+ },
179
+ "end": "$|(?=#)",
180
+ "name": "meta.require.crystal",
181
+ "patterns": [
182
+ {
183
+ "include": "$self"
184
+ }
185
+ ]
186
+ },
187
+ {
188
+ "captures": {
189
+ "1": {
190
+ "name": "punctuation.definition.variable.crystal"
191
+ }
192
+ },
193
+ "match": "(@)[a-zA-Z_\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*[?!=]?",
194
+ "name": "variable.other.readwrite.instance.crystal"
195
+ },
196
+ {
197
+ "captures": {
198
+ "1": {
199
+ "name": "punctuation.definition.variable.crystal"
200
+ }
201
+ },
202
+ "match": "(@@)[a-zA-Z_\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*[?!=]?",
203
+ "name": "variable.other.readwrite.class.crystal"
204
+ },
205
+ {
206
+ "captures": {
207
+ "1": {
208
+ "name": "punctuation.definition.variable.crystal"
209
+ }
210
+ },
211
+ "match": "(\\$)[a-zA-Z_]\\w*",
212
+ "name": "variable.other.readwrite.global.crystal"
213
+ },
214
+ {
215
+ "captures": {
216
+ "1": {
217
+ "name": "punctuation.definition.variable.crystal"
218
+ }
219
+ },
220
+ "match": "(?!%[Qxrqwi]?[\\(\\[\\{\\<\\|])%([a-zA-Z_]\\w*\\.)*[a-zA-Z_]\\w*",
221
+ "name": "variable.other.readwrite.fresh.crystal"
222
+ },
223
+ {
224
+ "captures": {
225
+ "1": {
226
+ "name": "punctuation.definition.variable.crystal"
227
+ }
228
+ },
229
+ "match": "(\\$)(!|@|&|`|'|\\+|\\d+|~|=|/|\\\\|,|;|\\.|<|>|_|\\*|\\$|\\?|:|\"|-[0adFiIlpv])",
230
+ "name": "variable.other.readwrite.global.pre-defined.crystal"
231
+ },
232
+ {
233
+ "begin": "\\b(ENV)\\[",
234
+ "beginCaptures": {
235
+ "1": {
236
+ "name": "variable.other.constant.crystal"
237
+ }
238
+ },
239
+ "end": "\\]",
240
+ "name": "meta.environment-variable.crystal",
241
+ "patterns": [
242
+ {
243
+ "include": "$self"
244
+ }
245
+ ]
246
+ },
247
+ {
248
+ "comment": "Literals name of Crystal",
249
+ "match": "\\b[A-Z\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*",
250
+ "name": "support.class.crystal"
251
+ },
252
+ {
253
+ "comment": "Fetch from https://crystal-lang.org/api/0.36.1/toplevel.html",
254
+ "match": "(?<!\\.)\\b(abort|at_exit|caller|exit|gets|loop|main|p|pp|print|printf|puts|raise|rand|read_line|sleep|spawn|sprintf|system|debugger|record|spawn)\\b(?![?!:])",
255
+ "name": "support.function.kernel.crystal"
256
+ },
257
+ {
258
+ "comment": "Constant name in any where",
259
+ "match": "\\b[_A-Z]+\\b",
260
+ "name": "variable.other.constant.crystal"
261
+ },
262
+ {
263
+ "begin": "(?x)\n(?=def\\b) # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\s+\n(\n (?>[a-zA-Z_]\\w*(?>\\.|::))? # method prefix\n (?> # method name\n [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n |\n \\^|===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[][?=]?|\\[]=?\n )\n)\n\\s*(\\()",
264
+ "beginCaptures": {
265
+ "1": {
266
+ "name": "keyword.control.def.crystal"
267
+ },
268
+ "2": {
269
+ "name": "entity.name.function.crystal"
270
+ },
271
+ "3": {
272
+ "name": "punctuation.definition.parameters.crystal"
273
+ }
274
+ },
275
+ "comment": "The method pattern comes from the symbol pattern. See there for an explanation.",
276
+ "end": "\\)",
277
+ "endCaptures": {
278
+ "0": {
279
+ "name": "punctuation.definition.parameters.crystal"
280
+ }
281
+ },
282
+ "name": "meta.function.method.with-arguments.crystal",
283
+ "patterns": [
284
+ {
285
+ "begin": "(?![\\s,)])",
286
+ "end": "(?=,|\\)\\s*$)",
287
+ "patterns": [
288
+ {
289
+ "captures": {
290
+ "1": {
291
+ "name": "storage.type.variable.crystal"
292
+ },
293
+ "2": {
294
+ "name": "constant.other.symbol.hashkey.parameter.function.crystal"
295
+ },
296
+ "3": {
297
+ "name": "punctuation.definition.constant.hashkey.crystal"
298
+ },
299
+ "4": {
300
+ "name": "variable.parameter.function.crystal"
301
+ }
302
+ },
303
+ "match": "\\G([&*]?)(?:([_a-zA-Z]\\w*(:))|([_a-zA-Z]\\w*))"
304
+ },
305
+ {
306
+ "include": "$self"
307
+ }
308
+ ]
309
+ }
310
+ ]
311
+ },
312
+ {
313
+ "captures": {
314
+ "1": {
315
+ "name": "keyword.control.def.crystal"
316
+ },
317
+ "3": {
318
+ "name": "entity.name.function.crystal"
319
+ }
320
+ },
321
+ "comment": " the optional name is just to catch the def also without a method-name",
322
+ "match": "(?x)\n(?=def\\b) # optimization to help Oniguruma fail fast\n(?<=^|\\s)(def)\\b\n(\n \\s+\n (\n (?>[a-zA-Z_]\\w*(?>\\.|::))? # method prefix\n (?> # method name\n [a-zA-Z_]\\w*(?>[?!]|=(?!>))?\n |\n \\^|===?|!=|>[>=]?|<=>|<[<=]?|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[][?=]?|\\[]=?\n )\n )\n)?",
323
+ "name": "meta.function.method.without-arguments.crystal"
324
+ },
325
+ {
326
+ "comment": "Floating point literal (fraction)",
327
+ "match": "\\b[0-9][0-9_]*\\.[0-9][0-9_]*([eE][+-]?[0-9_]+)?(f32|f64)?\\b",
328
+ "name": "constant.numeric.float.crystal"
329
+ },
330
+ {
331
+ "comment": "Floating point literal (exponent)",
332
+ "match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?[eE][+-]?[0-9_]+(f32|f64)?\\b",
333
+ "name": "constant.numeric.float.crystal"
334
+ },
335
+ {
336
+ "comment": "Floating point literal (typed)",
337
+ "match": "\\b[0-9][0-9_]*(\\.[0-9][0-9_]*)?([eE][+-]?[0-9_]+)?(f32|f64)\\b",
338
+ "name": "constant.numeric.float.crystal"
339
+ },
340
+ {
341
+ "comment": "Integer literal (decimal)",
342
+ "match": "\\b(?!0[0-9])[0-9][0-9_]*([ui](8|16|32|64|128))?\\b",
343
+ "name": "constant.numeric.integer.decimal.crystal"
344
+ },
345
+ {
346
+ "comment": "Integer literal (hexadecimal)",
347
+ "match": "\\b0x[a-fA-F0-9_]+([ui](8|16|32|64|128))?\\b",
348
+ "name": "constant.numeric.integer.hexadecimal.crystal"
349
+ },
350
+ {
351
+ "comment": "Integer literal (octal)",
352
+ "match": "\\b0o[0-7_]+([ui](8|16|32|64|128))?\\b",
353
+ "name": "constant.numeric.integer.octal.crystal"
354
+ },
355
+ {
356
+ "comment": "Integer literal (binary)",
357
+ "match": "\\b0b[01_]+([ui](8|16|32|64|128))?\\b",
358
+ "name": "constant.numeric.integer.binary.crystal"
359
+ },
360
+ {
361
+ "begin": ":'",
362
+ "beginCaptures": {
363
+ "0": {
364
+ "name": "punctuation.definition.symbol.begin.crystal"
365
+ }
366
+ },
367
+ "comment": "symbol literal with '' delimiter",
368
+ "end": "'",
369
+ "endCaptures": {
370
+ "0": {
371
+ "name": "punctuation.definition.symbol.end.crystal"
372
+ }
373
+ },
374
+ "name": "constant.other.symbol.crystal",
375
+ "patterns": [
376
+ {
377
+ "match": "\\\\['\\\\]",
378
+ "name": "constant.character.escape.crystal"
379
+ }
380
+ ]
381
+ },
382
+ {
383
+ "begin": ":\"",
384
+ "beginCaptures": {
385
+ "0": {
386
+ "name": "punctuation.section.symbol.begin.crystal"
387
+ }
388
+ },
389
+ "comment": "symbol literal with \"\" delimiter",
390
+ "end": "\"",
391
+ "endCaptures": {
392
+ "0": {
393
+ "name": "punctuation.section.symbol.end.crystal"
394
+ }
395
+ },
396
+ "name": "constant.other.symbol.interpolated.crystal",
397
+ "patterns": [
398
+ {
399
+ "include": "#interpolated_crystal"
400
+ },
401
+ {
402
+ "include": "#escaped_char"
403
+ }
404
+ ]
405
+ },
406
+ {
407
+ "comment": "Needs higher precedence than regular expressions.",
408
+ "match": "(?<!\\()/=",
409
+ "name": "keyword.operator.assignment.augmented.crystal"
410
+ },
411
+ {
412
+ "begin": "'",
413
+ "beginCaptures": {
414
+ "0": {
415
+ "name": "punctuation.definition.string.begin.crystal"
416
+ }
417
+ },
418
+ "comment": "string literal with '' delimiter",
419
+ "end": "'",
420
+ "endCaptures": {
421
+ "0": {
422
+ "name": "punctuation.definition.string.end.crystal"
423
+ }
424
+ },
425
+ "name": "string.quoted.single.crystal",
426
+ "patterns": [
427
+ {
428
+ "match": "\\\\'|\\\\\\\\",
429
+ "name": "constant.character.escape.crystal"
430
+ }
431
+ ]
432
+ },
433
+ {
434
+ "begin": "\"",
435
+ "beginCaptures": {
436
+ "0": {
437
+ "name": "punctuation.definition.string.begin.crystal"
438
+ }
439
+ },
440
+ "comment": "string literal with interpolation and \"\" delimiter",
441
+ "end": "\"",
442
+ "endCaptures": {
443
+ "0": {
444
+ "name": "punctuation.definition.string.end.crystal"
445
+ }
446
+ },
447
+ "name": "string.quoted.double.interpolated.crystal",
448
+ "patterns": [
449
+ {
450
+ "include": "#interpolated_crystal"
451
+ },
452
+ {
453
+ "include": "#escaped_char"
454
+ }
455
+ ]
456
+ },
457
+ {
458
+ "begin": "`",
459
+ "beginCaptures": {
460
+ "0": {
461
+ "name": "punctuation.definition.string.begin.crystal"
462
+ }
463
+ },
464
+ "comment": "execute string (allows for interpolation)",
465
+ "end": "`",
466
+ "endCaptures": {
467
+ "0": {
468
+ "name": "punctuation.definition.string.end.crystal"
469
+ }
470
+ },
471
+ "name": "string.interpolated.crystal",
472
+ "patterns": [
473
+ {
474
+ "include": "#interpolated_crystal"
475
+ },
476
+ {
477
+ "include": "#escaped_char"
478
+ }
479
+ ]
480
+ },
481
+ {
482
+ "begin": "%x\\{",
483
+ "beginCaptures": {
484
+ "0": {
485
+ "name": "punctuation.definition.string.begin.crystal"
486
+ }
487
+ },
488
+ "comment": "execute string (allow for interpolation)",
489
+ "end": "\\}",
490
+ "endCaptures": {
491
+ "0": {
492
+ "name": "punctuation.definition.string.end.crystal"
493
+ }
494
+ },
495
+ "name": "string.interpolated.crystal",
496
+ "patterns": [
497
+ {
498
+ "include": "#interpolated_crystal"
499
+ },
500
+ {
501
+ "include": "#escaped_char"
502
+ },
503
+ {
504
+ "include": "#nest_curly_i"
505
+ }
506
+ ]
507
+ },
508
+ {
509
+ "begin": "%x\\[",
510
+ "beginCaptures": {
511
+ "0": {
512
+ "name": "punctuation.definition.string.begin.crystal"
513
+ }
514
+ },
515
+ "comment": "execute string (allow for interpolation)",
516
+ "end": "\\]",
517
+ "endCaptures": {
518
+ "0": {
519
+ "name": "punctuation.definition.string.end.crystal"
520
+ }
521
+ },
522
+ "name": "string.interpolated.crystal",
523
+ "patterns": [
524
+ {
525
+ "include": "#interpolated_crystal"
526
+ },
527
+ {
528
+ "include": "#escaped_char"
529
+ },
530
+ {
531
+ "include": "#nest_brackets_i"
532
+ }
533
+ ]
534
+ },
535
+ {
536
+ "begin": "%x\\<",
537
+ "beginCaptures": {
538
+ "0": {
539
+ "name": "punctuation.definition.string.begin.crystal"
540
+ }
541
+ },
542
+ "comment": "execute string (allow for interpolation)",
543
+ "end": "\\>",
544
+ "endCaptures": {
545
+ "0": {
546
+ "name": "punctuation.definition.string.end.crystal"
547
+ }
548
+ },
549
+ "name": "string.interpolated.crystal",
550
+ "patterns": [
551
+ {
552
+ "include": "#interpolated_crystal"
553
+ },
554
+ {
555
+ "include": "#escaped_char"
556
+ },
557
+ {
558
+ "include": "#nest_ltgt_i"
559
+ }
560
+ ]
561
+ },
562
+ {
563
+ "begin": "%x\\(",
564
+ "beginCaptures": {
565
+ "0": {
566
+ "name": "punctuation.definition.string.begin.crystal"
567
+ }
568
+ },
569
+ "comment": "execute string (allow for interpolation)",
570
+ "end": "\\)",
571
+ "endCaptures": {
572
+ "0": {
573
+ "name": "punctuation.definition.string.end.crystal"
574
+ }
575
+ },
576
+ "name": "string.interpolated.crystal",
577
+ "patterns": [
578
+ {
579
+ "include": "#interpolated_crystal"
580
+ },
581
+ {
582
+ "include": "#escaped_char"
583
+ },
584
+ {
585
+ "include": "#nest_parens_i"
586
+ }
587
+ ]
588
+ },
589
+ {
590
+ "begin": "%x\\|",
591
+ "beginCaptures": {
592
+ "0": {
593
+ "name": "punctuation.definition.string.begin.crystal"
594
+ }
595
+ },
596
+ "comment": "execute string (allow for interpolation)",
597
+ "end": "\\|",
598
+ "endCaptures": {
599
+ "0": {
600
+ "name": "punctuation.definition.string.end.crystal"
601
+ }
602
+ },
603
+ "name": "string.interpolated.crystal",
604
+ "patterns": [
605
+ {
606
+ "include": "#interpolated_crystal"
607
+ },
608
+ {
609
+ "include": "#escaped_char"
610
+ }
611
+ ]
612
+ },
613
+ {
614
+ "begin": "(?x) (?: ^| (?<=[=>~(?:\\[,|&;] | [\\s;]if\\s| [\\s;]elsif\\s | [\\s;]while\\s | [\\s;]unless\\s | [\\s;]when\\s | [\\s;]assert_match\\s | [\\s;]or\\s| [\\s;]and\\s | [\\s;]not\\s | [\\s.]index\\s| [\\s.]scan\\s | [\\s.]sub\\s | [\\s.]sub!\\s | [\\s.]gsub\\s | [\\s.]gsub!\\s | [\\s.]match\\s ) | (?<=^when\\s| ^if\\s | ^elsif\\s | ^while\\s | ^unless\\s ) ) \\s*((/))(?![*+{}?])",
615
+ "captures": {
616
+ "1": {
617
+ "name": "string.regexp.classic.crystal"
618
+ },
619
+ "2": {
620
+ "name": "punctuation.definition.string.crystal"
621
+ }
622
+ },
623
+ "comment": "regular expressions (normal) we only start a regexp if the character before it (excluding whitespace) is what we think is before a regexp",
624
+ "contentName": "string.regexp.classic.crystal",
625
+ "end": "((/[imsx]*))",
626
+ "patterns": [
627
+ {
628
+ "include": "#regex_sub"
629
+ }
630
+ ]
631
+ },
632
+ {
633
+ "begin": "%r\\{",
634
+ "beginCaptures": {
635
+ "0": {
636
+ "name": "punctuation.definition.string.begin.crystal"
637
+ }
638
+ },
639
+ "comment": "regular expressions (literal)",
640
+ "end": "\\}[imsx]*",
641
+ "endCaptures": {
642
+ "0": {
643
+ "name": "punctuation.definition.string.end.crystal"
644
+ }
645
+ },
646
+ "name": "string.regexp.mod-r.crystal",
647
+ "patterns": [
648
+ {
649
+ "include": "#regex_sub"
650
+ },
651
+ {
652
+ "include": "#nest_curly_r"
653
+ }
654
+ ]
655
+ },
656
+ {
657
+ "begin": "%r\\[",
658
+ "beginCaptures": {
659
+ "0": {
660
+ "name": "punctuation.definition.string.begin.crystal"
661
+ }
662
+ },
663
+ "comment": "regular expressions (literal)",
664
+ "end": "\\][imsx]*",
665
+ "endCaptures": {
666
+ "0": {
667
+ "name": "punctuation.definition.string.end.crystal"
668
+ }
669
+ },
670
+ "name": "string.regexp.mod-r.crystal",
671
+ "patterns": [
672
+ {
673
+ "include": "#regex_sub"
674
+ },
675
+ {
676
+ "include": "#nest_brackets_r"
677
+ }
678
+ ]
679
+ },
680
+ {
681
+ "begin": "%r\\(",
682
+ "beginCaptures": {
683
+ "0": {
684
+ "name": "punctuation.definition.string.begin.crystal"
685
+ }
686
+ },
687
+ "comment": "regular expressions (literal)",
688
+ "end": "\\)[imsx]*",
689
+ "endCaptures": {
690
+ "0": {
691
+ "name": "punctuation.definition.string.end.crystal"
692
+ }
693
+ },
694
+ "name": "string.regexp.mod-r.crystal",
695
+ "patterns": [
696
+ {
697
+ "include": "#regex_sub"
698
+ },
699
+ {
700
+ "include": "#nest_parens_r"
701
+ }
702
+ ]
703
+ },
704
+ {
705
+ "begin": "%r\\<",
706
+ "beginCaptures": {
707
+ "0": {
708
+ "name": "punctuation.definition.string.begin.crystal"
709
+ }
710
+ },
711
+ "comment": "regular expressions (literal)",
712
+ "end": "\\>[imsx]*",
713
+ "endCaptures": {
714
+ "0": {
715
+ "name": "punctuation.definition.string.end.crystal"
716
+ }
717
+ },
718
+ "name": "string.regexp.mod-r.crystal",
719
+ "patterns": [
720
+ {
721
+ "include": "#regex_sub"
722
+ },
723
+ {
724
+ "include": "#nest_ltgt_r"
725
+ }
726
+ ]
727
+ },
728
+ {
729
+ "begin": "%r\\|",
730
+ "beginCaptures": {
731
+ "0": {
732
+ "name": "punctuation.definition.string.begin.crystal"
733
+ }
734
+ },
735
+ "comment": "regular expressions (literal)",
736
+ "end": "\\|[imsx]*",
737
+ "endCaptures": {
738
+ "0": {
739
+ "name": "punctuation.definition.string.end.crystal"
740
+ }
741
+ },
742
+ "name": "string.regexp.mod-r.crystal",
743
+ "patterns": [
744
+ {
745
+ "include": "#regex_sub"
746
+ }
747
+ ]
748
+ },
749
+ {
750
+ "begin": "%Q?\\(",
751
+ "beginCaptures": {
752
+ "0": {
753
+ "name": "punctuation.definition.string.begin.crystal"
754
+ }
755
+ },
756
+ "comment": "literal capable of interpolation ()",
757
+ "end": "\\)",
758
+ "endCaptures": {
759
+ "0": {
760
+ "name": "punctuation.definition.string.end.crystal"
761
+ }
762
+ },
763
+ "name": "string.quoted.other.literal.upper.crystal",
764
+ "patterns": [
765
+ {
766
+ "include": "#interpolated_crystal"
767
+ },
768
+ {
769
+ "include": "#escaped_char"
770
+ },
771
+ {
772
+ "include": "#nest_parens_i"
773
+ }
774
+ ]
775
+ },
776
+ {
777
+ "begin": "%Q?\\[",
778
+ "beginCaptures": {
779
+ "0": {
780
+ "name": "punctuation.definition.string.begin.crystal"
781
+ }
782
+ },
783
+ "comment": "literal capable of interpolation []",
784
+ "end": "\\]",
785
+ "endCaptures": {
786
+ "0": {
787
+ "name": "punctuation.definition.string.end.crystal"
788
+ }
789
+ },
790
+ "name": "string.quoted.other.literal.upper.crystal",
791
+ "patterns": [
792
+ {
793
+ "include": "#interpolated_crystal"
794
+ },
795
+ {
796
+ "include": "#escaped_char"
797
+ },
798
+ {
799
+ "include": "#nest_brackets_i"
800
+ }
801
+ ]
802
+ },
803
+ {
804
+ "begin": "%Q?\\<",
805
+ "beginCaptures": {
806
+ "0": {
807
+ "name": "punctuation.definition.string.begin.crystal"
808
+ }
809
+ },
810
+ "comment": "literal capable of interpolation <>",
811
+ "end": "\\>",
812
+ "endCaptures": {
813
+ "0": {
814
+ "name": "punctuation.definition.string.end.crystal"
815
+ }
816
+ },
817
+ "name": "string.quoted.other.literal.upper.crystal",
818
+ "patterns": [
819
+ {
820
+ "include": "#interpolated_crystal"
821
+ },
822
+ {
823
+ "include": "#escaped_char"
824
+ },
825
+ {
826
+ "include": "#nest_ltgt_i"
827
+ }
828
+ ]
829
+ },
830
+ {
831
+ "begin": "%Q?\\{",
832
+ "beginCaptures": {
833
+ "0": {
834
+ "name": "punctuation.definition.string.begin.crystal"
835
+ }
836
+ },
837
+ "comment": "literal capable of interpolation -- {}",
838
+ "end": "\\}",
839
+ "endCaptures": {
840
+ "0": {
841
+ "name": "punctuation.definition.string.end.crystal"
842
+ }
843
+ },
844
+ "name": "string.quoted.double.crystal.mod",
845
+ "patterns": [
846
+ {
847
+ "include": "#interpolated_crystal"
848
+ },
849
+ {
850
+ "include": "#escaped_char"
851
+ },
852
+ {
853
+ "include": "#nest_curly_i"
854
+ }
855
+ ]
856
+ },
857
+ {
858
+ "begin": "%Q\\|",
859
+ "beginCaptures": {
860
+ "0": {
861
+ "name": "punctuation.definition.string.begin.crystal"
862
+ }
863
+ },
864
+ "comment": "literal capable of interpolation -- ||",
865
+ "end": "\\|",
866
+ "endCaptures": {
867
+ "0": {
868
+ "name": "punctuation.definition.string.end.crystal"
869
+ }
870
+ },
871
+ "name": "string.quoted.other.literal.upper.crystal",
872
+ "patterns": [
873
+ {
874
+ "include": "#interpolated_crystal"
875
+ },
876
+ {
877
+ "include": "#escaped_char"
878
+ }
879
+ ]
880
+ },
881
+ {
882
+ "begin": "%[qwi]\\(",
883
+ "beginCaptures": {
884
+ "0": {
885
+ "name": "punctuation.definition.string.begin.crystal"
886
+ }
887
+ },
888
+ "comment": "literal incapable of interpolation -- ()",
889
+ "end": "\\)",
890
+ "endCaptures": {
891
+ "0": {
892
+ "name": "punctuation.definition.string.end.crystal"
893
+ }
894
+ },
895
+ "name": "string.quoted.other.literal.lower.crystal",
896
+ "patterns": [
897
+ {
898
+ "match": "\\\\\\)|\\\\\\\\",
899
+ "name": "constant.character.escape.crystal"
900
+ },
901
+ {
902
+ "include": "#nest_parens"
903
+ }
904
+ ]
905
+ },
906
+ {
907
+ "begin": "%[qwi]\\<",
908
+ "beginCaptures": {
909
+ "0": {
910
+ "name": "punctuation.definition.string.begin.crystal"
911
+ }
912
+ },
913
+ "comment": "literal incapable of interpolation -- <>",
914
+ "end": "\\>",
915
+ "endCaptures": {
916
+ "0": {
917
+ "name": "punctuation.definition.string.end.crystal"
918
+ }
919
+ },
920
+ "name": "string.quoted.other.literal.lower.crystal",
921
+ "patterns": [
922
+ {
923
+ "match": "\\\\\\>|\\\\\\\\",
924
+ "name": "constant.character.escape.crystal"
925
+ },
926
+ {
927
+ "include": "#nest_ltgt"
928
+ }
929
+ ]
930
+ },
931
+ {
932
+ "begin": "%[qwi]\\[",
933
+ "beginCaptures": {
934
+ "0": {
935
+ "name": "punctuation.definition.string.begin.crystal"
936
+ }
937
+ },
938
+ "comment": "literal incapable of interpolation -- []",
939
+ "end": "\\]",
940
+ "endCaptures": {
941
+ "0": {
942
+ "name": "punctuation.definition.string.end.crystal"
943
+ }
944
+ },
945
+ "name": "string.quoted.other.literal.lower.crystal",
946
+ "patterns": [
947
+ {
948
+ "match": "\\\\\\]|\\\\\\\\",
949
+ "name": "constant.character.escape.crystal"
950
+ },
951
+ {
952
+ "include": "#nest_brackets"
953
+ }
954
+ ]
955
+ },
956
+ {
957
+ "begin": "%[qwi]\\{",
958
+ "beginCaptures": {
959
+ "0": {
960
+ "name": "punctuation.definition.string.begin.crystal"
961
+ }
962
+ },
963
+ "comment": "literal incapable of interpolation -- {}",
964
+ "end": "\\}",
965
+ "endCaptures": {
966
+ "0": {
967
+ "name": "punctuation.definition.string.end.crystal"
968
+ }
969
+ },
970
+ "name": "string.quoted.other.literal.lower.crystal",
971
+ "patterns": [
972
+ {
973
+ "match": "\\\\\\}|\\\\\\\\",
974
+ "name": "constant.character.escape.crystal"
975
+ },
976
+ {
977
+ "include": "#nest_curly"
978
+ }
979
+ ]
980
+ },
981
+ {
982
+ "begin": "%[qwi]\\|",
983
+ "beginCaptures": {
984
+ "0": {
985
+ "name": "punctuation.definition.string.begin.crystal"
986
+ }
987
+ },
988
+ "comment": "literal incapable of interpolation -- ||",
989
+ "end": "\\|",
990
+ "endCaptures": {
991
+ "0": {
992
+ "name": "punctuation.definition.string.end.crystal"
993
+ }
994
+ },
995
+ "name": "string.quoted.other.literal.lower.crystal",
996
+ "patterns": [
997
+ {
998
+ "comment": "Cant be named because its not necessarily an escape.",
999
+ "match": "\\\\."
1000
+ }
1001
+ ]
1002
+ },
1003
+ {
1004
+ "captures": {
1005
+ "1": {
1006
+ "name": "punctuation.definition.constant.crystal"
1007
+ }
1008
+ },
1009
+ "comment": "symbols",
1010
+ "match": "(?<!:)(:)(?>[a-zA-Z_\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*(?>[?!]|=(?![>=]))?|===?|>[>=]?|<[<=]?|<=>|[%&`/\\|]|\\*\\*?|=?~|[-+]@?|\\[\\][?=]?|@@?[a-zA-Z_\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*)",
1011
+ "name": "constant.other.symbol.crystal"
1012
+ },
1013
+ {
1014
+ "captures": {
1015
+ "1": {
1016
+ "name": "punctuation.definition.constant.crystal"
1017
+ }
1018
+ },
1019
+ "comment": "symbols",
1020
+ "match": "(?>[a-zA-Z_\\x{80}-\\x{10FFFF}][\\w\\x{80}-\\x{10FFFF}]*(?>[?!])?)(:)(?!:)",
1021
+ "name": "constant.other.symbol.crystal.19syntax"
1022
+ },
1023
+ {
1024
+ "captures": {
1025
+ "1": {
1026
+ "name": "punctuation.definition.comment.crystal"
1027
+ }
1028
+ },
1029
+ "match": "(?:^[ \\t]+)?(#).*$\\n?",
1030
+ "name": "comment.line.number-sign.crystal"
1031
+ },
1032
+ {
1033
+ "match": "\\b_([\\w]+[?!]?)",
1034
+ "name": "comment.unused.crystal"
1035
+ },
1036
+ {
1037
+ "begin": "(?><<-('?)((?:[_\\w]+_|)HTML)\\b\\1)",
1038
+ "beginCaptures": {
1039
+ "0": {
1040
+ "name": "punctuation.definition.string.begin.crystal"
1041
+ }
1042
+ },
1043
+ "comment": "heredoc with embedded HTML and indented terminator",
1044
+ "contentName": "text.html.embedded.crystal",
1045
+ "end": "\\s*\\2\\b",
1046
+ "endCaptures": {
1047
+ "0": {
1048
+ "name": "punctuation.definition.string.end.crystal"
1049
+ }
1050
+ },
1051
+ "name": "string.unquoted.embedded.html.crystal",
1052
+ "patterns": [
1053
+ {
1054
+ "include": "#heredoc"
1055
+ },
1056
+ {
1057
+ "include": "text.html.basic"
1058
+ },
1059
+ {
1060
+ "include": "#interpolated_crystal"
1061
+ },
1062
+ {
1063
+ "include": "#escaped_char"
1064
+ }
1065
+ ]
1066
+ },
1067
+ {
1068
+ "begin": "(?><<-('?)((?:[_\\w]+_|)SQL)\\b\\1)",
1069
+ "beginCaptures": {
1070
+ "0": {
1071
+ "name": "punctuation.definition.string.begin.crystal"
1072
+ }
1073
+ },
1074
+ "comment": "heredoc with embedded SQL and indented terminator",
1075
+ "contentName": "text.sql.embedded.crystal",
1076
+ "end": "\\s*\\2\\b",
1077
+ "endCaptures": {
1078
+ "0": {
1079
+ "name": "punctuation.definition.string.end.crystal"
1080
+ }
1081
+ },
1082
+ "name": "string.unquoted.embedded.sql.crystal",
1083
+ "patterns": [
1084
+ {
1085
+ "include": "#heredoc"
1086
+ },
1087
+ {
1088
+ "include": "source.sql"
1089
+ },
1090
+ {
1091
+ "include": "#interpolated_crystal"
1092
+ },
1093
+ {
1094
+ "include": "#escaped_char"
1095
+ }
1096
+ ]
1097
+ },
1098
+ {
1099
+ "begin": "(?><<-('?)((?:[_\\w]+_|)CSS)\\b\\1)",
1100
+ "beginCaptures": {
1101
+ "0": {
1102
+ "name": "punctuation.definition.string.begin.crystal"
1103
+ }
1104
+ },
1105
+ "comment": "heredoc with embedded css and intented terminator",
1106
+ "contentName": "text.css.embedded.crystal",
1107
+ "end": "\\s*\\2\\b",
1108
+ "endCaptures": {
1109
+ "0": {
1110
+ "name": "punctuation.definition.string.end.crystal"
1111
+ }
1112
+ },
1113
+ "name": "string.unquoted.embedded.css.crystal",
1114
+ "patterns": [
1115
+ {
1116
+ "include": "#heredoc"
1117
+ },
1118
+ {
1119
+ "include": "source.css"
1120
+ },
1121
+ {
1122
+ "include": "#interpolated_crystal"
1123
+ },
1124
+ {
1125
+ "include": "#escaped_char"
1126
+ }
1127
+ ]
1128
+ },
1129
+ {
1130
+ "begin": "(?><<-('?)((?:[_\\w]+_|)CPP)\\b\\1)",
1131
+ "beginCaptures": {
1132
+ "0": {
1133
+ "name": "punctuation.definition.string.begin.crystal"
1134
+ }
1135
+ },
1136
+ "comment": "heredoc with embedded c++ and intented terminator",
1137
+ "contentName": "text.c++.embedded.crystal",
1138
+ "end": "\\s*\\2\\b",
1139
+ "endCaptures": {
1140
+ "0": {
1141
+ "name": "punctuation.definition.string.end.crystal"
1142
+ }
1143
+ },
1144
+ "name": "string.unquoted.embedded.cplusplus.crystal",
1145
+ "patterns": [
1146
+ {
1147
+ "include": "#heredoc"
1148
+ },
1149
+ {
1150
+ "include": "source.c++"
1151
+ },
1152
+ {
1153
+ "include": "#interpolated_crystal"
1154
+ },
1155
+ {
1156
+ "include": "#escaped_char"
1157
+ }
1158
+ ]
1159
+ },
1160
+ {
1161
+ "begin": "(?><<-('?)((?:[_\\w]+_|)C)\\b\\1)",
1162
+ "beginCaptures": {
1163
+ "0": {
1164
+ "name": "punctuation.definition.string.begin.crystal"
1165
+ }
1166
+ },
1167
+ "comment": "heredoc with embedded c++ and intented terminator",
1168
+ "contentName": "text.c.embedded.crystal",
1169
+ "end": "\\s*\\2\\b",
1170
+ "endCaptures": {
1171
+ "0": {
1172
+ "name": "punctuation.definition.string.end.crystal"
1173
+ }
1174
+ },
1175
+ "name": "string.unquoted.embedded.c.crystal",
1176
+ "patterns": [
1177
+ {
1178
+ "include": "#heredoc"
1179
+ },
1180
+ {
1181
+ "include": "source.c"
1182
+ },
1183
+ {
1184
+ "include": "#interpolated_crystal"
1185
+ },
1186
+ {
1187
+ "include": "#escaped_char"
1188
+ }
1189
+ ]
1190
+ },
1191
+ {
1192
+ "begin": "(?><<-('?)((?:[_\\w]+_|)(?:JS|JAVASCRIPT))\\b\\1)",
1193
+ "beginCaptures": {
1194
+ "0": {
1195
+ "name": "punctuation.definition.string.begin.crystal"
1196
+ }
1197
+ },
1198
+ "comment": "heredoc with embedded javascript and intented terminator",
1199
+ "contentName": "text.js.embedded.crystal",
1200
+ "end": "\\s*\\2\\b",
1201
+ "endCaptures": {
1202
+ "0": {
1203
+ "name": "punctuation.definition.string.end.crystal"
1204
+ }
1205
+ },
1206
+ "name": "string.unquoted.embedded.js.crystal",
1207
+ "patterns": [
1208
+ {
1209
+ "include": "#heredoc"
1210
+ },
1211
+ {
1212
+ "include": "source.js"
1213
+ },
1214
+ {
1215
+ "include": "#interpolated_crystal"
1216
+ },
1217
+ {
1218
+ "include": "#escaped_char"
1219
+ }
1220
+ ]
1221
+ },
1222
+ {
1223
+ "begin": "(?><<-('?)((?:[_\\w]+_|)JQUERY)\\b\\1)",
1224
+ "beginCaptures": {
1225
+ "0": {
1226
+ "name": "punctuation.definition.string.begin.crystal"
1227
+ }
1228
+ },
1229
+ "comment": "heredoc with embedded javascript and intented terminator",
1230
+ "contentName": "text.js.jquery.embedded.crystal",
1231
+ "end": "\\s*\\2\\b",
1232
+ "endCaptures": {
1233
+ "0": {
1234
+ "name": "punctuation.definition.string.end.crystal"
1235
+ }
1236
+ },
1237
+ "name": "string.unquoted.embedded.js.jquery.crystal",
1238
+ "patterns": [
1239
+ {
1240
+ "include": "#heredoc"
1241
+ },
1242
+ {
1243
+ "include": "source.js.jquery"
1244
+ },
1245
+ {
1246
+ "include": "#interpolated_crystal"
1247
+ },
1248
+ {
1249
+ "include": "#escaped_char"
1250
+ }
1251
+ ]
1252
+ },
1253
+ {
1254
+ "begin": "(?><<-('?)((?:[_\\w]+_|)(?:SH|SHELL))\\b\\1)",
1255
+ "beginCaptures": {
1256
+ "0": {
1257
+ "name": "punctuation.definition.string.begin.crystal"
1258
+ }
1259
+ },
1260
+ "comment": "heredoc with embedded shell and intented terminator",
1261
+ "contentName": "text.shell.embedded.crystal",
1262
+ "end": "\\s*\\2\\b",
1263
+ "endCaptures": {
1264
+ "0": {
1265
+ "name": "punctuation.definition.string.end.crystal"
1266
+ }
1267
+ },
1268
+ "name": "string.unquoted.embedded.shell.crystal",
1269
+ "patterns": [
1270
+ {
1271
+ "include": "#heredoc"
1272
+ },
1273
+ {
1274
+ "include": "source.shell"
1275
+ },
1276
+ {
1277
+ "include": "#interpolated_crystal"
1278
+ },
1279
+ {
1280
+ "include": "#escaped_char"
1281
+ }
1282
+ ]
1283
+ },
1284
+ {
1285
+ "begin": "(?><<-('?)((?:[_\\w]+_|)CRYSTAL)\\b\\1)",
1286
+ "beginCaptures": {
1287
+ "0": {
1288
+ "name": "punctuation.definition.string.begin.crystal"
1289
+ }
1290
+ },
1291
+ "comment": "heredoc with embedded crystal and intented terminator",
1292
+ "contentName": "text.crystal.embedded.crystal",
1293
+ "end": "\\s*\\2\\b",
1294
+ "endCaptures": {
1295
+ "0": {
1296
+ "name": "punctuation.definition.string.end.crystal"
1297
+ }
1298
+ },
1299
+ "name": "string.unquoted.embedded.crystal.crystal",
1300
+ "patterns": [
1301
+ {
1302
+ "include": "#heredoc"
1303
+ },
1304
+ {
1305
+ "include": "source.crystal"
1306
+ },
1307
+ {
1308
+ "include": "#interpolated_crystal"
1309
+ },
1310
+ {
1311
+ "include": "#escaped_char"
1312
+ }
1313
+ ]
1314
+ },
1315
+ {
1316
+ "begin": "(?><<-'(\\w+)')",
1317
+ "beginCaptures": {
1318
+ "0": {
1319
+ "name": "punctuation.definition.string.begin.crystal"
1320
+ }
1321
+ },
1322
+ "comment": "heredoc with indented terminator",
1323
+ "end": "\\s*\\1\\b",
1324
+ "endCaptures": {
1325
+ "0": {
1326
+ "name": "punctuation.definition.string.end.crystal"
1327
+ }
1328
+ },
1329
+ "name": "string.unquoted.heredoc.crystal",
1330
+ "patterns": [
1331
+ {
1332
+ "include": "#heredoc"
1333
+ },
1334
+ {
1335
+ "include": "#escaped_char"
1336
+ }
1337
+ ]
1338
+ },
1339
+ {
1340
+ "begin": "(?><<-(\\w+)\\b)",
1341
+ "beginCaptures": {
1342
+ "0": {
1343
+ "name": "punctuation.definition.string.begin.crystal"
1344
+ }
1345
+ },
1346
+ "comment": "heredoc with indented terminator",
1347
+ "end": "\\s*\\1\\b",
1348
+ "endCaptures": {
1349
+ "0": {
1350
+ "name": "punctuation.definition.string.end.crystal"
1351
+ }
1352
+ },
1353
+ "name": "string.unquoted.heredoc.crystal",
1354
+ "patterns": [
1355
+ {
1356
+ "include": "#heredoc"
1357
+ },
1358
+ {
1359
+ "include": "#interpolated_crystal"
1360
+ },
1361
+ {
1362
+ "include": "#escaped_char"
1363
+ }
1364
+ ]
1365
+ },
1366
+ {
1367
+ "begin": "(?<={|{\\s|[^A-Za-z0-9_]do|^do|[^A-Za-z0-9_]do\\s|^do\\s)(\\|)",
1368
+ "captures": {
1369
+ "1": {
1370
+ "name": "punctuation.separator.variable.crystal"
1371
+ }
1372
+ },
1373
+ "end": "(?<!\\|)(\\|)(?!\\|)",
1374
+ "patterns": [
1375
+ {
1376
+ "include": "source.crystal"
1377
+ },
1378
+ {
1379
+ "match": "[_a-zA-Z][_a-zA-Z0-9]*",
1380
+ "name": "variable.other.block.crystal"
1381
+ },
1382
+ {
1383
+ "match": ",",
1384
+ "name": "punctuation.separator.variable.crystal"
1385
+ }
1386
+ ]
1387
+ },
1388
+ {
1389
+ "match": "=>",
1390
+ "name": "punctuation.separator.key-value"
1391
+ },
1392
+ {
1393
+ "match": "->",
1394
+ "name": "support.function.kernel.crystal"
1395
+ },
1396
+ {
1397
+ "match": "<<=|%=|&{1,2}=|\\*=|\\*\\*=|\\+=|-=|\\^=|\\|{1,2}=|<<",
1398
+ "name": "keyword.operator.assignment.augmented.crystal"
1399
+ },
1400
+ {
1401
+ "match": "<=>|<(?!<|=)|>(?!<|=|>)|<=|>=|===|==|=~|!=|!~|(?<=[ \\t])\\?",
1402
+ "name": "keyword.operator.comparison.crystal"
1403
+ },
1404
+ {
1405
+ "match": "(?<=^|[ \\t])!|&&|\\|\\||\\^",
1406
+ "name": "keyword.operator.logical.crystal"
1407
+ },
1408
+ {
1409
+ "match": "(\\{\\%|\\%\\}|\\{\\{|\\}\\})",
1410
+ "name": "keyword.operator.macro.crystal"
1411
+ },
1412
+ {
1413
+ "captures": {
1414
+ "1": {
1415
+ "name": "punctuation.separator.method.crystal"
1416
+ }
1417
+ },
1418
+ "comment": "Safe navigation operator",
1419
+ "match": "(&\\.)\\s*(?![A-Z])"
1420
+ },
1421
+ {
1422
+ "match": "(%|&|\\*\\*|\\*|\\+|\\-|/)",
1423
+ "name": "keyword.operator.arithmetic.crystal"
1424
+ },
1425
+ {
1426
+ "match": "=",
1427
+ "name": "keyword.operator.assignment.crystal"
1428
+ },
1429
+ {
1430
+ "match": "\\||~|>>",
1431
+ "name": "keyword.operator.other.crystal"
1432
+ },
1433
+ {
1434
+ "match": ":",
1435
+ "name": "punctuation.separator.other.crystal"
1436
+ },
1437
+ {
1438
+ "match": "\\;",
1439
+ "name": "punctuation.separator.statement.crystal"
1440
+ },
1441
+ {
1442
+ "match": ",",
1443
+ "name": "punctuation.separator.object.crystal"
1444
+ },
1445
+ {
1446
+ "match": "\\.|::",
1447
+ "name": "punctuation.separator.method.crystal"
1448
+ },
1449
+ {
1450
+ "match": "\\{|\\}",
1451
+ "name": "punctuation.section.scope.crystal"
1452
+ },
1453
+ {
1454
+ "match": "\\[|\\]",
1455
+ "name": "punctuation.section.array.crystal"
1456
+ },
1457
+ {
1458
+ "match": "\\(|\\)",
1459
+ "name": "punctuation.section.function.crystal"
1460
+ },
1461
+ {
1462
+ "begin": "(?=[a-zA-Z0-9_!?]+\\()",
1463
+ "end": "(?<=\\))",
1464
+ "name": "meta.function-call.crystal",
1465
+ "patterns": [
1466
+ {
1467
+ "match": "([a-zA-Z0-9_!?]+)(?=\\()",
1468
+ "name": "entity.name.function.crystal"
1469
+ },
1470
+ {
1471
+ "include": "$self"
1472
+ }
1473
+ ]
1474
+ },
1475
+ {
1476
+ "comment": "This is kindof experimental. There really is no way to perfectly match all regular variables, but you can pretty well assume that any normal word in certain curcumstances that havnt already been scoped as something else are probably variables, and the advantages beat the potential errors",
1477
+ "match": "((?<=\\W)\\b|^)\\w+\\b(?=\\s*([\\]\\)\\}\\=\\+\\-\\*\\/\\^\\$\\,\\.]|<\\s|<<[\\s|\\.]))",
1478
+ "name": "variable.other.crystal"
1479
+ }
1480
+ ],
1481
+ "repository": {
1482
+ "escaped_char": {
1483
+ "comment": "https://crystal-lang.org/reference/syntax_and_semantics/literals/string.html",
1484
+ "match": "\\\\(?:[0-7]{1,3}|x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|u\\{[a-fA-F0-9 ]+\\}|.)",
1485
+ "name": "constant.character.escape.crystal"
1486
+ },
1487
+ "heredoc": {
1488
+ "begin": "^<<-?\\w+",
1489
+ "end": "$",
1490
+ "patterns": [
1491
+ {
1492
+ "include": "$self"
1493
+ }
1494
+ ]
1495
+ },
1496
+ "interpolated_crystal": {
1497
+ "patterns": [
1498
+ {
1499
+ "begin": "#\\{",
1500
+ "beginCaptures": {
1501
+ "0": {
1502
+ "name": "punctuation.section.embedded.begin.crystal"
1503
+ }
1504
+ },
1505
+ "contentName": "source.crystal",
1506
+ "end": "(\\})",
1507
+ "endCaptures": {
1508
+ "0": {
1509
+ "name": "punctuation.section.embedded.end.crystal"
1510
+ },
1511
+ "1": {
1512
+ "name": "source.crystal"
1513
+ }
1514
+ },
1515
+ "name": "meta.embedded.line.crystal",
1516
+ "patterns": [
1517
+ {
1518
+ "include": "#nest_curly_and_self"
1519
+ },
1520
+ {
1521
+ "include": "$self"
1522
+ }
1523
+ ],
1524
+ "repository": {
1525
+ "nest_curly_and_self": {
1526
+ "patterns": [
1527
+ {
1528
+ "begin": "\\{",
1529
+ "captures": {
1530
+ "0": {
1531
+ "name": "punctuation.section.scope.crystal"
1532
+ }
1533
+ },
1534
+ "end": "\\}",
1535
+ "patterns": [
1536
+ {
1537
+ "include": "#nest_curly_and_self"
1538
+ }
1539
+ ]
1540
+ },
1541
+ {
1542
+ "include": "$self"
1543
+ }
1544
+ ]
1545
+ }
1546
+ }
1547
+ },
1548
+ {
1549
+ "captures": {
1550
+ "1": {
1551
+ "name": "punctuation.definition.variable.crystal"
1552
+ }
1553
+ },
1554
+ "match": "(#@)[a-zA-Z_]\\w*",
1555
+ "name": "variable.other.readwrite.instance.crystal"
1556
+ },
1557
+ {
1558
+ "captures": {
1559
+ "1": {
1560
+ "name": "punctuation.definition.variable.crystal"
1561
+ }
1562
+ },
1563
+ "match": "(#@@)[a-zA-Z_]\\w*",
1564
+ "name": "variable.other.readwrite.class.crystal"
1565
+ },
1566
+ {
1567
+ "captures": {
1568
+ "1": {
1569
+ "name": "punctuation.definition.variable.crystal"
1570
+ }
1571
+ },
1572
+ "match": "(#\\$)[a-zA-Z_]\\w*",
1573
+ "name": "variable.other.readwrite.global.crystal"
1574
+ }
1575
+ ]
1576
+ },
1577
+ "nest_brackets": {
1578
+ "begin": "\\[",
1579
+ "captures": {
1580
+ "0": {
1581
+ "name": "punctuation.section.scope.crystal"
1582
+ }
1583
+ },
1584
+ "end": "\\]",
1585
+ "patterns": [
1586
+ {
1587
+ "include": "#nest_brackets"
1588
+ }
1589
+ ]
1590
+ },
1591
+ "nest_brackets_i": {
1592
+ "begin": "\\[",
1593
+ "captures": {
1594
+ "0": {
1595
+ "name": "punctuation.section.scope.crystal"
1596
+ }
1597
+ },
1598
+ "end": "\\]",
1599
+ "patterns": [
1600
+ {
1601
+ "include": "#interpolated_crystal"
1602
+ },
1603
+ {
1604
+ "include": "#escaped_char"
1605
+ },
1606
+ {
1607
+ "include": "#nest_brackets_i"
1608
+ }
1609
+ ]
1610
+ },
1611
+ "nest_brackets_r": {
1612
+ "begin": "\\[",
1613
+ "captures": {
1614
+ "0": {
1615
+ "name": "punctuation.section.scope.crystal"
1616
+ }
1617
+ },
1618
+ "end": "\\]",
1619
+ "patterns": [
1620
+ {
1621
+ "include": "#regex_sub"
1622
+ },
1623
+ {
1624
+ "include": "#nest_brackets_r"
1625
+ }
1626
+ ]
1627
+ },
1628
+ "nest_curly": {
1629
+ "begin": "\\{",
1630
+ "captures": {
1631
+ "0": {
1632
+ "name": "punctuation.section.scope.crystal"
1633
+ }
1634
+ },
1635
+ "end": "\\}",
1636
+ "patterns": [
1637
+ {
1638
+ "include": "#nest_curly"
1639
+ }
1640
+ ]
1641
+ },
1642
+ "nest_curly_and_self": {
1643
+ "patterns": [
1644
+ {
1645
+ "begin": "\\{",
1646
+ "captures": {
1647
+ "0": {
1648
+ "name": "punctuation.section.scope.crystal"
1649
+ }
1650
+ },
1651
+ "end": "\\}",
1652
+ "patterns": [
1653
+ {
1654
+ "include": "#nest_curly_and_self"
1655
+ }
1656
+ ]
1657
+ },
1658
+ {
1659
+ "include": "$self"
1660
+ }
1661
+ ]
1662
+ },
1663
+ "nest_curly_i": {
1664
+ "begin": "\\{",
1665
+ "captures": {
1666
+ "0": {
1667
+ "name": "punctuation.section.scope.crystal"
1668
+ }
1669
+ },
1670
+ "end": "\\}",
1671
+ "patterns": [
1672
+ {
1673
+ "include": "#interpolated_crystal"
1674
+ },
1675
+ {
1676
+ "include": "#escaped_char"
1677
+ },
1678
+ {
1679
+ "include": "#nest_curly_i"
1680
+ }
1681
+ ]
1682
+ },
1683
+ "nest_curly_r": {
1684
+ "begin": "\\{",
1685
+ "captures": {
1686
+ "0": {
1687
+ "name": "punctuation.section.scope.crystal"
1688
+ }
1689
+ },
1690
+ "end": "\\}",
1691
+ "patterns": [
1692
+ {
1693
+ "include": "#regex_sub"
1694
+ },
1695
+ {
1696
+ "include": "#nest_curly_r"
1697
+ }
1698
+ ]
1699
+ },
1700
+ "nest_ltgt": {
1701
+ "begin": "\\<",
1702
+ "captures": {
1703
+ "0": {
1704
+ "name": "punctuation.section.scope.crystal"
1705
+ }
1706
+ },
1707
+ "end": "\\>",
1708
+ "patterns": [
1709
+ {
1710
+ "include": "#nest_ltgt"
1711
+ }
1712
+ ]
1713
+ },
1714
+ "nest_ltgt_i": {
1715
+ "begin": "\\<",
1716
+ "captures": {
1717
+ "0": {
1718
+ "name": "punctuation.section.scope.crystal"
1719
+ }
1720
+ },
1721
+ "end": "\\>",
1722
+ "patterns": [
1723
+ {
1724
+ "include": "#interpolated_crystal"
1725
+ },
1726
+ {
1727
+ "include": "#escaped_char"
1728
+ },
1729
+ {
1730
+ "include": "#nest_ltgt_i"
1731
+ }
1732
+ ]
1733
+ },
1734
+ "nest_ltgt_r": {
1735
+ "begin": "\\<",
1736
+ "captures": {
1737
+ "0": {
1738
+ "name": "punctuation.section.scope.crystal"
1739
+ }
1740
+ },
1741
+ "end": "\\>",
1742
+ "patterns": [
1743
+ {
1744
+ "include": "#regex_sub"
1745
+ },
1746
+ {
1747
+ "include": "#nest_ltgt_r"
1748
+ }
1749
+ ]
1750
+ },
1751
+ "nest_parens": {
1752
+ "begin": "\\(",
1753
+ "captures": {
1754
+ "0": {
1755
+ "name": "punctuation.section.scope.crystal"
1756
+ }
1757
+ },
1758
+ "end": "\\)",
1759
+ "patterns": [
1760
+ {
1761
+ "include": "#nest_parens"
1762
+ }
1763
+ ]
1764
+ },
1765
+ "nest_parens_i": {
1766
+ "begin": "\\(",
1767
+ "captures": {
1768
+ "0": {
1769
+ "name": "punctuation.section.scope.crystal"
1770
+ }
1771
+ },
1772
+ "end": "\\)",
1773
+ "patterns": [
1774
+ {
1775
+ "include": "#interpolated_crystal"
1776
+ },
1777
+ {
1778
+ "include": "#escaped_char"
1779
+ },
1780
+ {
1781
+ "include": "#nest_parens_i"
1782
+ }
1783
+ ]
1784
+ },
1785
+ "nest_parens_r": {
1786
+ "begin": "\\(",
1787
+ "captures": {
1788
+ "0": {
1789
+ "name": "punctuation.section.scope.crystal"
1790
+ }
1791
+ },
1792
+ "end": "\\)",
1793
+ "patterns": [
1794
+ {
1795
+ "include": "#regex_sub"
1796
+ },
1797
+ {
1798
+ "include": "#nest_parens_r"
1799
+ }
1800
+ ]
1801
+ },
1802
+ "regex_sub": {
1803
+ "patterns": [
1804
+ {
1805
+ "include": "#interpolated_crystal"
1806
+ },
1807
+ {
1808
+ "include": "#escaped_char"
1809
+ },
1810
+ {
1811
+ "captures": {
1812
+ "1": {
1813
+ "name": "punctuation.definition.arbitrary-repetition.crystal"
1814
+ },
1815
+ "3": {
1816
+ "name": "punctuation.definition.arbitrary-repetition.crystal"
1817
+ }
1818
+ },
1819
+ "match": "({)\\d+(,\\d+)?(})",
1820
+ "name": "string.regexp.arbitrary-repetition.crystal"
1821
+ },
1822
+ {
1823
+ "begin": "\\[(?:\\^?])?",
1824
+ "captures": {
1825
+ "0": {
1826
+ "name": "punctuation.definition.character-class.crystal"
1827
+ }
1828
+ },
1829
+ "end": "]",
1830
+ "name": "string.regexp.character-class.crystal",
1831
+ "patterns": [
1832
+ {
1833
+ "include": "#escaped_char"
1834
+ }
1835
+ ]
1836
+ },
1837
+ {
1838
+ "begin": "\\(",
1839
+ "captures": {
1840
+ "0": {
1841
+ "name": "punctuation.definition.group.crystal"
1842
+ }
1843
+ },
1844
+ "end": "\\)",
1845
+ "name": "string.regexp.group.crystal",
1846
+ "patterns": [
1847
+ {
1848
+ "include": "#regex_sub"
1849
+ }
1850
+ ]
1851
+ },
1852
+ {
1853
+ "captures": {
1854
+ "1": {
1855
+ "name": "punctuation.definition.comment.crystal"
1856
+ }
1857
+ },
1858
+ "comment": "We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.",
1859
+ "match": "(?<=^|\\s)(#)\\s[[a-zA-Z0-9,. \\t?!-][^\\x{00}-\\x{7F}]]*$",
1860
+ "name": "comment.line.number-sign.crystal"
1861
+ }
1862
+ ]
1863
+ }
1864
+ },
1865
+ "scopeName": "source.crystal"
1866
+ }