Skip to content

Commit edac3f2

Browse files
Transform crystal
1 parent adb9c1b commit edac3f2

File tree

1 file changed

+46
-41
lines changed

1 file changed

+46
-41
lines changed

src/languages/crystal.js

Lines changed: 46 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,11 @@
11
import { toArray } from '../util/iterables.js';
2-
import { insertBefore } from '../util/language-util.js';
32
import ruby from './ruby.js';
43

54
/** @type {import('../types.d.ts').LanguageProto<'crystal'>} */
65
export default {
76
id: 'crystal',
87
base: ruby,
98
grammar ({ base }) {
10-
insertBefore(base, 'string-literal', {
11-
'attribute': {
12-
pattern: /@\[.*?\]/,
13-
inside: {
14-
'delimiter': {
15-
pattern: /^@\[|\]$/,
16-
alias: 'punctuation',
17-
},
18-
'attribute': {
19-
pattern: /^(\s*)\w+/,
20-
lookbehind: true,
21-
alias: 'class-name',
22-
},
23-
'args': {
24-
pattern: /\S(?:[\s\S]*\S)?/,
25-
inside: 'crystal',
26-
},
27-
},
28-
},
29-
'expansion': {
30-
pattern: /\{(?:\{.*?\}|%.*?%)\}/,
31-
inside: {
32-
'content': {
33-
pattern: /^(\{.)[\s\S]+(?=.\}$)/,
34-
lookbehind: true,
35-
inside: 'crystal',
36-
},
37-
'delimiter': {
38-
pattern: /^\{[\{%]|[\}%]\}$/,
39-
alias: 'operator',
40-
},
41-
},
42-
},
43-
'char': {
44-
pattern: /'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,
45-
greedy: true,
46-
},
47-
});
48-
499
return {
5010
'keyword': [
5111
/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,
@@ -56,8 +16,53 @@ export default {
5616
],
5717
'number':
5818
/\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,
59-
'operator': [/->/, ...toArray(base.operator)],
19+
'operator': [
20+
/->/,
21+
...toArray(/** @type {import('../types.d.ts').GrammarTokens} */ (base).operator),
22+
],
6023
'punctuation': /[(){}[\].,;\\]/,
24+
$insert: {
25+
'attribute': {
26+
$before: 'string-literal',
27+
pattern: /@\[.*?\]/,
28+
inside: {
29+
'delimiter': {
30+
pattern: /^@\[|\]$/,
31+
alias: 'punctuation',
32+
},
33+
'attribute': {
34+
pattern: /^(\s*)\w+/,
35+
lookbehind: true,
36+
alias: 'class-name',
37+
},
38+
'args': {
39+
pattern: /\S(?:[\s\S]*\S)?/,
40+
inside: 'crystal',
41+
},
42+
},
43+
},
44+
'expansion': {
45+
$before: 'string-literal',
46+
pattern: /\{(?:\{.*?\}|%.*?%)\}/,
47+
inside: {
48+
'content': {
49+
pattern: /^(\{.)[\s\S]+(?=.\}$)/,
50+
lookbehind: true,
51+
inside: 'crystal',
52+
},
53+
'delimiter': {
54+
pattern: /^\{[\{%]|[\}%]\}$/,
55+
alias: 'operator',
56+
},
57+
},
58+
},
59+
'char': {
60+
$before: 'string-literal',
61+
pattern:
62+
/'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,
63+
greedy: true,
64+
},
65+
},
6166
};
6267
},
6368
};

0 commit comments

Comments
 (0)