1 /**
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package net.sourceforge.pmd;
5
6 import java.util.List;
7
8 import net.sourceforge.pmd.lang.Language;
9 import net.sourceforge.pmd.lang.LanguageVersion;
10 import net.sourceforge.pmd.lang.ParserOptions;
11 import net.sourceforge.pmd.lang.ast.Node;
12 import net.sourceforge.pmd.lang.rule.properties.StringProperty;
13
14 /**
15 * This is the basic Rule interface for PMD rules.
16 */
17 //FUTURE Implement Cloneable and clone()
18 public interface Rule extends PropertySource {
19
20 /**
21 * The property descriptor to universally suppress violations with messages matching a regular expression.
22 */
23 StringProperty VIOLATION_SUPPRESS_REGEX_DESCRIPTOR = new StringProperty("violationSuppressRegex",
24 "Suppress violations with messages matching a regular expression", null, Integer.MAX_VALUE - 1);
25
26 /**
27 * Name of the property to universally suppress violations on nodes which match a given relative XPath expression.
28 */
29 StringProperty VIOLATION_SUPPRESS_XPATH_DESCRIPTOR = new StringProperty("violationSuppressXPath",
30 "Suppress violations on nodes which match a given relative XPath expression.", null, Integer.MAX_VALUE - 2);
31
32 /**
33 * Get the Language of this Rule.
34 */
35 Language getLanguage();
36
37 /**
38 * Set the Language of this Rule.
39 */
40 void setLanguage(Language language);
41
42 /**
43 * Get the minimum LanguageVersion to which this Rule applies. If this
44 * value is <code>null</code> it indicates there is no minimum bound.
45 */
46 LanguageVersion getMinimumLanguageVersion();
47
48 /**
49 * Set the minimum LanguageVersion to which this Rule applies.
50 */
51 void setMinimumLanguageVersion(LanguageVersion minimumLanguageVersion);
52
53 /**
54 * Get the maximum LanguageVersion to which this Rule applies. If this
55 * value is <code>null</code> it indicates there is no maximum bound.
56 */
57 LanguageVersion getMaximumLanguageVersion();
58
59 /**
60 * Set the maximum LanguageVersion to which this Rule applies.
61 */
62 void setMaximumLanguageVersion(LanguageVersion maximumLanguageVersion);
63
64 /**
65 * Gets whether this Rule is deprecated. A deprecated Rule is one which:
66 * <ul>
67 * <li>is scheduled for removal in a future version of PMD</li>
68 * <li>or, has been removed and replaced with a non-functioning place-holder
69 * and will be completely removed in a future version of PMD</li>
70 * <li>or, has been renamed/moved and the old name will be completely
71 * removed in a future version of PMD</li>
72 * </ul>
73 */
74 boolean isDeprecated();
75
76 /**
77 * Sets whether this Rule is deprecated.
78 */
79 void setDeprecated(boolean deprecated);
80
81 /**
82 * Get the name of this Rule.
83 */
84 String getName();
85
86 /**
87 * Set the name of this Rule.
88 */
89 void setName(String name);
90
91 /**
92 * Get the version of PMD in which this Rule was added.
93 * Return <code>null</code> if not applicable.
94 */
95 String getSince();
96
97 /**
98 * Set the version of PMD in which this Rule was added.
99 */
100 void setSince(String since);
101
102 /**
103 * Get the class of this Rule.
104 */
105 String getRuleClass();
106
107 /**
108 * Set the class of this Rule.
109 */
110 void setRuleClass(String ruleClass);
111
112 /**
113 * Get the name of the RuleSet containing this Rule.
114 *
115 * @see RuleSet
116 */
117 String getRuleSetName();
118
119 /**
120 * Set the name of the RuleSet containing this Rule.
121 *
122 * @see RuleSet
123 */
124 void setRuleSetName(String name);
125
126 /**
127 * Get the message to show when this Rule identifies a violation.
128 */
129 String getMessage();
130
131 /**
132 * Set the message to show when this Rule identifies a violation.
133 */
134 void setMessage(String message);
135
136 /**
137 * Get the description of this Rule.
138 */
139 String getDescription();
140
141 /**
142 * Set the description of this Rule.
143 */
144 void setDescription(String description);
145
146 /**
147 * Get the list of examples for this Rule.
148 */
149 List<String> getExamples();
150
151 /**
152 * Add a single example for this Rule.
153 */
154 void addExample(String example);
155
156 /**
157 * Get a URL for external information about this Rule.
158 */
159 String getExternalInfoUrl();
160
161 /**
162 * Set a URL for external information about this Rule.
163 */
164 void setExternalInfoUrl(String externalInfoUrl);
165
166 /**
167 * Get the priority of this Rule.
168 */
169 RulePriority getPriority();
170
171 /**
172 * Set the priority of this Rule.
173 */
174 void setPriority(RulePriority priority);
175
176 /**
177 * Get the parser options for this Rule. Parser options are used to
178 * configure the {@link Parser} to create an AST in the form the Rule
179 * is expecting. Because ParserOptions are mutable, a Rule should
180 * return a new instance on each call.
181 */
182 ParserOptions getParserOptions();
183
184 /**
185 * Sets whether this Rule uses Data Flow Analysis.
186 */
187 // FUTURE Use JavaBean conventions for boolean attributes
188 void setUsesDFA();
189
190 /**
191 * Gets whether this Rule uses Data Flow Analysis.
192 */
193 // FUTURE Use JavaBean conventions for boolean attributes
194 boolean usesDFA();
195
196 /**
197 * Sets whether this Rule uses Type Resolution.
198 */
199 // FUTURE Use JavaBean conventions for boolean attributes
200 void setUsesTypeResolution();
201
202 /**
203 * Gets whether this Rule uses Type Resolution.
204 */
205 // FUTURE Use JavaBean conventions for boolean attributes
206 boolean usesTypeResolution();
207
208 /**
209 * Gets whether this Rule uses the RuleChain.
210 */
211 // FUTURE Use JavaBean conventions for boolean attributes
212 boolean usesRuleChain();
213
214 /**
215 * Gets the collection of AST node names visited by the Rule on the
216 * RuleChain.
217 */
218 List<String> getRuleChainVisits();
219
220 /**
221 * Adds an AST node by class to be visited by the Rule on the RuleChain.
222 */
223 void addRuleChainVisit(Class<? extends Node> nodeClass);
224
225 /**
226 * Adds an AST node by name to be visited by the Rule on the RuleChain.
227 */
228 void addRuleChainVisit(String astNodeName);
229
230 /**
231 * Start processing. Called once, before apply() is first called.
232 */
233 void start(RuleContext ctx);
234
235 /**
236 * Apply this rule to the given collection of nodes, using the
237 * given context.
238 */
239 void apply(List<? extends Node> nodes, RuleContext ctx);
240
241 /**
242 * End processing. Called once, after apply() is last called.
243 */
244 void end(RuleContext ctx);
245 }