1
2
3
4 package net.sourceforge.pmd.lang.ecmascript.rule;
5
6 import java.util.List;
7
8 import net.sourceforge.pmd.RuleContext;
9 import net.sourceforge.pmd.lang.Language;
10 import net.sourceforge.pmd.lang.ParserOptions;
11 import net.sourceforge.pmd.lang.ast.Node;
12 import net.sourceforge.pmd.lang.ecmascript.EcmascriptParserOptions;
13 import net.sourceforge.pmd.lang.ecmascript.ast.ASTArrayComprehension;
14 import net.sourceforge.pmd.lang.ecmascript.ast.ASTArrayComprehensionLoop;
15 import net.sourceforge.pmd.lang.ecmascript.ast.ASTArrayLiteral;
16 import net.sourceforge.pmd.lang.ecmascript.ast.ASTAssignment;
17 import net.sourceforge.pmd.lang.ecmascript.ast.ASTAstRoot;
18 import net.sourceforge.pmd.lang.ecmascript.ast.ASTBlock;
19 import net.sourceforge.pmd.lang.ecmascript.ast.ASTBreakStatement;
20 import net.sourceforge.pmd.lang.ecmascript.ast.ASTCatchClause;
21 import net.sourceforge.pmd.lang.ecmascript.ast.ASTComment;
22 import net.sourceforge.pmd.lang.ecmascript.ast.ASTConditionalExpression;
23 import net.sourceforge.pmd.lang.ecmascript.ast.ASTContinueStatement;
24 import net.sourceforge.pmd.lang.ecmascript.ast.ASTDoLoop;
25 import net.sourceforge.pmd.lang.ecmascript.ast.ASTElementGet;
26 import net.sourceforge.pmd.lang.ecmascript.ast.ASTEmptyExpression;
27 import net.sourceforge.pmd.lang.ecmascript.ast.ASTExpressionStatement;
28 import net.sourceforge.pmd.lang.ecmascript.ast.ASTForInLoop;
29 import net.sourceforge.pmd.lang.ecmascript.ast.ASTForLoop;
30 import net.sourceforge.pmd.lang.ecmascript.ast.ASTFunctionCall;
31 import net.sourceforge.pmd.lang.ecmascript.ast.ASTFunctionNode;
32 import net.sourceforge.pmd.lang.ecmascript.ast.ASTIfStatement;
33 import net.sourceforge.pmd.lang.ecmascript.ast.ASTInfixExpression;
34 import net.sourceforge.pmd.lang.ecmascript.ast.ASTKeywordLiteral;
35 import net.sourceforge.pmd.lang.ecmascript.ast.ASTLabel;
36 import net.sourceforge.pmd.lang.ecmascript.ast.ASTLabeledStatement;
37 import net.sourceforge.pmd.lang.ecmascript.ast.ASTLetNode;
38 import net.sourceforge.pmd.lang.ecmascript.ast.ASTName;
39 import net.sourceforge.pmd.lang.ecmascript.ast.ASTNewExpression;
40 import net.sourceforge.pmd.lang.ecmascript.ast.ASTNumberLiteral;
41 import net.sourceforge.pmd.lang.ecmascript.ast.ASTObjectLiteral;
42 import net.sourceforge.pmd.lang.ecmascript.ast.ASTObjectProperty;
43 import net.sourceforge.pmd.lang.ecmascript.ast.ASTParenthesizedExpression;
44 import net.sourceforge.pmd.lang.ecmascript.ast.ASTPropertyGet;
45 import net.sourceforge.pmd.lang.ecmascript.ast.ASTRegExpLiteral;
46 import net.sourceforge.pmd.lang.ecmascript.ast.ASTReturnStatement;
47 import net.sourceforge.pmd.lang.ecmascript.ast.ASTScope;
48 import net.sourceforge.pmd.lang.ecmascript.ast.ASTStringLiteral;
49 import net.sourceforge.pmd.lang.ecmascript.ast.ASTSwitchCase;
50 import net.sourceforge.pmd.lang.ecmascript.ast.ASTSwitchStatement;
51 import net.sourceforge.pmd.lang.ecmascript.ast.ASTThrowStatement;
52 import net.sourceforge.pmd.lang.ecmascript.ast.ASTTryStatement;
53 import net.sourceforge.pmd.lang.ecmascript.ast.ASTUnaryExpression;
54 import net.sourceforge.pmd.lang.ecmascript.ast.ASTVariableDeclaration;
55 import net.sourceforge.pmd.lang.ecmascript.ast.ASTVariableInitializer;
56 import net.sourceforge.pmd.lang.ecmascript.ast.ASTWhileLoop;
57 import net.sourceforge.pmd.lang.ecmascript.ast.ASTWithStatement;
58 import net.sourceforge.pmd.lang.ecmascript.ast.ASTXmlDotQuery;
59 import net.sourceforge.pmd.lang.ecmascript.ast.ASTXmlExpression;
60 import net.sourceforge.pmd.lang.ecmascript.ast.ASTXmlMemberGet;
61 import net.sourceforge.pmd.lang.ecmascript.ast.ASTXmlString;
62 import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptNode;
63 import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParserVisitor;
64 import net.sourceforge.pmd.lang.rule.AbstractRule;
65 import net.sourceforge.pmd.lang.rule.ImmutableLanguage;
66 import net.sourceforge.pmd.lang.rule.properties.BooleanProperty;
67 import net.sourceforge.pmd.lang.rule.properties.EnumeratedProperty;
68
69 public abstract class AbstractEcmascriptRule extends AbstractRule implements EcmascriptParserVisitor, ImmutableLanguage {
70
71 private static final BooleanProperty RECORDING_COMMENTS_DESCRIPTOR = EcmascriptParserOptions.RECORDING_COMMENTS_DESCRIPTOR;
72 private static final BooleanProperty RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR = EcmascriptParserOptions.RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR;
73 private static final EnumeratedProperty<EcmascriptParserOptions.Version> RHINO_LANGUAGE_VERSION = EcmascriptParserOptions.RHINO_LANGUAGE_VERSION;
74
75 public AbstractEcmascriptRule() {
76 super.setLanguage(Language.ECMASCRIPT);
77 definePropertyDescriptor(RECORDING_COMMENTS_DESCRIPTOR);
78 definePropertyDescriptor(RECORDING_LOCAL_JSDOC_COMMENTS_DESCRIPTOR);
79 definePropertyDescriptor(RHINO_LANGUAGE_VERSION);
80 }
81
82 @Override
83 public ParserOptions getParserOptions() {
84 return new EcmascriptParserOptions(this);
85 }
86
87 public void apply(List<? extends Node> nodes, RuleContext ctx) {
88 visitAll(nodes, ctx);
89 }
90
91 protected void visitAll(List<? extends Node> nodes, RuleContext ctx) {
92 for (Object element : nodes) {
93 ASTAstRoot node = (ASTAstRoot) element;
94 visit(node, ctx);
95 }
96 }
97
98
99
100
101
102
103
104 public Object visit(EcmascriptNode node, Object data) {
105 node.childrenAccept(this, data);
106 return null;
107 }
108
109 public Object visit(ASTArrayComprehension node, Object data) {
110 return visit((EcmascriptNode) node, data);
111 }
112
113 public Object visit(ASTArrayComprehensionLoop node, Object data) {
114 return visit((EcmascriptNode) node, data);
115 }
116
117 public Object visit(ASTArrayLiteral node, Object data) {
118 return visit((EcmascriptNode) node, data);
119 }
120
121 public Object visit(ASTAssignment node, Object data) {
122 return visit((EcmascriptNode) node, data);
123 }
124
125 public Object visit(ASTAstRoot node, Object data) {
126 return visit((EcmascriptNode) node, data);
127 }
128
129 public Object visit(ASTBlock node, Object data) {
130 return visit((EcmascriptNode) node, data);
131 }
132
133 public Object visit(ASTBreakStatement node, Object data) {
134 return visit((EcmascriptNode) node, data);
135 }
136
137 public Object visit(ASTCatchClause node, Object data) {
138 return visit((EcmascriptNode) node, data);
139 }
140
141 public Object visit(ASTComment node, Object data) {
142 return visit((EcmascriptNode) node, data);
143 }
144
145 public Object visit(ASTConditionalExpression node, Object data) {
146 return visit((EcmascriptNode) node, data);
147 }
148
149 public Object visit(ASTContinueStatement node, Object data) {
150 return visit((EcmascriptNode) node, data);
151 }
152
153 public Object visit(ASTDoLoop node, Object data) {
154 return visit((EcmascriptNode) node, data);
155 }
156
157 public Object visit(ASTElementGet node, Object data) {
158 return visit((EcmascriptNode) node, data);
159 }
160
161 public Object visit(ASTEmptyExpression node, Object data) {
162 return visit((EcmascriptNode) node, data);
163 }
164
165 public Object visit(ASTExpressionStatement node, Object data) {
166 return visit((EcmascriptNode) node, data);
167 }
168
169 public Object visit(ASTForInLoop node, Object data) {
170 return visit((EcmascriptNode) node, data);
171 }
172
173 public Object visit(ASTForLoop node, Object data) {
174 return visit((EcmascriptNode) node, data);
175 }
176
177 public Object visit(ASTFunctionCall node, Object data) {
178 return visit((EcmascriptNode) node, data);
179 }
180
181 public Object visit(ASTFunctionNode node, Object data) {
182 return visit((EcmascriptNode) node, data);
183 }
184
185 public Object visit(ASTIfStatement node, Object data) {
186 return visit((EcmascriptNode) node, data);
187 }
188
189 public Object visit(ASTInfixExpression node, Object data) {
190 return visit((EcmascriptNode) node, data);
191 }
192
193 public Object visit(ASTKeywordLiteral node, Object data) {
194 return visit((EcmascriptNode) node, data);
195 }
196
197 public Object visit(ASTLabel node, Object data) {
198 return visit((EcmascriptNode) node, data);
199 }
200
201 public Object visit(ASTLabeledStatement node, Object data) {
202 return visit((EcmascriptNode) node, data);
203 }
204
205 public Object visit(ASTLetNode node, Object data) {
206 return visit((EcmascriptNode) node, data);
207 }
208
209 public Object visit(ASTName node, Object data) {
210 return visit((EcmascriptNode) node, data);
211 }
212
213 public Object visit(ASTNewExpression node, Object data) {
214 return visit((EcmascriptNode) node, data);
215 }
216
217 public Object visit(ASTNumberLiteral node, Object data) {
218 return visit((EcmascriptNode) node, data);
219 }
220
221 public Object visit(ASTObjectLiteral node, Object data) {
222 return visit((EcmascriptNode) node, data);
223 }
224
225 public Object visit(ASTObjectProperty node, Object data) {
226 return visit((EcmascriptNode) node, data);
227 }
228
229 public Object visit(ASTParenthesizedExpression node, Object data) {
230 return visit((EcmascriptNode) node, data);
231 }
232
233 public Object visit(ASTPropertyGet node, Object data) {
234 return visit((EcmascriptNode) node, data);
235 }
236
237 public Object visit(ASTRegExpLiteral node, Object data) {
238 return visit((EcmascriptNode) node, data);
239 }
240
241 public Object visit(ASTReturnStatement node, Object data) {
242 return visit((EcmascriptNode) node, data);
243 }
244
245 public Object visit(ASTScope node, Object data) {
246 return visit((EcmascriptNode) node, data);
247 }
248
249 public Object visit(ASTStringLiteral node, Object data) {
250 return visit((EcmascriptNode) node, data);
251 }
252
253 public Object visit(ASTSwitchCase node, Object data) {
254 return visit((EcmascriptNode) node, data);
255 }
256
257 public Object visit(ASTSwitchStatement node, Object data) {
258 return visit((EcmascriptNode) node, data);
259 }
260
261 public Object visit(ASTThrowStatement node, Object data) {
262 return visit((EcmascriptNode) node, data);
263 }
264
265 public Object visit(ASTTryStatement node, Object data) {
266 return visit((EcmascriptNode) node, data);
267 }
268
269 public Object visit(ASTUnaryExpression node, Object data) {
270 return visit((EcmascriptNode) node, data);
271 }
272
273 public Object visit(ASTVariableDeclaration node, Object data) {
274 return visit((EcmascriptNode) node, data);
275 }
276
277 public Object visit(ASTVariableInitializer node, Object data) {
278 return visit((EcmascriptNode) node, data);
279 }
280
281 public Object visit(ASTWhileLoop node, Object data) {
282 return visit((EcmascriptNode) node, data);
283 }
284
285 public Object visit(ASTWithStatement node, Object data) {
286 return visit((EcmascriptNode) node, data);
287 }
288
289 public Object visit(ASTXmlDotQuery node, Object data) {
290 return visit((EcmascriptNode) node, data);
291 }
292
293 public Object visit(ASTXmlExpression node, Object data) {
294 return visit((EcmascriptNode) node, data);
295 }
296
297 public Object visit(ASTXmlMemberGet node, Object data) {
298 return visit((EcmascriptNode) node, data);
299 }
300
301 public Object visit(ASTXmlString node, Object data) {
302 return visit((EcmascriptNode) node, data);
303 }
304 }