11import { toArray } from '../util/iterables.js' ;
2- import { insertBefore } from '../util/language-util.js' ;
32import ruby from './ruby.js' ;
43
54/** @type {import('../types.d.ts').LanguageProto<'crystal'> } */
65export 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 - F a - f 0 - 9 ] { 1 , 4 } | \{ [ A - F a - f 0 - 9 ] { 1 , 6 } \} ) ) ) ' / ,
45- greedy : true ,
46- } ,
47- } ) ;
48-
499 return {
5010 'keyword' : [
5111 / \b (?: _ _ D I R _ _ | _ _ E N D _ L I N E _ _ | _ _ F I L E _ _ | _ _ L I N E _ _ | a b s t r a c t | a l i a s | a n n o t a t i o n | a s | a s m | b e g i n | b r e a k | c a s e | c l a s s | d e f | d o | e l s e | e l s i f | e n d | e n s u r e | e n u m | e x t e n d | f o r | f u n | i f | i f d e f | i n c l u d e | i n s t a n c e _ s i z e o f | l i b | m a c r o | m o d u l e | n e x t | o f | o u t | p o i n t e r o f | p r i v a t e | p r o t e c t e d | p t r | r e q u i r e | r e s c u e | r e t u r n | s e l e c t | s e l f | s i z e o f | s t r u c t | s u p e r | t h e n | t y p e | t y p e o f | u n d e f | u n i n i t i a l i z e d | u n i o n | u n l e s s | u n t i l | w h e n | w h i l e | w i t h | y i e l d ) \b / ,
@@ -56,8 +16,53 @@ export default {
5616 ] ,
5717 'number' :
5818 / \b (?: 0 b [ 0 1 _ ] * [ 0 1 ] | 0 o [ 0 - 7 _ ] * [ 0 - 7 ] | 0 x [ \d a - f A - F _ ] * [ \d a - f A - F ] | (?: \d (?: [ \d _ ] * \d ) ? ) (?: \. [ \d _ ] * \d ) ? (?: [ e E ] [ + - ] ? [ \d _ ] * \d ) ? ) (?: _ (?: [ u i f ] (?: 8 | 1 6 | 3 2 | 6 4 ) ) ? ) ? \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 - F a - f 0 - 9 ] { 1 , 4 } | \{ [ A - F a - f 0 - 9 ] { 1 , 6 } \} ) ) ) ' / ,
63+ greedy : true ,
64+ } ,
65+ } ,
6166 } ;
6267 } ,
6368} ;
0 commit comments