View Javadoc
1   /*
2   EqualsAvoidNull
3   ignoreEqualsIgnoreCase = true
4   
5   
6   */
7   
8   package com.puppycrawl.tools.checkstyle.checks.coding.equalsavoidnull;
9   import java.util.Map;
10  public class InputEqualsAvoidNullIgnoreCase {
11  
12      public boolean equals(Object o) {
13      return false;
14      }
15      // another comment
16      /**
17       * methods that should get flagged
18       * @return
19       */
20      public void flagForEquals() {
21  
22          Object o = new Object();
23          String s = "pizza";
24  
25          o.equals("hot pizza")/*comment test*/;
26  
27          o.equals(s = "cold pizza");
28  
29          o.equals(((s = "cold pizza")));
30  
31          o.equals("cheese" + "ham" + "sauce");
32  
33          o.equals(("cheese" + "ham") + "sauce");
34  
35          o.equals((("cheese" + "ham")) + "sauce");
36      }
37  
38      /**
39       * methods that should get flagged
40       */
41      public void flagForEqualsIgnoreCase() {
42          String s = "pizza";
43  
44          s.equalsIgnoreCase("hot pizza");
45  
46          s.equalsIgnoreCase(s = "cold pizza");
47  
48          s.equalsIgnoreCase(((s = "cold pizza")));
49  
50          s.equalsIgnoreCase("cheese" + "ham" + "sauce");
51  
52          s.equalsIgnoreCase(("cheese" + "ham") + "sauce");
53  
54          s.equalsIgnoreCase((("cheese" + "ham")) + "sauce");
55      }
56  
57      /**
58       * methods that should get flagged
59       */
60      public void flagForBoth() {
61          Object o = new Object();
62          String s = "pizza";
63  
64          o.equals("hot pizza");
65  
66          o.equals(s = "cold pizza");
67  
68          o.equals(((s = "cold pizza")));
69  
70          o.equals("cheese" + "ham" + "sauce");
71  
72          o.equals(("cheese" + "ham") + "sauce");
73  
74          o.equals((("cheese" + "ham")) + "sauce");
75  
76          s.equalsIgnoreCase("hot pizza");
77  
78          s.equalsIgnoreCase(s = "cold pizza");
79  
80          s.equalsIgnoreCase(((s = "cold pizza")));
81  
82          s.equalsIgnoreCase("cheese" + "ham" + "sauce");
83  
84          s.equalsIgnoreCase(("cheese" + "ham") + "sauce");
85  
86          s.equalsIgnoreCase((("cheese" + "ham")) + "sauce");
87      }
88  
89  
90      /**
91       * methods that should not get flagged
92       *
93       * @return
94       */
95      public void noFlagForEquals() {
96          Object o = new Object();
97          String s = "peperoni";
98  
99          o.equals(s += "mushrooms");
100 
101         (s = "thin crust").equals("thick crust");
102 
103         (s += "garlic").equals("basil");
104 
105         ("Chicago Style" + "NY Style").equals("California Style" + "Any Style");
106 
107         equals("peppers");
108 
109         "onions".equals(o);
110 
111         o.equals(new Object());
112 
113         o.equals(equals(o));
114 
115         equals("yummy");
116 
117         new Object().equals("more cheese");
118 
119         InputEqualsAvoidNullOutter1 outter = new InputEqualsAvoidNullOutter1();
120 
121         outter.new InputEqualsAvoidNullInner().equals("eat pizza and enjoy inner classes");
122     }
123 
124     /**
125      * methods that should not get flagged
126      */
127     public void noFlagForEqualsIgnoreCase() {
128         String s = "peperoni";
129         String s1 = "tasty";
130 
131         s.equalsIgnoreCase(s += "mushrooms");
132 
133         s1.equalsIgnoreCase(s += "mushrooms");
134 
135         (s = "thin crust").equalsIgnoreCase("thick crust");
136 
137         (s += "garlic").equalsIgnoreCase("basil");
138 
139         ("Chicago Style" + "NY Style").equalsIgnoreCase("California Style" + "Any Style");
140 
141         "onions".equalsIgnoreCase(s);
142 
143         s.equalsIgnoreCase(new String());
144 
145         s.equals(s1);
146 
147         new String().equalsIgnoreCase("more cheese");
148 
149     }
150 
151     public void noFlagForBoth() {
152         Object o = new Object();
153         String s = "peperoni";
154         String s1 = "tasty";
155 
156         o.equals(s += "mushrooms");
157 
158         (s = "thin crust").equals("thick crust");
159 
160         (s += "garlic").equals("basil");
161 
162         ("Chicago Style" + "NY Style").equals("California Style" + "Any Style");
163 
164         equals("peppers");
165 
166         "onions".equals(o);
167 
168         o.equals(new Object());
169 
170         o.equals(equals(o));
171 
172         equals("yummy");
173 
174         new Object().equals("more cheese");
175 
176         InputEqualsAvoidNullOutter1 outter = new InputEqualsAvoidNullOutter1();
177 
178         outter.new InputEqualsAvoidNullInner().equals("eat pizza and enjoy inner classes");
179 
180         s.equalsIgnoreCase(s += "mushrooms");
181 
182         s1.equalsIgnoreCase(s += "mushrooms");
183 
184         (s = "thin crust").equalsIgnoreCase("thick crust");
185 
186         (s += "garlic").equalsIgnoreCase("basil");
187 
188         ("Chicago Style" + "NY Style").equalsIgnoreCase("California Style" + "Any Style");
189 
190         "onions".equalsIgnoreCase(s);
191 
192         s.equalsIgnoreCase(new String());
193 
194         s.equals(s1);
195 
196         new String().equalsIgnoreCase("more cheese");
197 
198     }
199 
200 }
201 
202 class InputEqualsAvoidNullOutter1 {
203     public class InputEqualsAvoidNullInner {
204             public boolean equals(Object o) {
205                 return true;
206             }
207     }
208 }
209 
210 class MyString1 {
211     public boolean equals() {
212         return true;
213     }
214 
215     public boolean equals(String s1) {
216         return true;
217     }
218 
219     public boolean equalsIgnoreCase() {
220         return true;
221     }
222 
223     public boolean equalsIgnoreCase(String s1) {
224         return true;
225     }
226 
227     private String pizza;
228 
229     public void main() {
230         MyString1 myString = new MyString1();
231         myString.equals();
232         myString.equals("what");
233         myString.equalsIgnoreCase();
234         myString.equalsIgnoreCase("what");
235         myString.equals(this.pizza = "cold pizza");
236     }
237 }
238 
239 class NewTest1 {
240     static String classVar;
241     String instanceVar;
242     NewTest1 testObj = new NewTest1("");
243 
244     NewTest1(String param) {
245         param.equals(""); // violation 'left .* of .* equals'
246     }
247 
248     public void method(String param) {
249         final String localVar = "";
250 
251         localVar.equals(""); // violation 'left .* of .* equals'
252         param.equals(""); // violation 'left .* of .* equals'
253 
254         classVar.equals(""); // violation 'left .* of .* equals'
255         instanceVar.equals(""); // violation 'left .* of .* equals'
256         NewTest1.classVar.equals(""); // violation 'left .* of .* equals'
257         this.classVar.equals(""); // violation 'left .* of .* equals'
258         this.instanceVar.equals(""); // violation 'left .* of .* equals'
259 
260         NewTest1 testObj = new NewTest1("");
261         this.testObj.instanceVar.equals(""); // not violated, too confusing
262         testObj.classVar.equals(""); // not violated
263 
264         for (Nested instanceVar = new Nested(); instanceVar != null; ) {
265             instanceVar.equals(1);
266             if (instanceVar.equals("")) {
267                 instanceVar.equals("");
268             }
269         }
270 
271         class Inner {
272             String instanceVarInner;
273 
274             public void main() {
275                 classVar.equals(""); // violation 'left .* of .* equals'
276                 instanceVar.equals(""); // violation 'left .* of .* equals'
277                 NewTest1.classVar.equals(""); // violation 'left .* of .* equals'
278 
279                 instanceVarInner.equals(""); // violation 'left .* of .* equals'
280                 this.instanceVarInner.equals(""); // violation 'left .* of .* equals'
281                 localVar.equals(""); // violation 'left .* of .* equals'
282 
283                 NewTest1 testObj = new NewTest1("");
284                 testObj.instanceVar.equals(""); // not violated
285                 testObj.classVar.equals(""); // not violated
286 
287                 Inner testInnerObj = new Inner();
288                 testInnerObj.instanceVarInner.equals(""); // not violated
289             }
290         }
291 
292         Inner testInnerObj = new Inner();
293         testInnerObj.instanceVarInner.equals(""); // not violated
294 
295         Nested.nestedClassVar.equals(""); // not violated, because the equals call is not
296         Nested Nested = new Nested(); // embedded in class Nested, what can lead to really
297         Nested.nestedInstanceVar.equals(""); // confusing constructions. But could be improved.
298         Nested.nestedClassVar.equals("");
299     }
300     static {
301         final String s = "";
302         s.equals(""); // violation 'left .* of .* equals'
303         {
304             final String x = "";
305             class A {
306                 void foo() {
307                     s.equals(""); // violation 'left .* of .* equals'
308                     x.equals(""); // violation 'left .* of .* equals'
309                 }
310             }
311         }
312     }
313     void foo(String param) {
314         try {
315             param.equals(""); // violation 'left .* of .* equals'
316             do {
317                 String s = "";
318                 s.equals(""); // violation 'left .* of .* equals'
319             } while (param.equals("")); // violation 'left .* of .* equals'
320         } catch (Exception e) {
321             while (param.equals("")) { // violation 'left .* of .* equals'
322                 for (String s = ""; s.equals(""); ){ // violation 'left .* of .* equals'
323                     if (s.equals("")) { // violation 'left .* of .* equals'
324                         synchronized (this) {
325                             switch (s) {
326                                 case "1":String str="";str.equals("");//violation 'left.*of.*equals'
327                                 case "2": s.equals(""); // violation 'left .* of .* equals'
328                                 str = ""; str.equals(""); // violation 'left .* of .* equals'
329                                 case "3": param.equals(""); // violation 'left .* of .* equals'
330                                     break;
331                             }
332                         }
333                     }
334                 }
335             }
336         }
337     }
338     static class Nested {
339         static String nestedClassVar;
340         String nestedInstanceVar;
341         public void method() {
342             classVar.equals(""); // violation 'left .* of .* equals'
343             NewTest1.classVar.equals(""); // violation 'left .* of .* equals'
344             this.nestedInstanceVar.equals(""); // violation 'left .* of .* equals'
345             nestedClassVar.equals(""); // violation 'left .* of .* equals'
346             nestedInstanceVar.equals(""); // violation 'left .* of .* equals'
347 
348             class Inner {
349                 public void method() {
350                     classVar.equals(""); // violation 'left .* of .* equals'
351                     NewTest1.classVar.equals(""); // violation 'left .* of .* equals'
352                     nestedClassVar.equals(""); // violation 'left .* of .* equals'
353                     nestedInstanceVar.equals(""); // violation 'left .* of .* equals'
354                 }
355             }
356         }
357     }
358     enum EmbeddedEnum {
359         A(129),
360         B(283),
361         C(1212) {
362             String constDefVar;
363             public void doSomething() {
364                 constDefVar.equals(""); // violation 'left .* of .* equals'
365             }
366         };
367 
368         Map.Entry<String,Long> enumInstance;
369 
370         EmbeddedEnum(int i) {
371             enumInstance.equals("");
372         }
373 
374         public static void doSomethingStatic() {
375             enumStatic.equals(""); // violation 'left .* of .* equals'
376             enumStatic.equals(null);
377         }
378         static String enumStatic;
379     }
380 
381     private String foo() {return "";}
382     private Object foo(int i) {return i;}
383 
384     Object o2 = new Object();
385     Object o3 = new Object();
386     private void bar() {
387         foo().equals(""); // methods are not checked
388         foo(0).equals("");
389         this.foo().equals("");
390         Object o1 = new Object(); o1.equals("");
391         o2.equals(""); String o2 = "";
392         o3.equals("");
393 String o3 = "";
394     }
395 }
396 class Anonymous1 {
397     public static void main(String[] args) {
398         Runnable anonym = new Runnable() {
399             String nullableStr = null;
400             public void run() {
401                 nullableStr.equals("Null"); // violation 'left .* of .* equals'
402             };
403         };
404         Object nullableStr = new Object();
405         nullableStr.equals("");
406     }
407     {}
408 }
409 
410 enum TestEnum1 {
411     ONE;
412     public void foo() {
413         TestEnum1.ONE.equals(this);
414         this.ONE.equals(this);
415     }
416 }
417 
418 class TestConcatenations1 {
419     String s = null;
420 
421     void foo() {
422         s.equals(s + s); // violation 'left .* of .* equals'
423         s.equals("a" + "b"); // violation 'left .* of .* equals'
424         s.equals(getInt() + s); // violation 'left .* of .* equals'
425         s.equals(getInt() + getInt());
426         s.endsWith("a");
427         String s = "";
428         if (!s.equals("Hi[EOL]"+System.getProperty("line.separator")))//violation 'left.*of.*equals'
429             foo();
430     }
431 
432     int getInt() {
433         return (Integer) null;
434     }
435 }
436 
437 class TestThisWithNotStringInstance1 {
438 
439     MyString1 notString;
440 
441     void foo() {
442         this.notString.equals("");
443     }
444 
445 }