1 /***************************************************************************************
2 * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. *
3 * http://aspectwerkz.codehaus.org *
4 * ---------------------------------------------------------------------------------- *
5 * The software in this package is published under the terms of the LGPL license *
6 * a copy of which has been included with this distribution in the license.txt file. *
7 **************************************************************************************/
8 package org.codehaus.aspectwerkz.expression;
9
10 import org.codehaus.aspectwerkz.expression.ast.ASTAnd;
11 import org.codehaus.aspectwerkz.expression.ast.ASTAttribute;
12 import org.codehaus.aspectwerkz.expression.ast.ASTCall;
13 import org.codehaus.aspectwerkz.expression.ast.ASTCflow;
14 import org.codehaus.aspectwerkz.expression.ast.ASTCflowBelow;
15 import org.codehaus.aspectwerkz.expression.ast.ASTClassPattern;
16 import org.codehaus.aspectwerkz.expression.ast.ASTConstructorPattern;
17 import org.codehaus.aspectwerkz.expression.ast.ASTExecution;
18 import org.codehaus.aspectwerkz.expression.ast.ASTExpression;
19 import org.codehaus.aspectwerkz.expression.ast.ASTFieldPattern;
20 import org.codehaus.aspectwerkz.expression.ast.ASTGet;
21 import org.codehaus.aspectwerkz.expression.ast.ASTHandler;
22 import org.codehaus.aspectwerkz.expression.ast.ASTMethodPattern;
23 import org.codehaus.aspectwerkz.expression.ast.ASTModifier;
24 import org.codehaus.aspectwerkz.expression.ast.ASTNot;
25 import org.codehaus.aspectwerkz.expression.ast.ASTOr;
26 import org.codehaus.aspectwerkz.expression.ast.ASTParameter;
27 import org.codehaus.aspectwerkz.expression.ast.ASTPointcutReference;
28 import org.codehaus.aspectwerkz.expression.ast.ASTRoot;
29 import org.codehaus.aspectwerkz.expression.ast.ASTSet;
30 import org.codehaus.aspectwerkz.expression.ast.ASTStaticInitialization;
31 import org.codehaus.aspectwerkz.expression.ast.ASTWithin;
32 import org.codehaus.aspectwerkz.expression.ast.ASTWithinCode;
33 import org.codehaus.aspectwerkz.expression.ast.ExpressionParserVisitor;
34 import org.codehaus.aspectwerkz.expression.ast.SimpleNode;
35 import org.codehaus.aspectwerkz.expression.ast.ASTArgs;
36 import org.codehaus.aspectwerkz.expression.ast.ASTArgParameter;
37 import org.codehaus.aspectwerkz.expression.ast.ASTHasField;
38 import org.codehaus.aspectwerkz.expression.ast.ASTHasMethod;
39 import org.codehaus.aspectwerkz.expression.ast.ASTTarget;
40 import org.codehaus.aspectwerkz.expression.ast.ASTThis;
41 import org.codehaus.aspectwerkz.expression.ast.Node;
42
43 /***
44 * TODO: do we need that, there is a dump() method in jjtree API
45 *
46 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
47 * @author Michael Nascimento
48 */
49 public class DumpVisitor implements ExpressionParserVisitor {
50 private Node m_root;
51
52 private int indent = 0;
53
54 private DumpVisitor(final Node root) {
55 m_root = root;
56 }
57
58 public static void dumpAST(final Node root) {
59 DumpVisitor dumper = new DumpVisitor(root);
60 dumper.visit((SimpleNode)dumper.m_root, null);
61 }
62
63 public Object visit(SimpleNode node, Object data) {
64 System.out.println(indentString() + node);
65 ++indent;
66 data = node.jjtGetChild(0).jjtAccept(this, data);
67 --indent;
68 return data;
69 }
70
71 public Object visit(ASTRoot node, Object data) {
72 System.out.println(indentString() + node);
73 ++indent;
74 data = node.jjtGetChild(0).jjtAccept(this, data);
75 --indent;
76 return data;
77 }
78
79 public Object visit(ASTExpression node, Object data) {
80 System.out.println(indentString() + node);
81 ++indent;
82 data = node.jjtGetChild(0).jjtAccept(this, data);
83 --indent;
84 return data;
85 }
86
87 public Object visit(ASTOr node, Object data) {
88 System.out.println(indentString() + node);
89 ++indent;
90 for (int i = 0; i < node.jjtGetNumChildren(); i++) {
91 data = node.jjtGetChild(i).jjtAccept(this, data);
92 }
93 --indent;
94 return data;
95 }
96
97 public Object visit(ASTAnd node, Object data) {
98 System.out.println(indentString() + node);
99 ++indent;
100 for (int i = 0; i < node.jjtGetNumChildren(); i++) {
101 data = node.jjtGetChild(i).jjtAccept(this, data);
102 }
103 --indent;
104 return data;
105 }
106
107 public Object visit(ASTNot node, Object data) {
108 System.out.println(indentString() + node);
109 ++indent;
110 data = node.jjtGetChild(0).jjtAccept(this, data);
111 --indent;
112 return data;
113 }
114
115 public Object visit(ASTExecution node, Object data) {
116 System.out.println(indentString() + node);
117 ++indent;
118 data = node.jjtGetChild(0).jjtAccept(this, data);
119 --indent;
120 return data;
121 }
122
123 public Object visit(ASTCall node, Object data) {
124 System.out.println(indentString() + node);
125 ++indent;
126 data = node.jjtGetChild(0).jjtAccept(this, data);
127 --indent;
128 return data;
129 }
130
131 public Object visit(ASTSet node, Object data) {
132 System.out.println(indentString() + node);
133 ++indent;
134 data = node.jjtGetChild(0).jjtAccept(this, data);
135 --indent;
136 return data;
137 }
138
139 public Object visit(ASTGet node, Object data) {
140 System.out.println(indentString() + node);
141 ++indent;
142 data = node.jjtGetChild(0).jjtAccept(this, data);
143 --indent;
144 return data;
145 }
146
147 public Object visit(ASTHandler node, Object data) {
148 System.out.println(indentString() + node);
149 ++indent;
150 data = node.jjtGetChild(0).jjtAccept(this, data);
151 --indent;
152 return data;
153 }
154
155 public Object visit(ASTWithin node, Object data) {
156 System.out.println(indentString() + node);
157 ++indent;
158 data = node.jjtGetChild(0).jjtAccept(this, data);
159 --indent;
160 return data;
161 }
162
163 public Object visit(ASTWithinCode node, Object data) {
164 System.out.println(indentString() + node);
165 ++indent;
166 data = node.jjtGetChild(0).jjtAccept(this, data);
167 --indent;
168 return data;
169 }
170
171 public Object visit(ASTStaticInitialization node, Object data) {
172 System.out.println(indentString() + node);
173 ++indent;
174 data = node.jjtGetChild(0).jjtAccept(this, data);
175 --indent;
176 return data;
177 }
178
179 public Object visit(ASTCflow node, Object data) {
180 System.out.println(indentString() + node);
181 ++indent;
182 data = node.jjtGetChild(0).jjtAccept(this, data);
183 --indent;
184 return data;
185 }
186
187 public Object visit(ASTCflowBelow node, Object data) {
188 System.out.println(indentString() + node);
189 ++indent;
190 data = node.jjtGetChild(0).jjtAccept(this, data);
191 --indent;
192 return data;
193 }
194
195
196 public Object visit(ASTHasMethod node, Object data) {
197 System.out.println(indentString() + node);
198 ++indent;
199 data = node.jjtGetChild(0).jjtAccept(this, data);
200 --indent;
201 return data;
202 }
203
204
205 public Object visit(ASTHasField node, Object data) {
206 System.out.println(indentString() + node);
207 ++indent;
208 data = node.jjtGetChild(0).jjtAccept(this, data);
209 --indent;
210 return data;
211 }
212
213 public Object visit(ASTTarget node, Object data) {
214 System.out.println(indentString() + node);
215 ++indent;
216 System.out.println(node.getIdentifier());
217 --indent;
218 return data;
219 }
220
221 public Object visit(ASTThis node, Object data) {
222 System.out.println(indentString() + node);
223 ++indent;
224 System.out.println(node.getIdentifier());
225 --indent;
226 return data;
227 }
228
229 public Object visit(ASTClassPattern node, Object data) {
230 System.out.println(indentString() + node);
231 ++indent;
232 int nr = node.jjtGetNumChildren();
233 for (int i = 0; i < nr; i++) {
234 data = node.jjtGetChild(i).jjtAccept(this, data);
235 }
236 --indent;
237 return data;
238 }
239
240 public Object visit(ASTMethodPattern node, Object data) {
241 System.out.println(indentString() + node);
242 ++indent;
243 int nr = node.jjtGetNumChildren();
244 for (int i = 0; i < nr; i++) {
245 data = node.jjtGetChild(i).jjtAccept(this, data);
246 }
247 --indent;
248 return data;
249 }
250
251 public Object visit(ASTConstructorPattern node, Object data) {
252 System.out.println(indentString() + node);
253 ++indent;
254 int nr = node.jjtGetNumChildren();
255 for (int i = 0; i < nr; i++) {
256 data = node.jjtGetChild(i).jjtAccept(this, data);
257 }
258 --indent;
259 return data;
260 }
261
262 public Object visit(ASTFieldPattern node, Object data) {
263 System.out.println(indentString() + node);
264 ++indent;
265 int nr = node.jjtGetNumChildren();
266 for (int i = 0; i < nr; i++) {
267 data = node.jjtGetChild(i).jjtAccept(this, data);
268 }
269 --indent;
270 return data;
271 }
272
273 public Object visit(ASTPointcutReference node, Object data) {
274 System.out.println(indentString() + node);
275 return data;
276 }
277
278 public Object visit(ASTParameter node, Object data) {
279 System.out.println(indentString() + node);
280 return data;
281 }
282
283 public Object visit(ASTArgs node, Object data) {
284 System.out.println(indentString() + node);
285 ++indent;
286 if (node.jjtGetNumChildren() > 0) {
287 data = node.jjtGetChild(0).jjtAccept(this, data);
288 }
289 --indent;
290 return data;
291 }
292
293 public Object visit(ASTArgParameter node, Object data) {
294 System.out.println(indentString() + node);
295 return data;
296 }
297
298 public Object visit(ASTAttribute node, Object data) {
299 System.out.println(indentString() + node);
300 return data;
301 }
302
303 public Object visit(ASTModifier node, Object data) {
304 System.out.println(indentString() + node);
305 return data;
306 }
307
308 private String indentString() {
309 StringBuffer sb = new StringBuffer();
310 for (int i = 0; i < indent; ++i) {
311 sb.append(" ");
312 }
313 return sb.toString();
314 }
315 }