package com.puppycrawl.tools.checkstyle.checks.coding;
import java.util.Map;
public class InputEqualsAvoidNull {
public boolean equals(Object o) {
return false;
}
// antoher comment
/**
* methods that should get flagged
* @return
*/
public void flagForEquals() {
Object o = new Object();
String s = "pizza";
o.equals("hot pizza")/*comment test*/;
o.equals(s = "cold pizza");
o.equals(((s = "cold pizza")));
o.equals("cheese" + "ham" + "sauce");
o.equals(("cheese" + "ham") + "sauce");
o.equals((("cheese" + "ham")) + "sauce");
}
/**
* methods that should get flagged
*/
public void flagForEqualsIgnoreCase() {
String s = "pizza";
s.equalsIgnoreCase("hot pizza");
s.equalsIgnoreCase(s = "cold pizza");
s.equalsIgnoreCase(((s = "cold pizza")));
s.equalsIgnoreCase("cheese" + "ham" + "sauce");
s.equalsIgnoreCase(("cheese" + "ham") + "sauce");
s.equalsIgnoreCase((("cheese" + "ham")) + "sauce");
}
/**
* methods that should get flagged
*/
public void flagForBoth() {
Object o = new Object();
String s = "pizza";
o.equals("hot pizza");
o.equals(s = "cold pizza");
o.equals(((s = "cold pizza")));
o.equals("cheese" + "ham" + "sauce");
o.equals(("cheese" + "ham") + "sauce");
o.equals((("cheese" + "ham")) + "sauce");
s.equalsIgnoreCase("hot pizza");
s.equalsIgnoreCase(s = "cold pizza");
s.equalsIgnoreCase(((s = "cold pizza")));
s.equalsIgnoreCase("cheese" + "ham" + "sauce");
s.equalsIgnoreCase(("cheese" + "ham") + "sauce");
s.equalsIgnoreCase((("cheese" + "ham")) + "sauce");
}
/**
* methods that should not get flagged
*
* @return
*/
public void noFlagForEquals() {
Object o = new Object();
String s = "peperoni";
o.equals(s += "mushrooms");
(s = "thin crust").equals("thick crust");
(s += "garlic").equals("basil");
("Chicago Style" + "NY Style").equals("California Style" + "Any Style");
equals("peppers");
"onions".equals(o);
o.equals(new Object());
o.equals(equals(o));
equals("yummy");
new Object().equals("more cheese");
InputEqualsAvoidNullOutter outter = new InputEqualsAvoidNullOutter();
outter.new InputEqualsAvoidNullInner().equals("eat pizza and enjoy inner classes");
}
/**
* methods that should not get flagged
*/
public void noFlagForEqualsIgnoreCase() {
String s = "peperoni";
String s1 = "tasty";
s.equalsIgnoreCase(s += "mushrooms");
s1.equalsIgnoreCase(s += "mushrooms");
(s = "thin crust").equalsIgnoreCase("thick crust");
(s += "garlic").equalsIgnoreCase("basil");
("Chicago Style" + "NY Style").equalsIgnoreCase("California Style" + "Any Style");
"onions".equalsIgnoreCase(s);
s.equalsIgnoreCase(new String());
s.equals(s1);
new String().equalsIgnoreCase("more cheese");
}
public void noFlagForBoth() {
Object o = new Object();
String s = "peperoni";
String s1 = "tasty";
o.equals(s += "mushrooms");
(s = "thin crust").equals("thick crust");
(s += "garlic").equals("basil");
("Chicago Style" + "NY Style").equals("California Style" + "Any Style");
equals("peppers");
"onions".equals(o);
o.equals(new Object());
o.equals(equals(o));
equals("yummy");
new Object().equals("more cheese");
InputEqualsAvoidNullOutter outter = new InputEqualsAvoidNullOutter();
outter.new InputEqualsAvoidNullInner().equals("eat pizza and enjoy inner classes");
s.equalsIgnoreCase(s += "mushrooms");
s1.equalsIgnoreCase(s += "mushrooms");
(s = "thin crust").equalsIgnoreCase("thick crust");
(s += "garlic").equalsIgnoreCase("basil");
("Chicago Style" + "NY Style").equalsIgnoreCase("California Style" + "Any Style");
"onions".equalsIgnoreCase(s);
s.equalsIgnoreCase(new String());
s.equals(s1);
new String().equalsIgnoreCase("more cheese");
}
}
class InputEqualsAvoidNullOutter {
public class InputEqualsAvoidNullInner {
public boolean equals(Object o) {
return true;
}
}
}
class MyString {
public boolean equals() {
return true;
}
public boolean equals(String s1) {
return true;
}
public boolean equalsIgnoreCase() {
return true;
}
public boolean equalsIgnoreCase(String s1) {
return true;
}
private String pizza;
public void main() {
MyString myString = new MyString();
myString.equals();
myString.equals("what");
myString.equalsIgnoreCase();
myString.equalsIgnoreCase("what");
myString.equals(this.pizza = "cold pizza");
}
}
class NewTest {
static String classVar;
String instanceVar;
NewTest testObj = new NewTest("");
NewTest(String param) {
param.equals("");
}
public void method(String param) {
final String localVar = "";
localVar.equals("");
param.equals("");
classVar.equals("");
instanceVar.equals("");
NewTest.classVar.equals("");
this.classVar.equals("");
this.instanceVar.equals("");
NewTest testObj = new NewTest("");
this.testObj.instanceVar.equals(""); // not violated, too confusing
testObj.classVar.equals(""); // not violated
for (Nested instanceVar = new Nested(); instanceVar != null; ) {
instanceVar.equals(1);
if (instanceVar.equals("")) {
instanceVar.equals("");
}
}
class Inner {
String instanceVarInner;
public void main() {
classVar.equals("");
instanceVar.equals("");
NewTest.classVar.equals("");
instanceVarInner.equals("");
this.instanceVarInner.equals("");
localVar.equals("");
NewTest testObj = new NewTest("");
testObj.instanceVar.equals(""); // not violated
testObj.classVar.equals(""); // not violated
Inner testInnerObj = new Inner();
testInnerObj.instanceVarInner.equals(""); // not violated
}
}
Inner testInnerObj = new Inner();
testInnerObj.instanceVarInner.equals(""); // not violated
Nested.nestedClassVar.equals(""); // not violated, because the equals call is not
Nested Nested = new Nested(); // embedded in class Nested, what can lead to really
Nested.nestedInstanceVar.equals(""); // confusing constructions. But could be improved.
Nested.nestedClassVar.equals("");
}
static {
final String s = "";
s.equals("");
{
final String x = "";
class A {
void foo() {
s.equals("");
x.equals("");
}
}
}
}
void foo(String param) {
try {
param.equals("");
do {
String s = "";
s.equals("");
} while (param.equals(""));
} catch (Exception e) {
while (param.equals("")) {
for (String s = ""; s.equals(""); ){
if (s.equals("")) {
synchronized (this) {
switch (s) {
case "1": String str = ""; str.equals("");
case "2": s.equals(""); str = ""; str.equals("");
case "3": param.equals("");
break;
}
}
}
}
}
}
}
static class Nested {
static String nestedClassVar;
String nestedInstanceVar;
public void method() {
classVar.equals("");
NewTest.classVar.equals("");
this.nestedInstanceVar.equals("");
nestedClassVar.equals("");
nestedInstanceVar.equals("");
class Inner {
public void method() {
classVar.equals("");
NewTest.classVar.equals("");
nestedClassVar.equals("");
nestedInstanceVar.equals("");
}
}
}
}
enum EmbeddedEnum {
A(129),
B(283),
C(1212) {
String constDefVar;
public void doSomething() {
constDefVar.equals("");
}
};
Map.Entry<String,Long> enumInstance;
EmbeddedEnum(int i) {
enumInstance.equals("");
}
public static void doSomethingStatic() {
enumStatic.equals("");
enumStatic.equals(null);
}
static String enumStatic;
}
private String foo() {return "";}
private Object foo(int i) {return i;}
Object o2 = new Object();
Object o3 = new Object();
private void bar() {
foo().equals(""); // methods are not checked
foo(0).equals("");
this.foo().equals("");
Object o1 = new Object(); o1.equals("");
o2.equals(""); String o2 = "";
o3.equals("");
String o3 = "";
}
}
class Anonymous {
public static void main(String[] args) {
Runnable anonym = new Runnable() {
String nullableStr = null;
public void run() {
nullableStr.equals("Null");
};
};
Object nullableStr = new Object();
nullableStr.equals("");
}
{}
}
enum TestEnum {
ONE;
public void foo() {
TestEnum.ONE.equals(this);
this.ONE.equals(this);
}
}
class TestConcatenations {
String s = null;
void foo() {
s.equals(s + s);
s.equals("a" + "b");
s.equals(getInt() + s);
s.equals(getInt() + getInt());
}
int getInt() {
return (Integer) null;
}
}