1 /***
2 *
3 * Copyright 2005 Jeremy Rayner
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18 package org.codehaus.groovy.antlr.treewalker;
19
20 import java.io.PrintStream;
21 import org.codehaus.groovy.antlr.GroovySourceAST;
22 import org.codehaus.groovy.antlr.parser.GroovyTokenTypes;
23
24 /***
25 * A visitor that prints a html tags of each node to the supplied PrintStream
26 *
27 * @author <a href="mailto:groovy@ross-rayner.com">Jeremy Rayner</a>
28 * @version $Revision: 1.1 $
29 */
30
31 public class NodeAsHTMLPrinter extends VisitorAdapter {
32 private String[] tokenNames;
33 private PrintStream out;
34
35 /***
36 * A visitor that prints a html tags, for each node, to the supplied PrintStream.
37 * @param out supplied PrintStream to output nodes to
38 * @param tokenNames an array of token names to use
39 */
40 public NodeAsHTMLPrinter(PrintStream out,String[] tokenNames) {
41 this.tokenNames = tokenNames;
42 this.out = out;
43 }
44
45 public void setUp() {
46 out.println("<html><head></head><body><pre>");
47 }
48
49 public void visitDefault(GroovySourceAST t,int visit) {
50 if (visit == OPENING_VISIT) {
51 out.print("<code title='" + tokenNames[t.getType()] + "'><font color='#" + colour(t) + "'>");
52 } else {
53 out.print("</font></code>");
54 }
55 }
56
57 public void tearDown() {
58 out.println("</pre></body></html>");
59 }
60
61 private String colour(GroovySourceAST t) {
62 String black = "000000";
63 String blue = "17178B";
64 String green = "008000";
65
66 String colour = black;
67 switch (t.getType()) {
68 case GroovyTokenTypes.ABSTRACT :
69 case GroovyTokenTypes.ANNOTATION :
70 case GroovyTokenTypes.ANNOTATIONS :
71 case GroovyTokenTypes.ANNOTATION_ARRAY_INIT :
72 case GroovyTokenTypes.ANNOTATION_DEF :
73 case GroovyTokenTypes.ANNOTATION_FIELD_DEF :
74 case GroovyTokenTypes.ANNOTATION_MEMBER_VALUE_PAIR :
75 case GroovyTokenTypes.ARRAY_DECLARATOR :
76 case GroovyTokenTypes.ASSIGN :
77 case GroovyTokenTypes.AT :
78 case GroovyTokenTypes.BAND :
79 case GroovyTokenTypes.BAND_ASSIGN :
80 case GroovyTokenTypes.BIG_SUFFIX :
81 case GroovyTokenTypes.BLOCK :
82 case GroovyTokenTypes.BNOT :
83 case GroovyTokenTypes.BOR :
84 case GroovyTokenTypes.BOR_ASSIGN :
85 case GroovyTokenTypes.BSR :
86 case GroovyTokenTypes.BSR_ASSIGN :
87 case GroovyTokenTypes.BXOR :
88 case GroovyTokenTypes.BXOR_ASSIGN :
89 case GroovyTokenTypes.CASE_GROUP :
90 case GroovyTokenTypes.CLOSED_BLOCK :
91 case GroovyTokenTypes.CLOSURE_OP :
92 case GroovyTokenTypes.COLON :
93 case GroovyTokenTypes.COMMA :
94 case GroovyTokenTypes.COMPARE_TO :
95 case GroovyTokenTypes.CTOR_CALL :
96 case GroovyTokenTypes.CTOR_IDENT :
97 case GroovyTokenTypes.DEC :
98 case GroovyTokenTypes.DIGIT :
99 case GroovyTokenTypes.DIV :
100 case GroovyTokenTypes.DIV_ASSIGN :
101 case GroovyTokenTypes.DOLLAR :
102 case GroovyTokenTypes.DOT :
103 case GroovyTokenTypes.DYNAMIC_MEMBER :
104 case GroovyTokenTypes.ELIST :
105 case GroovyTokenTypes.EMPTY_STAT :
106 case GroovyTokenTypes.ENUM_CONSTANT_DEF :
107 case GroovyTokenTypes.ENUM_DEF :
108 case GroovyTokenTypes.EOF :
109 case GroovyTokenTypes.EQUAL :
110 case GroovyTokenTypes.ESC :
111 case GroovyTokenTypes.EXPONENT :
112 case GroovyTokenTypes.EXPR :
113 case GroovyTokenTypes.FINAL :
114 case GroovyTokenTypes.FLOAT_SUFFIX :
115 case GroovyTokenTypes.FOR_CONDITION :
116 case GroovyTokenTypes.FOR_EACH_CLAUSE :
117 case GroovyTokenTypes.FOR_INIT :
118 case GroovyTokenTypes.FOR_IN_ITERABLE :
119 case GroovyTokenTypes.FOR_ITERATOR :
120 case GroovyTokenTypes.GE :
121 case GroovyTokenTypes.GT :
122 case GroovyTokenTypes.HEX_DIGIT :
123 case GroovyTokenTypes.IDENT :
124 case GroovyTokenTypes.IMPLICIT_PARAMETERS :
125 case GroovyTokenTypes.INC :
126 case GroovyTokenTypes.INDEX_OP :
127 case GroovyTokenTypes.INSTANCE_INIT :
128 case GroovyTokenTypes.INTERFACE_DEF :
129 case GroovyTokenTypes.LABELED_ARG :
130 case GroovyTokenTypes.LABELED_STAT :
131 case GroovyTokenTypes.LAND :
132 case GroovyTokenTypes.LBRACK :
133 case GroovyTokenTypes.LCURLY :
134 case GroovyTokenTypes.LE :
135 case GroovyTokenTypes.LETTER :
136 case GroovyTokenTypes.LIST_CONSTRUCTOR :
137 case GroovyTokenTypes.LNOT :
138 case GroovyTokenTypes.LOR :
139 case GroovyTokenTypes.LPAREN :
140 case GroovyTokenTypes.LT :
141 case GroovyTokenTypes.MAP_CONSTRUCTOR :
142 case GroovyTokenTypes.MEMBER_POINTER :
143 case GroovyTokenTypes.METHOD_CALL :
144 case GroovyTokenTypes.METHOD_DEF :
145 case GroovyTokenTypes.MINUS :
146 case GroovyTokenTypes.MINUS_ASSIGN :
147 case GroovyTokenTypes.ML_COMMENT :
148 case GroovyTokenTypes.MOD :
149 case GroovyTokenTypes.MODIFIERS :
150 case GroovyTokenTypes.MOD_ASSIGN :
151 case GroovyTokenTypes.NLS :
152 case GroovyTokenTypes.NOT_EQUAL :
153 case GroovyTokenTypes.NULL_TREE_LOOKAHEAD :
154 case GroovyTokenTypes.NUM_BIG_DECIMAL :
155 case GroovyTokenTypes.NUM_BIG_INT :
156 case GroovyTokenTypes.NUM_DOUBLE :
157 case GroovyTokenTypes.NUM_FLOAT :
158 case GroovyTokenTypes.NUM_INT :
159 case GroovyTokenTypes.NUM_LONG :
160 case GroovyTokenTypes.OBJBLOCK :
161 case GroovyTokenTypes.ONE_NL :
162 case GroovyTokenTypes.OPTIONAL_DOT :
163 case GroovyTokenTypes.PARAMETERS :
164 case GroovyTokenTypes.PARAMETER_DEF :
165 case GroovyTokenTypes.PLUS :
166 case GroovyTokenTypes.PLUS_ASSIGN :
167 case GroovyTokenTypes.POST_DEC :
168 case GroovyTokenTypes.POST_INC :
169 case GroovyTokenTypes.QUESTION :
170 case GroovyTokenTypes.RANGE_EXCLUSIVE :
171 case GroovyTokenTypes.RANGE_INCLUSIVE :
172 case GroovyTokenTypes.RBRACK :
173 case GroovyTokenTypes.RCURLY :
174 case GroovyTokenTypes.REGEXP_CTOR_END :
175 case GroovyTokenTypes.REGEXP_SYMBOL :
176 case GroovyTokenTypes.REGEX_FIND :
177 case GroovyTokenTypes.REGEX_MATCH :
178 case GroovyTokenTypes.RPAREN :
179 case GroovyTokenTypes.SCOPE_ESCAPE :
180 case GroovyTokenTypes.SELECT_SLOT :
181 case GroovyTokenTypes.SEMI :
182 case GroovyTokenTypes.SH_COMMENT :
183 case GroovyTokenTypes.SL :
184 case GroovyTokenTypes.SLIST :
185 case GroovyTokenTypes.SL_ASSIGN :
186 case GroovyTokenTypes.SL_COMMENT :
187 case GroovyTokenTypes.SPREAD_ARG :
188 case GroovyTokenTypes.SPREAD_DOT :
189 case GroovyTokenTypes.SPREAD_MAP_ARG :
190 case GroovyTokenTypes.SR :
191 case GroovyTokenTypes.SR_ASSIGN :
192 case GroovyTokenTypes.STAR :
193 case GroovyTokenTypes.STAR_ASSIGN :
194 case GroovyTokenTypes.STAR_STAR :
195 case GroovyTokenTypes.STAR_STAR_ASSIGN :
196 case GroovyTokenTypes.STATIC_IMPORT :
197 case GroovyTokenTypes.STATIC_INIT :
198 case GroovyTokenTypes.STRICTFP :
199 case GroovyTokenTypes.STRING_CH :
200 case GroovyTokenTypes.STRING_CONSTRUCTOR :
201 case GroovyTokenTypes.STRING_CTOR_END :
202 case GroovyTokenTypes.STRING_CTOR_MIDDLE :
203 case GroovyTokenTypes.STRING_CTOR_START :
204 case GroovyTokenTypes.STRING_NL :
205 case GroovyTokenTypes.SUPER_CTOR_CALL :
206 case GroovyTokenTypes.TRIPLE_DOT :
207 case GroovyTokenTypes.TYPECAST :
208 case GroovyTokenTypes.TYPE_ARGUMENT :
209 case GroovyTokenTypes.TYPE_ARGUMENTS :
210 case GroovyTokenTypes.TYPE_LOWER_BOUNDS :
211 case GroovyTokenTypes.TYPE_PARAMETER :
212 case GroovyTokenTypes.TYPE_PARAMETERS :
213 case GroovyTokenTypes.TYPE_UPPER_BOUNDS :
214 case GroovyTokenTypes.UNARY_MINUS :
215 case GroovyTokenTypes.UNARY_PLUS :
216 case GroovyTokenTypes.UNUSED_CONST :
217 case GroovyTokenTypes.UNUSED_DO :
218 case GroovyTokenTypes.UNUSED_GOTO :
219 case GroovyTokenTypes.VARIABLE_DEF :
220 case GroovyTokenTypes.VARIABLE_PARAMETER_DEF :
221 case GroovyTokenTypes.VOCAB :
222 case GroovyTokenTypes.WILDCARD_TYPE :
223 case GroovyTokenTypes.WS :
224 colour = black;
225 break;
226
227 case GroovyTokenTypes.STRING_LITERAL :
228 case GroovyTokenTypes.REGEXP_LITERAL :
229 colour = green;
230 break;
231
232 case GroovyTokenTypes.CLASS_DEF :
233 case GroovyTokenTypes.EXTENDS_CLAUSE :
234 case GroovyTokenTypes.IMPLEMENTS_CLAUSE :
235 case GroovyTokenTypes.IMPORT :
236 case GroovyTokenTypes.LITERAL_any :
237 case GroovyTokenTypes.LITERAL_as :
238 case GroovyTokenTypes.LITERAL_assert :
239 case GroovyTokenTypes.LITERAL_boolean :
240 case GroovyTokenTypes.LITERAL_break :
241 case GroovyTokenTypes.LITERAL_byte :
242 case GroovyTokenTypes.LITERAL_case :
243 case GroovyTokenTypes.LITERAL_catch :
244 case GroovyTokenTypes.LITERAL_char :
245 case GroovyTokenTypes.LITERAL_class :
246 case GroovyTokenTypes.LITERAL_continue :
247 case GroovyTokenTypes.LITERAL_def :
248 case GroovyTokenTypes.LITERAL_default :
249 case GroovyTokenTypes.LITERAL_double :
250 case GroovyTokenTypes.LITERAL_else :
251 case GroovyTokenTypes.LITERAL_enum :
252 case GroovyTokenTypes.LITERAL_extends :
253 case GroovyTokenTypes.LITERAL_false :
254 case GroovyTokenTypes.LITERAL_finally :
255 case GroovyTokenTypes.LITERAL_float :
256 case GroovyTokenTypes.LITERAL_for :
257 case GroovyTokenTypes.LITERAL_if :
258 case GroovyTokenTypes.LITERAL_implements :
259 case GroovyTokenTypes.LITERAL_import :
260 case GroovyTokenTypes.LITERAL_in :
261 case GroovyTokenTypes.LITERAL_instanceof :
262 case GroovyTokenTypes.LITERAL_int :
263 case GroovyTokenTypes.LITERAL_interface :
264 case GroovyTokenTypes.LITERAL_long :
265 case GroovyTokenTypes.LITERAL_native :
266 case GroovyTokenTypes.LITERAL_new :
267 case GroovyTokenTypes.LITERAL_null :
268 case GroovyTokenTypes.LITERAL_package :
269 case GroovyTokenTypes.LITERAL_private :
270 case GroovyTokenTypes.LITERAL_protected :
271 case GroovyTokenTypes.LITERAL_public :
272 case GroovyTokenTypes.LITERAL_return :
273 case GroovyTokenTypes.LITERAL_short :
274 case GroovyTokenTypes.LITERAL_static :
275 case GroovyTokenTypes.LITERAL_super :
276 case GroovyTokenTypes.LITERAL_switch :
277 case GroovyTokenTypes.LITERAL_synchronized :
278 case GroovyTokenTypes.LITERAL_this :
279 case GroovyTokenTypes.LITERAL_threadsafe :
280 case GroovyTokenTypes.LITERAL_throw :
281 case GroovyTokenTypes.LITERAL_throws :
282 case GroovyTokenTypes.LITERAL_transient :
283 case GroovyTokenTypes.LITERAL_true :
284 case GroovyTokenTypes.LITERAL_try :
285 case GroovyTokenTypes.LITERAL_void :
286 case GroovyTokenTypes.LITERAL_volatile :
287 case GroovyTokenTypes.LITERAL_while :
288 case GroovyTokenTypes.LITERAL_with :
289 case GroovyTokenTypes.PACKAGE_DEF :
290 case GroovyTokenTypes.TYPE :
291 colour = blue;
292 break;
293
294 default:
295 colour = black;
296 break;
297 }
298 return colour;
299 }
300 }