Skip to content

Commit 6161d4e

Browse files
cushonError Prone Team
authored andcommitted
Skip BooleanLiteral findings if the target type is boxed
PiperOrigin-RevId: 785892169
1 parent 98d83bf commit 6161d4e

File tree

2 files changed

+104
-8
lines changed

2 files changed

+104
-8
lines changed

core/src/main/java/com/google/errorprone/bugpatterns/BooleanLiteral.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@
2626
import com.google.errorprone.bugpatterns.BugChecker.MemberSelectTreeMatcher;
2727
import com.google.errorprone.fixes.SuggestedFix;
2828
import com.google.errorprone.matchers.Description;
29+
import com.google.errorprone.util.TargetType;
2930
import com.sun.source.tree.ExpressionTree;
3031
import com.sun.source.tree.IdentifierTree;
3132
import com.sun.source.tree.MemberReferenceTree;
3233
import com.sun.source.tree.MemberSelectTree;
3334
import com.sun.source.tree.MethodInvocationTree;
3435
import com.sun.source.util.TreePath;
3536
import com.sun.tools.javac.code.Symbol;
37+
import com.sun.tools.javac.code.TypeTag;
3638

3739
/** Simplifies Boolean.TRUE/FALSE to true/false. */
3840
@BugPattern(
@@ -85,6 +87,11 @@ private Description match(ExpressionTree tree, VisitorState state) {
8587
default -> NO_MATCH;
8688
};
8789
}
90+
TargetType targetType = TargetType.targetType(state);
91+
if (targetType == null
92+
|| !state.getTypes().unboxedType(targetType.type()).hasTag(TypeTag.NONE)) {
93+
return NO_MATCH;
94+
}
8895
return describeMatch(tree, SuggestedFix.replace(tree, Boolean.toString(value)));
8996
}
9097
}

core/src/test/java/com/google/errorprone/bugpatterns/BooleanLiteralTest.java

Lines changed: 97 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,34 +95,123 @@ public void moduleInfo() {
9595
@Test
9696
public void objectDoubleEqualsBooleanLiteral() {
9797
refactoringHelper
98-
.allowBreakingChanges()
9998
.addInputLines(
10099
"Test.java",
101100
"""
102101
class Test {
103-
boolean doubleEqualsBooleanTrue(Object o) {
102+
boolean objectDoubleEqualsBooleanTrue(Object o) {
104103
return o == Boolean.TRUE;
105104
}
106105
107-
boolean doubleEqualsBooleanFalse(Object o) {
106+
boolean objectDoubleEqualsBooleanFalse(Object o) {
108107
return o == Boolean.FALSE;
109108
}
109+
110+
boolean booleanTrueDoubleEqualsObject(Object o) {
111+
return Boolean.TRUE == o;
112+
}
113+
114+
boolean booleanFalseDoubleEqualsObject(Object o) {
115+
return Boolean.FALSE == o;
116+
}
117+
}
118+
""")
119+
.expectUnchanged()
120+
.doTest();
121+
}
122+
123+
@Test
124+
public void primitiveBooleanDoubleEqualsBooleanLiteral() {
125+
refactoringHelper
126+
.addInputLines(
127+
"Test.java",
128+
"""
129+
class Test {
130+
boolean booleanDoubleEqualsBooleanTrue(boolean b) {
131+
return b == Boolean.TRUE;
132+
}
133+
134+
boolean booleanDoubleEqualsBooleanFalse(boolean b) {
135+
return b == Boolean.FALSE;
136+
}
137+
138+
boolean booleanTrueDoubleEqualsBoolean(boolean b) {
139+
return Boolean.TRUE == b;
140+
}
141+
142+
boolean booleanFalseDoubleEqualsBoolean(boolean b) {
143+
return Boolean.FALSE == b;
144+
}
110145
}
111146
""")
112-
// TODO: b/428921980 - this shouldn't get re-written because it doesn't compile!
113147
.addOutputLines(
114148
"Test.java",
115149
"""
116150
class Test {
117-
boolean doubleEqualsBooleanTrue(Object o) {
118-
return o == true;
151+
boolean booleanDoubleEqualsBooleanTrue(boolean b) {
152+
return b == true;
119153
}
120154
121-
boolean doubleEqualsBooleanFalse(Object o) {
122-
return o == false;
155+
boolean booleanDoubleEqualsBooleanFalse(boolean b) {
156+
return b == false;
157+
}
158+
159+
boolean booleanTrueDoubleEqualsBoolean(boolean b) {
160+
return true == b;
161+
}
162+
163+
boolean booleanFalseDoubleEqualsBoolean(boolean b) {
164+
return false == b;
123165
}
124166
}
125167
""")
126168
.doTest();
127169
}
170+
171+
@Test
172+
public void boxedBooleanDoubleEqualsBooleanLiteral() {
173+
refactoringHelper
174+
.addInputLines(
175+
"Test.java",
176+
"""
177+
class Test {
178+
boolean booleanDoubleEqualsBooleanTrue(Boolean b) {
179+
return b == Boolean.TRUE;
180+
}
181+
182+
boolean booleanDoubleEqualsBooleanFalse(Boolean b) {
183+
return b == Boolean.FALSE;
184+
}
185+
186+
boolean booleanTrueDoubleEqualsBoolean(Boolean b) {
187+
return Boolean.TRUE == b;
188+
}
189+
190+
boolean booleanFalseDoubleEqualsBoolean(Boolean b) {
191+
return Boolean.FALSE == b;
192+
}
193+
}
194+
""")
195+
.expectUnchanged()
196+
.doTest();
197+
}
198+
199+
@Test
200+
public void boxedResult() {
201+
refactoringHelper
202+
.allowBreakingChanges()
203+
.addInputLines(
204+
"Test.java",
205+
"""
206+
class Test {
207+
Boolean f() {
208+
Boolean foo = null;
209+
Boolean b = true ? foo : Boolean.TRUE;
210+
return b;
211+
}
212+
}
213+
""")
214+
.expectUnchanged()
215+
.doTest();
216+
}
128217
}

0 commit comments

Comments
 (0)