5
5
Website: https://groovy-lang.org
6
6
*/
7
7
8
+ import * as regex from "../lib/regex" ;
9
+
10
+ function variants ( variants , obj = { } ) {
11
+ obj . variants = variants ;
12
+ return obj ;
13
+ }
14
+
8
15
export default function ( hljs ) {
16
+ const IDENT_RE = '[A-Za-z0-9_$]+' ;
17
+ const COMMENT = variants ( [
18
+ hljs . C_LINE_COMMENT_MODE ,
19
+ hljs . C_BLOCK_COMMENT_MODE ,
20
+ hljs . COMMENT (
21
+ '/\\*\\*' ,
22
+ '\\*/' ,
23
+ {
24
+ relevance : 0 ,
25
+ contains : [
26
+ {
27
+ // eat up @'s in emails to prevent them to be recognized as doctags
28
+ begin : / \w + @ / , relevance : 0
29
+ } , {
30
+ className : 'doctag' ,
31
+ begin : '@[A-Za-z]+'
32
+ }
33
+ ]
34
+ }
35
+ )
36
+ ] ) ;
37
+ const REGEXP = {
38
+ className : 'regexp' ,
39
+ begin : / ~ ? \/ [ ^ \/ \n ] + \/ / ,
40
+ contains : [
41
+ hljs . BACKSLASH_ESCAPE
42
+ ]
43
+ } ;
44
+ const NUMBER = variants ( [
45
+ hljs . BINARY_NUMBER_MODE ,
46
+ hljs . C_NUMBER_MODE ,
47
+ ] ) ;
48
+ const STRING = variants ( [
49
+ {
50
+ begin : / " " " / ,
51
+ end : / " " " /
52
+ } , {
53
+ begin : / ' ' ' / ,
54
+ end : / ' ' ' /
55
+ } , {
56
+ begin : "\\$/" ,
57
+ end : "/\\$" ,
58
+ relevance : 10
59
+ } ,
60
+ hljs . APOS_STRING_MODE ,
61
+ hljs . QUOTE_STRING_MODE ,
62
+ ] ,
63
+ { className : "string" }
64
+ ) ;
65
+
9
66
return {
10
67
name : 'Groovy' ,
11
68
keywords : {
12
- literal : 'true false null' ,
69
+ built_in : 'this super' ,
70
+ literal : 'true false null' ,
13
71
keyword :
14
72
'byte short char int long boolean float double void ' +
15
73
// groovy specific keywords
16
74
'def as in assert trait ' +
17
75
// common keywords with Java
18
- 'super this abstract static volatile transient public private protected synchronized final ' +
76
+ 'abstract static volatile transient public private protected synchronized final ' +
19
77
'class interface enum if else for while switch case break default continue ' +
20
78
'throw throws try catch finally implements extends new import package return instanceof'
21
79
} ,
22
-
23
80
contains : [
24
- hljs . COMMENT (
25
- '/\\*\\*' ,
26
- '\\*/' ,
27
- {
28
- relevance : 0 ,
29
- contains : [
30
- {
31
- // eat up @'s in emails to prevent them to be recognized as doctags
32
- begin : / \w + @ / , relevance : 0
33
- } ,
34
- {
35
- className : 'doctag' ,
36
- begin : '@[A-Za-z]+'
37
- }
38
- ]
39
- }
40
- ) ,
41
- hljs . C_LINE_COMMENT_MODE ,
42
- hljs . C_BLOCK_COMMENT_MODE ,
43
- {
44
- className : 'string' ,
45
- begin : '"""' , end : '"""'
46
- } ,
47
- {
48
- className : 'string' ,
49
- begin : "'''" , end : "'''"
50
- } ,
51
- {
52
- className : 'string' ,
53
- begin : "\\$/" , end : "/\\$" ,
54
- relevance : 10
55
- } ,
56
- hljs . APOS_STRING_MODE ,
57
- {
58
- className : 'regexp' ,
59
- begin : / ~ ? \/ [ ^ \/ \n ] + \/ / ,
60
- contains : [
61
- hljs . BACKSLASH_ESCAPE
62
- ]
63
- } ,
64
- hljs . QUOTE_STRING_MODE ,
65
- {
66
- className : 'meta' ,
67
- begin : "^#!/usr/bin/env" , end : '$' ,
68
- illegal : '\n'
69
- } ,
70
- hljs . BINARY_NUMBER_MODE ,
81
+ hljs . SHEBANG ( ) ,
82
+ COMMENT ,
83
+ STRING ,
84
+ REGEXP ,
85
+ NUMBER ,
71
86
{
72
87
className : 'class' ,
73
88
beginKeywords : 'class interface trait enum' , end : '{' ,
@@ -77,25 +92,35 @@ export default function(hljs) {
77
92
hljs . UNDERSCORE_TITLE_MODE
78
93
]
79
94
} ,
80
- hljs . C_NUMBER_MODE ,
81
95
{
82
96
className : 'meta' , begin : '@[A-Za-z]+'
83
97
} ,
84
98
{
85
- // highlight map keys and named parameters as strings
86
- className : 'string ' , begin : / [ ^ \? ] { 0 } [ A - Z a - z 0 - 9 _ $ ] + * : /
99
+ // highlight map keys and named parameters as attrs
100
+ className : 'attr ' , begin : IDENT_RE + '[ \t]*:'
87
101
} ,
88
102
{
89
- // catch middle element of the ternary operator
90
- // to avoid highlight it as a label, named parameter, or map key
91
- begin : / \? / , end : / \: /
103
+ // catch middle element of the ternary operator
104
+ // to avoid highlight it as a label, named parameter, or map key
105
+ begin : / \? / ,
106
+ end : / : / ,
107
+ contains : [
108
+ COMMENT ,
109
+ STRING ,
110
+ REGEXP ,
111
+ NUMBER ,
112
+ 'self'
113
+ ]
92
114
} ,
93
115
{
94
116
// highlight labeled statements
95
- className : 'symbol' , begin : '^\\s*[A-Za-z0-9_$]+:' ,
117
+ className : 'symbol' ,
118
+ begin : '^[ \t]*' + regex . lookahead ( IDENT_RE + ':' ) ,
119
+ excludeBegin : true ,
120
+ end : IDENT_RE + ':' ,
96
121
relevance : 0
97
122
}
98
123
] ,
99
124
illegal : / # | < \/ /
100
- }
125
+ } ;
101
126
}
0 commit comments