Skip to content

Commit c8df502

Browse files
java-team-github-botError Prone Team
authored and
Error Prone Team
committed
Make the logic of detecting at least one allowed usage more explicit.
The condition `== UsageState.ALLOWED_USAGE` doesn't convey the intention to trigger the finding for allowed usage only if at the same time there is no disallowed usage. I'm renaming the constant to `ONLY_ALLOWED_USAGE` and adding the state transition methods to make the logic more explicit. PiperOrigin-RevId: 629340469
1 parent fd9b826 commit c8df502

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

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

+28-7
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@
1919
import static com.google.common.collect.ImmutableSet.toImmutableSet;
2020
import static com.google.common.collect.Iterables.getOnlyElement;
2121
import static com.google.errorprone.BugPattern.SeverityLevel.SUGGESTION;
22-
import static com.google.errorprone.bugpatterns.ImmutableSetForContains.UsageState.ALLOWED_USAGE;
2322
import static com.google.errorprone.bugpatterns.ImmutableSetForContains.UsageState.DISALLOWED_USAGE;
2423
import static com.google.errorprone.bugpatterns.ImmutableSetForContains.UsageState.NEVER_USED;
24+
import static com.google.errorprone.bugpatterns.ImmutableSetForContains.UsageState.ONLY_ALLOWED_USAGE;
2525
import static com.google.errorprone.matchers.Matchers.allOf;
2626
import static com.google.errorprone.matchers.Matchers.anyOf;
2727
import static com.google.errorprone.matchers.Matchers.hasAnnotationWithSimpleName;
@@ -125,7 +125,7 @@ public Description matchClass(ClassTree tree, VisitorState state) {
125125
if (isSuppressed(var, state)) {
126126
continue;
127127
}
128-
if (usageScanner.varUsages.get(getSymbol(var)) == UsageState.ALLOWED_USAGE) {
128+
if (usageScanner.varUsages.get(getSymbol(var)).shouldReport()) {
129129
firstReplacement = Optional.of(var);
130130
fix.merge(convertListToSetInit(var, state));
131131
}
@@ -228,8 +228,9 @@ private boolean allowedFuncOnImmutableVar(MethodInvocationTree methodTree, Visit
228228
return false;
229229
}
230230
boolean allowed = ALLOWED_FUNCTIONS_ON_LIST.matches(methodTree, state);
231-
if (allowed && (varUsages.get(getSymbol(receiver)) == NEVER_USED)) {
232-
varUsages.put(getSymbol(receiver), ALLOWED_USAGE);
231+
if (allowed) {
232+
varUsages.computeIfPresent(
233+
getSymbol(receiver), (sym, oldVal) -> oldVal.markAllowedUsageDetected());
233234
}
234235
return allowed;
235236
}
@@ -247,13 +248,33 @@ public Void visitMemberSelect(MemberSelectTree memberSelectTree, VisitorState vi
247248
}
248249

249250
private void recordDisallowedUsage(Symbol symbol) {
250-
varUsages.computeIfPresent(symbol, (sym, oldVal) -> DISALLOWED_USAGE);
251+
varUsages.computeIfPresent(symbol, (sym, oldVal) -> oldVal.markDisallowedUsageDetected());
251252
}
252253
}
253254

254255
enum UsageState {
256+
/** No usage detected. */
255257
NEVER_USED,
256-
ALLOWED_USAGE,
257-
DISALLOWED_USAGE
258+
259+
/** At least one allowed usage detected. No disallowed usage detected. */
260+
ONLY_ALLOWED_USAGE,
261+
262+
/** Disallowed usage detected. Allowed usage is ignored. */
263+
DISALLOWED_USAGE;
264+
265+
UsageState markAllowedUsageDetected() {
266+
if (this == DISALLOWED_USAGE) {
267+
return DISALLOWED_USAGE;
268+
}
269+
return ONLY_ALLOWED_USAGE;
270+
}
271+
272+
UsageState markDisallowedUsageDetected() {
273+
return DISALLOWED_USAGE;
274+
}
275+
276+
boolean shouldReport() {
277+
return this == ONLY_ALLOWED_USAGE;
278+
}
258279
}
259280
}

0 commit comments

Comments
 (0)