001    /**
002     * $Id: LShiftVisitor.java,v 1.2 2006/09/25 15:48:32 chalin Exp $
003     *
004     * @title "Visitor for Detection of LeftShift Incompleteness cases"
005     * @description "Walks through an AST and finds any cases where the left
006     * shift operator is used. It then adds a warning to ErrorSet about this"
007     */
008    
009    package javafe.ast;
010    
011    import javafe.util.Location;
012    import javafe.util.ErrorSet;
013    
014    public class LShiftVisitor extends Visitor {
015    
016      public void visitASTNode(/*@ non_null */ ASTNode x) {
017        // a child of this node
018        Object child = null;
019        // temporary ASTNode
020        ASTNode temp = null;
021        // visit each child in this ASTNode if the child is an ASTNode
022        for(int count = 0; count < x.childCount(); count++) {
023          child = x.childAt(count);
024          if(child instanceof ASTNode) {
025            temp = (ASTNode) child;
026            temp.accept(this);
027          }
028        }
029      }
030    
031      public void visitCompilationUnit(/*@ non_null */ CompilationUnit x) {
032        visitASTNode(x);
033      }
034    
035      public void visitImportDecl(/*@ non_null */ ImportDecl x) {
036        visitASTNode(x);
037      }
038    
039      public void visitSingleTypeImportDecl(/*@ non_null */ SingleTypeImportDecl x) {
040        visitImportDecl(x);
041      }
042    
043      public void visitOnDemandImportDecl(/*@ non_null */ OnDemandImportDecl x) {
044        visitImportDecl(x);
045      }
046    
047      public void visitTypeDecl(/*@ non_null */ TypeDecl x) {
048        visitASTNode(x);
049      }
050    
051      public void visitClassDecl(/*@ non_null */ ClassDecl x) {
052        visitTypeDecl(x);
053      }
054    
055      public void visitInterfaceDecl(/*@ non_null */ InterfaceDecl x) {
056        visitTypeDecl(x);
057      }
058    
059      public void visitRoutineDecl(/*@ non_null */ RoutineDecl x) {
060        visitASTNode(x);
061      }
062    
063      public void visitConstructorDecl(/*@ non_null */ ConstructorDecl x) {
064        visitRoutineDecl(x);
065      }
066    
067      public void visitMethodDecl(/*@ non_null */ MethodDecl x) {
068        visitRoutineDecl(x);
069      }
070    
071      public void visitInitBlock(/*@ non_null */ InitBlock x) {
072        visitASTNode(x);
073      }
074    
075      public void visitTypeDeclElemPragma(/*@ non_null */ TypeDeclElemPragma x) {
076        visitASTNode(x);
077      }
078    
079      public void visitGenericVarDecl(/*@ non_null */ GenericVarDecl x) {
080        visitASTNode(x);
081      }
082    
083      public void visitLocalVarDecl(/*@ non_null */ LocalVarDecl x) {
084        visitGenericVarDecl(x);
085      }
086    
087      public void visitFieldDecl(/*@ non_null */ FieldDecl x) {
088        visitGenericVarDecl(x);
089      }
090    
091      public void visitFormalParaDecl(/*@ non_null */ FormalParaDecl x) {
092        visitGenericVarDecl(x);
093      }
094    
095      public void visitStmt(/*@ non_null */ Stmt x) {
096        visitASTNode(x);
097      }
098    
099      public void visitGenericBlockStmt(/*@ non_null */ GenericBlockStmt x) {
100        visitStmt(x);
101      }
102    
103      public void visitBlockStmt(/*@ non_null */ BlockStmt x) {
104        visitGenericBlockStmt(x);
105      }
106    
107      public void visitSwitchStmt(/*@ non_null */ SwitchStmt x) {
108        visitGenericBlockStmt(x);
109      }
110    
111      public void visitAssertStmt(/*@ non_null */ AssertStmt x) {
112        visitStmt(x);
113      }
114    
115      public void visitVarDeclStmt(/*@ non_null */ VarDeclStmt x) {
116        visitStmt(x);
117      }
118    
119      public void visitClassDeclStmt(/*@ non_null */ ClassDeclStmt x) {
120        visitStmt(x);
121      }
122    
123      public void visitWhileStmt(/*@ non_null */ WhileStmt x) {
124        visitStmt(x);
125      }
126    
127      public void visitDoStmt(/*@ non_null */ DoStmt x) {
128        visitStmt(x);
129      }
130    
131      public void visitSynchronizeStmt(/*@ non_null */ SynchronizeStmt x) {
132        visitStmt(x);
133      }
134    
135      public void visitEvalStmt(/*@ non_null */ EvalStmt x) {
136        visitStmt(x);
137      }
138    
139      public void visitReturnStmt(/*@ non_null */ ReturnStmt x) {
140        visitStmt(x);
141      }
142    
143      public void visitThrowStmt(/*@ non_null */ ThrowStmt x) {
144        visitStmt(x);
145      }
146    
147      public void visitBranchStmt(/*@ non_null */ BranchStmt x) {
148        visitStmt(x);
149      }
150    
151      public void visitBreakStmt(/*@ non_null */ BreakStmt x) {
152        visitBranchStmt(x);
153      }
154    
155      public void visitContinueStmt(/*@ non_null */ ContinueStmt x) {
156        visitBranchStmt(x);
157      }
158    
159      public void visitLabelStmt(/*@ non_null */ LabelStmt x) {
160        visitStmt(x);
161      }
162    
163      public void visitIfStmt(/*@ non_null */ IfStmt x) {
164        visitStmt(x);
165      }
166    
167      public void visitForStmt(/*@ non_null */ ForStmt x) {
168        visitStmt(x);
169      }
170    
171      public void visitSkipStmt(/*@ non_null */ SkipStmt x) {
172        visitStmt(x);
173      }
174    
175      public void visitSwitchLabel(/*@ non_null */ SwitchLabel x) {
176        visitStmt(x);
177      }
178    
179      public void visitTryFinallyStmt(/*@ non_null */ TryFinallyStmt x) {
180        visitStmt(x);
181      }
182    
183      public void visitTryCatchStmt(/*@ non_null */ TryCatchStmt x) {
184        visitStmt(x);
185      }
186    
187      public void visitStmtPragma(/*@ non_null */ StmtPragma x) {
188        visitStmt(x);
189      }
190    
191      public void visitConstructorInvocation(/*@ non_null */ ConstructorInvocation x) {
192        visitStmt(x);
193      }
194    
195      public void visitCatchClause(/*@ non_null */ CatchClause x) {
196        visitASTNode(x);
197      }
198    
199      public void visitVarInit(/*@ non_null */ VarInit x) {
200        visitASTNode(x);
201      }
202    
203      public void visitArrayInit(/*@ non_null */ ArrayInit x) {
204        visitVarInit(x);
205      }
206    
207      public void visitExpr(/*@ non_null */ Expr x) {
208        visitVarInit(x);
209      }
210    
211      public void visitThisExpr(/*@ non_null */ ThisExpr x) {
212        visitExpr(x);
213      }
214    
215      public void visitLiteralExpr(/*@ non_null */ LiteralExpr x) {
216        visitExpr(x);
217      }
218    
219      public void visitArrayRefExpr(/*@ non_null */ ArrayRefExpr x) {
220        visitExpr(x);
221      }
222    
223      public void visitNewInstanceExpr(/*@ non_null */ NewInstanceExpr x) {
224        visitExpr(x);
225      }
226    
227      public void visitNewArrayExpr(/*@ non_null */ NewArrayExpr x) {
228        visitExpr(x);
229      }
230    
231      public void visitCondExpr(/*@ non_null */ CondExpr x) {
232        visitExpr(x);
233      }
234    
235      public void visitInstanceOfExpr(/*@ non_null */ InstanceOfExpr x) {
236        visitExpr(x);
237      }
238    
239      public void visitCastExpr(/*@ non_null */ CastExpr x) {
240        visitExpr(x);
241      }
242    
243      public void visitBinaryExpr(/*@ non_null */ BinaryExpr x) {
244        // if the binary expression contains the right shift operator warn about
245        // it
246        if(x.getTag() == TagConstants.LSHIFT || x.getTag() == TagConstants.ASGLSHIFT) {
247          ErrorSet.warning(x.getStartLoc(), "The semantics of the left shift operator are incomplete.");
248        }
249        visitExpr(x);
250      }
251    
252      public void visitUnaryExpr(/*@ non_null */ UnaryExpr x) {
253        visitExpr(x);
254      }
255    
256      public void visitParenExpr(/*@ non_null */ ParenExpr x) {
257        visitExpr(x);
258      }
259    
260      public void visitAmbiguousVariableAccess(/*@ non_null */ AmbiguousVariableAccess x) {
261        visitExpr(x);
262      }
263    
264      public void visitVariableAccess(/*@ non_null */ VariableAccess x) {
265        visitExpr(x);
266      }
267    
268      public void visitFieldAccess(/*@ non_null */ FieldAccess x) {
269        visitExpr(x);
270      }
271    
272      public void visitAmbiguousMethodInvocation(/*@ non_null */ AmbiguousMethodInvocation x) {
273        visitExpr(x);
274      }
275    
276      public void visitMethodInvocation(/*@ non_null */ MethodInvocation x) {
277        visitExpr(x);
278      }
279    
280      public void visitClassLiteral(/*@ non_null */ ClassLiteral x) {
281        visitExpr(x);
282      }
283    
284      public void visitObjectDesignator(/*@ non_null */ ObjectDesignator x) {
285        visitASTNode(x);
286      }
287    
288      public void visitExprObjectDesignator(/*@ non_null */ ExprObjectDesignator x) {
289        visitObjectDesignator(x);
290      }
291    
292      public void visitTypeObjectDesignator(/*@ non_null */ TypeObjectDesignator x) {
293        visitObjectDesignator(x);
294      }
295    
296      public void visitSuperObjectDesignator(/*@ non_null */ SuperObjectDesignator x) {
297        visitObjectDesignator(x);
298      }
299    
300      public void visitType(/*@ non_null */ Type x) {
301        visitASTNode(x);
302      }
303    
304      public void visitErrorType(/*@ non_null */ ErrorType x) {
305        visitType(x);
306      }
307    
308      public void visitPrimitiveType(/*@ non_null */ PrimitiveType x) {
309        visitType(x);
310      }
311    
312      public void visitTypeName(/*@ non_null */ TypeName x) {
313        visitType(x);
314      }
315    
316      public void visitArrayType(/*@ non_null */ ArrayType x) {
317        visitType(x);
318      }
319    
320      public void visitName(/*@ non_null */ Name x) {
321        visitASTNode(x);
322      }
323    
324      public void visitSimpleName(/*@ non_null */ SimpleName x) {
325        visitName(x);
326      }
327    
328      public void visitCompoundName(/*@ non_null */ CompoundName x) {
329        visitName(x);
330      }
331    
332      public void visitModifierPragma(/*@ non_null */ ModifierPragma x) {
333        visitASTNode(x);
334      }
335    
336      public void visitLexicalPragma(/*@ non_null */ LexicalPragma x) {
337        visitASTNode(x);
338      }
339    
340        public void visitTypeModifierPragma(/*@ non_null */ TypeModifierPragma x) {
341        visitASTNode(x);
342      }
343    
344    }