001: /*
002: * Copyright 2007 Google Inc.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License. You may obtain a copy of
006: * the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
012: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
013: * License for the specific language governing permissions and limitations under
014: * the License.
015: */
016: package com.google.gwt.dev.js.ast;
017:
018: import com.google.gwt.dev.jjs.HasSourceInfo;
019: import com.google.gwt.dev.jjs.InternalCompilerException;
020: import com.google.gwt.dev.js.ast.JsVars.JsVar;
021:
022: import java.util.Iterator;
023: import java.util.List;
024:
025: /**
026: * Implemented by nodes that will visit child nodes.
027: */
028: @SuppressWarnings("unused")
029: public class JsVisitor {
030:
031: protected static final JsContext UNMODIFIABLE_CONTEXT = new JsContext() {
032:
033: public boolean canInsert() {
034: return false;
035: }
036:
037: public boolean canRemove() {
038: return false;
039: }
040:
041: public void insertAfter(JsVisitable node) {
042: throw new UnsupportedOperationException();
043: }
044:
045: public void insertBefore(JsVisitable node) {
046: throw new UnsupportedOperationException();
047: }
048:
049: public void removeMe() {
050: throw new UnsupportedOperationException();
051: }
052:
053: public void replaceMe(JsVisitable node) {
054: throw new UnsupportedOperationException();
055: }
056: };
057:
058: public final <T extends JsVisitable> T accept(T node) {
059: return (T) doAccept(node);
060: }
061:
062: public final <T extends JsVisitable<T>> void acceptList(
063: List<T> collection) {
064: doAcceptList(collection);
065: }
066:
067: public final <T extends JsVisitable<T>> void acceptWithInsertRemove(
068: List<T> collection) {
069: doAcceptWithInsertRemove(collection);
070: }
071:
072: public boolean didChange() {
073: throw new UnsupportedOperationException();
074: }
075:
076: public void endVisit(JsArrayAccess x, JsContext<JsExpression> ctx) {
077: }
078:
079: public void endVisit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
080: }
081:
082: public void endVisit(JsBinaryOperation x,
083: JsContext<JsExpression> ctx) {
084: }
085:
086: public void endVisit(JsBlock x, JsContext<JsStatement> ctx) {
087: }
088:
089: public void endVisit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
090: }
091:
092: public void endVisit(JsBreak x, JsContext<JsStatement> ctx) {
093: }
094:
095: public void endVisit(JsCase x, JsContext<JsSwitchMember> ctx) {
096: }
097:
098: public void endVisit(JsCatch x, JsContext<JsCatch> ctx) {
099: }
100:
101: public void endVisit(JsConditional x, JsContext<JsExpression> ctx) {
102: }
103:
104: public void endVisit(JsContinue x, JsContext<JsStatement> ctx) {
105: }
106:
107: public void endVisit(JsDebugger x, JsContext<JsStatement> ctx) {
108: }
109:
110: public void endVisit(JsDecimalLiteral x, JsContext<JsExpression> ctx) {
111: }
112:
113: public void endVisit(JsDefault x, JsContext<JsSwitchMember> ctx) {
114: }
115:
116: public void endVisit(JsDoWhile x, JsContext<JsStatement> ctx) {
117: }
118:
119: public void endVisit(JsEmpty x, JsContext<JsStatement> ctx) {
120: }
121:
122: public void endVisit(JsExprStmt x, JsContext<JsStatement> ctx) {
123: }
124:
125: public void endVisit(JsFor x, JsContext<JsStatement> ctx) {
126: }
127:
128: public void endVisit(JsForIn x, JsContext<JsStatement> ctx) {
129: }
130:
131: public void endVisit(JsFunction x, JsContext<JsExpression> ctx) {
132: }
133:
134: public void endVisit(JsIf x, JsContext<JsStatement> ctx) {
135: }
136:
137: public void endVisit(JsIntegralLiteral x,
138: JsContext<JsExpression> ctx) {
139: }
140:
141: public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) {
142: }
143:
144: public void endVisit(JsLabel x, JsContext<JsStatement> ctx) {
145: }
146:
147: public void endVisit(JsNameRef x, JsContext<JsExpression> ctx) {
148: }
149:
150: public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
151: }
152:
153: public void endVisit(JsNullLiteral x, JsContext<JsExpression> ctx) {
154: }
155:
156: public void endVisit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
157: }
158:
159: public void endVisit(JsParameter x, JsContext<JsParameter> ctx) {
160: }
161:
162: public void endVisit(JsPostfixOperation x,
163: JsContext<JsExpression> ctx) {
164: }
165:
166: public void endVisit(JsPrefixOperation x,
167: JsContext<JsExpression> ctx) {
168: }
169:
170: public void endVisit(JsProgram x, JsContext<JsProgram> ctx) {
171: }
172:
173: public void endVisit(JsPropertyInitializer x,
174: JsContext<JsPropertyInitializer> ctx) {
175: }
176:
177: public void endVisit(JsRegExp x, JsContext<JsExpression> ctx) {
178: }
179:
180: public void endVisit(JsReturn x, JsContext<JsStatement> ctx) {
181: }
182:
183: public void endVisit(JsStringLiteral x, JsContext<JsExpression> ctx) {
184: }
185:
186: public void endVisit(JsSwitch x, JsContext<JsStatement> ctx) {
187: }
188:
189: public void endVisit(JsThisRef x, JsContext<JsExpression> ctx) {
190: }
191:
192: public void endVisit(JsThrow x, JsContext<JsStatement> ctx) {
193: }
194:
195: public void endVisit(JsTry x, JsContext<JsStatement> ctx) {
196: }
197:
198: public void endVisit(JsVar x, JsContext<JsVar> ctx) {
199: }
200:
201: public void endVisit(JsVars x, JsContext<JsStatement> ctx) {
202: }
203:
204: public void endVisit(JsWhile x, JsContext<JsStatement> ctx) {
205: }
206:
207: public boolean visit(JsArrayAccess x, JsContext<JsExpression> ctx) {
208: return true;
209: }
210:
211: public boolean visit(JsArrayLiteral x, JsContext<JsExpression> ctx) {
212: return true;
213: }
214:
215: public boolean visit(JsBinaryOperation x,
216: JsContext<JsExpression> ctx) {
217: return true;
218: }
219:
220: public boolean visit(JsBlock x, JsContext<JsStatement> ctx) {
221: return true;
222: }
223:
224: public boolean visit(JsBooleanLiteral x, JsContext<JsExpression> ctx) {
225: return true;
226: }
227:
228: public boolean visit(JsBreak x, JsContext<JsStatement> ctx) {
229: return true;
230: }
231:
232: public boolean visit(JsCase x, JsContext<JsSwitchMember> ctx) {
233: return true;
234: }
235:
236: public boolean visit(JsCatch x, JsContext<JsCatch> ctx) {
237: return true;
238: }
239:
240: public boolean visit(JsConditional x, JsContext<JsExpression> ctx) {
241: return true;
242: }
243:
244: public boolean visit(JsContinue x, JsContext<JsStatement> ctx) {
245: return true;
246: }
247:
248: public boolean visit(JsDebugger x, JsContext<JsStatement> ctx) {
249: return true;
250: }
251:
252: public boolean visit(JsDecimalLiteral x, JsContext<JsExpression> ctx) {
253: return true;
254: }
255:
256: public boolean visit(JsDefault x, JsContext<JsSwitchMember> ctx) {
257: return true;
258: }
259:
260: public boolean visit(JsDoWhile x, JsContext<JsStatement> ctx) {
261: return true;
262: }
263:
264: public boolean visit(JsEmpty x, JsContext<JsStatement> ctx) {
265: return true;
266: }
267:
268: public boolean visit(JsExprStmt x, JsContext<JsStatement> ctx) {
269: return true;
270: }
271:
272: public boolean visit(JsFor x, JsContext<JsStatement> ctx) {
273: return true;
274: }
275:
276: public boolean visit(JsForIn x, JsContext<JsStatement> ctx) {
277: return true;
278: }
279:
280: public boolean visit(JsFunction x, JsContext<JsExpression> ctx) {
281: return true;
282: }
283:
284: public boolean visit(JsIf x, JsContext<JsStatement> ctx) {
285: return true;
286: }
287:
288: public boolean visit(JsIntegralLiteral x,
289: JsContext<JsExpression> ctx) {
290: return true;
291: }
292:
293: public boolean visit(JsInvocation x, JsContext<JsExpression> ctx) {
294: return true;
295: }
296:
297: public boolean visit(JsLabel x, JsContext<JsStatement> ctx) {
298: return true;
299: }
300:
301: public boolean visit(JsNameRef x, JsContext<JsExpression> ctx) {
302: return true;
303: }
304:
305: public boolean visit(JsNew x, JsContext<JsExpression> ctx) {
306: return true;
307: }
308:
309: public boolean visit(JsNullLiteral x, JsContext<JsExpression> ctx) {
310: return true;
311: }
312:
313: public boolean visit(JsObjectLiteral x, JsContext<JsExpression> ctx) {
314: return true;
315: }
316:
317: public boolean visit(JsParameter x, JsContext<JsParameter> ctx) {
318: return true;
319: }
320:
321: public boolean visit(JsPostfixOperation x,
322: JsContext<JsExpression> ctx) {
323: return true;
324: }
325:
326: public boolean visit(JsPrefixOperation x,
327: JsContext<JsExpression> ctx) {
328: return true;
329: }
330:
331: public boolean visit(JsProgram x, JsContext<JsProgram> ctx) {
332: return true;
333: }
334:
335: public boolean visit(JsPropertyInitializer x,
336: JsContext<JsPropertyInitializer> ctx) {
337: return true;
338: }
339:
340: public boolean visit(JsRegExp x, JsContext<JsExpression> ctx) {
341: return true;
342: }
343:
344: public boolean visit(JsReturn x, JsContext<JsStatement> ctx) {
345: return true;
346: }
347:
348: public boolean visit(JsStringLiteral x, JsContext<JsExpression> ctx) {
349: return true;
350: }
351:
352: public boolean visit(JsSwitch x, JsContext<JsStatement> ctx) {
353: return true;
354: }
355:
356: public boolean visit(JsThisRef x, JsContext<JsExpression> ctx) {
357: return true;
358: }
359:
360: public boolean visit(JsThrow x, JsContext<JsStatement> ctx) {
361: return true;
362: }
363:
364: public boolean visit(JsTry x, JsContext<JsStatement> ctx) {
365: return true;
366: }
367:
368: public boolean visit(JsVar x, JsContext<JsVar> ctx) {
369: return true;
370: }
371:
372: public boolean visit(JsVars x, JsContext<JsStatement> ctx) {
373: return true;
374: }
375:
376: public boolean visit(JsWhile x, JsContext<JsStatement> ctx) {
377: return true;
378: }
379:
380: protected <T extends JsVisitable<T>> T doAccept(T node) {
381: doTraverse(node, (JsContext<T>) UNMODIFIABLE_CONTEXT);
382: return node;
383: }
384:
385: protected <T extends JsVisitable<T>> void doAcceptList(
386: List<T> collection) {
387: for (Iterator<T> it = collection.iterator(); it.hasNext();) {
388: doTraverse(it.next(), (JsContext<T>) UNMODIFIABLE_CONTEXT);
389: }
390: }
391:
392: protected <T extends JsVisitable<T>> void doAcceptWithInsertRemove(
393: List<T> collection) {
394: for (Iterator<T> it = collection.iterator(); it.hasNext();) {
395: doTraverse(it.next(), (JsContext<T>) UNMODIFIABLE_CONTEXT);
396: }
397: }
398:
399: protected final <T extends JsVisitable<T>> void doTraverse(T node,
400: JsContext<T> ctx) {
401: try {
402: node.traverse(this , ctx);
403: } catch (Throwable e) {
404: throw translateException(node, e);
405: }
406: }
407:
408: private <T extends JsVisitable<T>> InternalCompilerException translateException(
409: T node, Throwable e) {
410: InternalCompilerException ice;
411: if (e instanceof InternalCompilerException) {
412: ice = (InternalCompilerException) e;
413: } else {
414: ice = new InternalCompilerException(
415: "Unexpected error during visit.", e);
416: }
417: ice.addNode((HasSourceInfo) node);
418: return ice;
419: }
420: }
|