/
source.nu.js
298 lines (297 loc) · 9.98 KB
/
source.nu.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
// This is a TextMate grammar distributed by `starry-night`.
// This grammar is licensed `apache-2.0`.
// See <https://github.com/wooorm/starry-night> for more info.
/** @type {import('../lib/index.js').Grammar} */
const grammar = {
extensions: ['.nu'],
names: ['nu', 'nush'],
patterns: [
{
match: '\\b(t|nil|self|super|YES|NO|margs)\\b',
name: 'constant.language.nu'
},
{
match:
'\\b((0(x|X)[0-9a-fA-F]*)|-?(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b',
name: 'constant.numeric.nu'
},
{
captures: {
1: {name: 'punctuation.definition.constant.nu'},
4: {name: 'punctuation.definition.constant.nu'}
},
match:
"(')(.|\\\\[nrfbaes]|\\\\[0-7]{3}|\\\\x[0-9A-Fa-f]{2}|\\\\u[0-9A-Fa-f]{4})(')",
name: 'constant.character.nu'
},
{
captures: {1: {name: 'punctuation.definition.variable.nu'}},
match: '(@)[a-zA-Z_]\\w*',
name: 'variable.other.readwrite.instance.nu'
},
{
captures: {1: {name: 'punctuation.definition.variable.nu'}},
match: '(\\$)[a-zA-Z_]\\w*',
name: 'variable.other.readwrite.global.nu'
},
{match: '\\b[A-Z]\\w*\\b', name: 'support.class.nu'},
{
captures: {
1: {name: 'punctuation.definition.comment.nudoc.nu'},
2: {name: 'support.comment.nudoc.nu'}
},
match: '(;.*|#.*)(@(abstract|copyright|discussion|file|header|info).*)',
name: 'comment.nudoc.nu'
},
{
captures: {1: {name: 'punctuation.definition.comment.nu'}},
match: '(;).*$\\n?',
name: 'comment.line.semicolon.nu'
},
{
captures: {1: {name: 'punctuation.definition.comment.nu'}},
match: '(#).*$\\n?',
name: 'comment.line.hash.nu'
},
{
begin: '-"',
beginCaptures: {0: {name: 'punctuation.definition.string.begin.nu'}},
end: '"',
endCaptures: {0: {name: 'punctuation.definition.string.end.nu'}},
name: 'string.quoted.double.unescaped.nu',
patterns: [{include: '#interpolated_nu'}]
},
{
begin: '\\+?"',
beginCaptures: {0: {name: 'punctuation.definition.string.begin.nu'}},
end: '"',
endCaptures: {0: {name: 'punctuation.definition.string.end.nu'}},
name: 'string.quoted.double.escaped.nu',
patterns: [{include: '#escaped_char'}, {include: '#interpolated_nu'}]
},
{
begin: '<<[+](.*)',
beginCaptures: {0: {name: 'punctuation.definition.string.begin.nu'}},
end: '\\1',
endCaptures: {0: {name: 'punctuation.definition.string.end.nu'}},
name: 'string.unquoted.heredoc.escaped.nu',
patterns: [{include: '#escaped_char'}, {include: '#interpolated_nu'}]
},
{
begin: '<<[-](.*)',
beginCaptures: {0: {name: 'punctuation.definition.string.begin.nu'}},
end: '\\1',
endCaptures: {0: {name: 'punctuation.definition.string.end.nu'}},
name: 'string.unquoted.heredoc.unescaped.nu',
patterns: [{include: '#interpolated_nu'}]
},
{
begin: '(/)(?=[^ ])',
beginCaptures: {1: {name: 'punctuation.definition.regex.begin.nu'}},
end: '/[isxlm]*',
endCaptures: {0: {name: 'punctuation.definition.regex.end.nu'}},
name: 'string.regexp.nu',
patterns: [{match: '\\\\/', name: 'constant.character.escape.nu'}]
},
{
captures: {
1: {name: 'keyword.control.class.nu'},
2: {name: 'entity.name.function.nu'},
5: {name: 'keyword.control.is.nu'},
6: {name: 'entity.name.function.nu'}
},
match:
'\\b(class)\\s+((\\w|\\-|\\!|\\?)*)(\\s+(is)\\s+((\\w|\\-|\\!|\\?)*))?',
name: 'meta.class.nu'
},
{
captures: {
1: {name: 'keyword.control.protocol.nu'},
2: {name: 'entity.name.function.nu'}
},
match: '\\b(protocol)\\s+((\\w)*)',
name: 'meta.protocol.nu'
},
{
captures: {
1: {name: 'keyword.control.import.nu'},
2: {name: 'entity.name.type.class.nu'}
},
match: '\\((import)\\s+(\\w*)',
name: 'meta.import.nu'
},
{
captures: {
1: {name: 'keyword.control.global.nu'},
2: {name: 'variable.other.readwrite.global.nu'}
},
match: '\\((global)\\s+([\\w\\-]*)',
name: 'meta.global.nu'
},
{
captures: {
1: {name: 'keyword.control.method.nu'},
2: {name: 'storage.type.class.nu'},
3: {name: 'entity.name.function.nu'},
4: {name: 'keyword.control.is.nu'}
},
match: '\\(([+-]|[ic]method)\\s+\\((\\w+)\\)\\s+(\\w+)\\s+(is)',
name: 'meta.method.nu.zero-args'
},
{
captures: {
1: {name: 'keyword.control.method.nu'},
2: {name: 'storage.type.class.nu'},
3: {name: 'entity.name.function.nu'},
4: {name: 'storage.type.class.nu'},
5: {name: 'variable.parameter.function.nu'},
6: {name: 'keyword.control.is.nu'}
},
match:
'\\(([+-]|[ic]method)\\s+\\((\\w+)\\)\\s+(\\w+\\:)\\s*\\((\\w+)\\)\\s+(\\w+)\\s+(is)',
name: 'meta.method.nu.one-arg'
},
{
captures: {
1: {name: 'keyword.control.method.nu'},
2: {name: 'storage.type.class.nu'},
3: {name: 'entity.name.function.nu'},
4: {name: 'storage.type.class.nu'},
5: {name: 'variable.parameter.function.nu'},
6: {name: 'entity.name.function.nu'},
7: {name: 'storage.type.class.nu'},
8: {name: 'variable.parameter.function.nu'},
9: {name: 'keyword.control.is.nu'}
},
match:
'\\(([+-]|[ic]method)\\s+\\((\\w+)\\)\\s+(\\w+\\:)\\s*\\((\\w+)\\)\\s+(\\w+)\\s+(\\w+\\:)\\s*\\((\\w+)\\)\\s+(\\w+)\\s+(is)',
name: 'meta.method.nu.two-args'
},
{
captures: {
1: {name: 'keyword.control.method.nu'},
10: {name: 'storage.type.class.nu'},
11: {name: 'variable.parameter.function.nu'},
12: {name: 'keyword.control.is.nu'},
2: {name: 'storage.type.class.nu'},
3: {name: 'entity.name.function.nu'},
4: {name: 'storage.type.class.nu'},
5: {name: 'variable.parameter.function.nu'},
6: {name: 'entity.name.function.nu'},
7: {name: 'storage.type.class.nu'},
8: {name: 'variable.parameter.function.nu'},
9: {name: 'entity.name.function.nu'}
},
match:
'\\(([+-]|[ic]method)\\s+\\((\\w+)\\)\\s+(\\w+\\:)\\s*\\((\\w+)\\)\\s+(\\w+)\\s+(\\w+\\:)\\s*\\((\\w+)\\)\\s+(\\w+)\\s+(\\w+\\:)\\s*\\((\\w+)\\)\\s+(\\w+)\\s+(is)',
name: 'meta.method.nu.three-args'
},
{
captures: {
1: {name: 'keyword.control.class.nu'},
2: {name: 'entity.name.function.nu'},
5: {name: 'keyword.control.class.nu'},
6: {name: 'entity.name.function.nu'}
},
match:
'\\b((ivar)\\s+((\\w|\\-|\\!|\\?)*)(\\s+(is)\\s+((\\w|\\-|\\!|\\?)*))?|ivars|ivar-accessors)',
name: 'meta.ivars.nu'
},
{
captures: {
1: {name: 'keyword.control.function-type.nu'},
2: {name: 'entity.name.function.nu'}
},
match: '\\b(function|macro|macro-0|macro-1)\\s+((\\w|\\-|\\!|\\?)*)',
name: 'meta.function.nu'
},
{
captures: {
1: {name: 'keyword.control.task.nu'},
2: {name: 'entity.name.task.nu'},
3: {name: 'keyword.control.colon.nu'},
4: {name: 'storage.description.task.nu'},
5: {name: 'keyword.control.is.nu'}
},
match: '(task)\\s+(\\"\\w+")\\s?(:?)\\s?(\\"[\\w\\s]+\\")?\\s+(is)',
name: 'meta.nukefile.task.nu'
},
{
captures: {
1: {name: 'keyword.control.task.nu'},
2: {name: 'entity.name.task.nu'},
3: {name: 'keyword.control.colon.nu'},
4: {name: 'storage.description.task.nu'},
5: {name: 'keyword.control.arrow.nu'},
6: {name: 'support.dependency.task.nu'},
7: {name: 'keyword.control.is.nu'}
},
match:
'(task)\\s+(\\"\\w+\\")\\s?(:)?\\s?(\\"[\\w\\s]+\\")?\\s?(=>?)\\s?(\\"[\\"\\w\\s]+\\")?\\s+(is)',
name: 'meta.nukefile.task.with-dependencies.nu'
},
{
captures: {
1: {name: 'keyword.control.task.nu'},
2: {name: 'entity.name.task.nu'},
3: {name: 'keyword.control.arrow.nu'},
4: {name: 'support.name.task.nu'},
5: {name: 'keyword.control.is.nu'}
},
match: '(task)\\s+(\\"default\\")\\s+(=>)\\s+(\\"\\w+\\")',
name: 'meta.nukefile.default.task.nu'
},
{
match:
'\\b(let|set|cond|case|do|loop|until|while|for|break|continue|if|else|elseif|then|unless|try|throw|catch|array|dict|list|return)\\b',
name: 'keyword.control.nu'
},
{
match: '\\b(eq|neq|and|or|synchronized|not)\\b',
name: 'keyword.operator.nu'
},
{match: '[/*+-/&|><=!`@]', name: 'keyword.operator.symbolic.nu'},
{
match:
'\\b(append|atom|cons|car|cdr|context|eval|head|quote|parse|progn|send|tail|load|system|puts|help|version|beep|first|rest|macrox|print)\\b',
name: 'support.function.nu'
},
{
match:
'\\b(assert_equal|assert_not_equal|assert_throws|assert_in_delta|assert_true|assert_false|assert_less_than|assert_greater_than)\\b',
name: 'support.function.testing.nu'
},
{
match:
'\\b(task|application-tasks|bundle-tasks|compilation-tasks|dylib-tasks|framework-tasks|library-tasks)\\b',
name: 'keyword.nukefile.nu'
}
],
repository: {
escaped_char: {
match: '\\\\([0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|.)',
name: 'constant.character.escape.nu'
},
interpolated_nu: {
patterns: [
{
captures: {
0: {name: 'punctuation.section.embedded.nu'},
1: {name: 'source.nu.embedded.source.empty'}
},
match: '#\\{(\\})',
name: 'source.nu.embedded.source'
},
{
begin: '#\\{',
captures: {0: {name: 'punctuation.section.embedded.nu'}},
end: '\\}',
name: 'source.nu.embedded.source',
patterns: [{include: '$self'}]
}
]
}
},
scopeName: 'source.nu'
}
export default grammar