UNPKG

3.52 kBJavaScriptView Raw
1/*
2 Language: Groovy
3 Author: Guillaume Laforge <glaforge@gmail.com>
4 Description: Groovy programming language implementation inspired from Vsevolod's Java mode
5 Website: https://groovy-lang.org
6 */
7
8function variants(variants, obj = {}) {
9 obj.variants = variants;
10 return obj;
11}
12
13function groovy(hljs) {
14 const regex = hljs.regex;
15 const IDENT_RE = '[A-Za-z0-9_$]+';
16 const COMMENT = variants([
17 hljs.C_LINE_COMMENT_MODE,
18 hljs.C_BLOCK_COMMENT_MODE,
19 hljs.COMMENT(
20 '/\\*\\*',
21 '\\*/',
22 {
23 relevance: 0,
24 contains: [
25 {
26 // eat up @'s in emails to prevent them to be recognized as doctags
27 begin: /\w+@/,
28 relevance: 0
29 },
30 {
31 className: 'doctag',
32 begin: '@[A-Za-z]+'
33 }
34 ]
35 }
36 )
37 ]);
38 const REGEXP = {
39 className: 'regexp',
40 begin: /~?\/[^\/\n]+\//,
41 contains: [ hljs.BACKSLASH_ESCAPE ]
42 };
43 const NUMBER = variants([
44 hljs.BINARY_NUMBER_MODE,
45 hljs.C_NUMBER_MODE
46 ]);
47 const STRING = variants([
48 {
49 begin: /"""/,
50 end: /"""/
51 },
52 {
53 begin: /'''/,
54 end: /'''/
55 },
56 {
57 begin: "\\$/",
58 end: "/\\$",
59 relevance: 10
60 },
61 hljs.APOS_STRING_MODE,
62 hljs.QUOTE_STRING_MODE
63 ],
64 { className: "string" }
65 );
66
67 const CLASS_DEFINITION = {
68 match: [
69 /(class|interface|trait|enum|extends|implements)/,
70 /\s+/,
71 hljs.UNDERSCORE_IDENT_RE
72 ],
73 scope: {
74 1: "keyword",
75 3: "title.class",
76 }
77 };
78 const TYPES = [
79 "byte",
80 "short",
81 "char",
82 "int",
83 "long",
84 "boolean",
85 "float",
86 "double",
87 "void"
88 ];
89 const KEYWORDS = [
90 // groovy specific keywords
91 "def",
92 "as",
93 "in",
94 "assert",
95 "trait",
96 // common keywords with Java
97 "abstract",
98 "static",
99 "volatile",
100 "transient",
101 "public",
102 "private",
103 "protected",
104 "synchronized",
105 "final",
106 "class",
107 "interface",
108 "enum",
109 "if",
110 "else",
111 "for",
112 "while",
113 "switch",
114 "case",
115 "break",
116 "default",
117 "continue",
118 "throw",
119 "throws",
120 "try",
121 "catch",
122 "finally",
123 "implements",
124 "extends",
125 "new",
126 "import",
127 "package",
128 "return",
129 "instanceof"
130 ];
131
132 return {
133 name: 'Groovy',
134 keywords: {
135 "variable.language": 'this super',
136 literal: 'true false null',
137 type: TYPES,
138 keyword: KEYWORDS
139 },
140 contains: [
141 hljs.SHEBANG({
142 binary: "groovy",
143 relevance: 10
144 }),
145 COMMENT,
146 STRING,
147 REGEXP,
148 NUMBER,
149 CLASS_DEFINITION,
150 {
151 className: 'meta',
152 begin: '@[A-Za-z]+',
153 relevance: 0
154 },
155 {
156 // highlight map keys and named parameters as attrs
157 className: 'attr',
158 begin: IDENT_RE + '[ \t]*:',
159 relevance: 0
160 },
161 {
162 // catch middle element of the ternary operator
163 // to avoid highlight it as a label, named parameter, or map key
164 begin: /\?/,
165 end: /:/,
166 relevance: 0,
167 contains: [
168 COMMENT,
169 STRING,
170 REGEXP,
171 NUMBER,
172 'self'
173 ]
174 },
175 {
176 // highlight labeled statements
177 className: 'symbol',
178 begin: '^[ \t]*' + regex.lookahead(IDENT_RE + ':'),
179 excludeBegin: true,
180 end: IDENT_RE + ':',
181 relevance: 0
182 }
183 ],
184 illegal: /#|<\//
185 };
186}
187
188module.exports = groovy;