Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symbol.VarSymbol;
import java.time.Duration;
import java.util.List;
import java.util.concurrent.TimeUnit;

@AutoService(BugChecker.class)
@BugPattern(
Expand All @@ -46,22 +48,29 @@
+ "Tracked at https://github.com/google/guava/issues/2730")
public final class ZeroWarmupRateLimiter extends BugChecker implements BugChecker.MethodInvocationTreeMatcher {

private static final Matcher<ExpressionTree> MATCHER = Matchers.methodInvocation(
private static final Matcher<ExpressionTree> DURATION_ZERO_MATCHER = Matchers.methodInvocation(
MethodMatchers.staticMethod()
.onClass(RateLimiter.class.getName())
.named("create")
.withParameters("double", Duration.class.getName()),
MatchType.LAST,
ZeroWarmupRateLimiter::isDurationZero);
private static final Matcher<MethodInvocationTree> INT_LITERAL_ZERO_MATCHER = Matchers.allOf(
MethodMatchers.staticMethod()
.onClass(RateLimiter.class.getName())
.named("create")
.withParameters("double", "long", TimeUnit.class.getName()),
Matchers.argument(1, ZeroWarmupRateLimiter::isIntLiteralZero));
private static final Matcher<MethodInvocationTree> MATCHER =
Matchers.anyOf(DURATION_ZERO_MATCHER, INT_LITERAL_ZERO_MATCHER);

@Override
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
List<? extends ExpressionTree> args = tree.getArguments();
if (MATCHER.matches(tree, state)) {
return buildDescription(tree)
.addFix(SuggestedFix.replace(
state.getEndPosition(tree.getArguments().get(0)),
state.getEndPosition(tree.getArguments().get(1)),
""))
state.getEndPosition(args.get(0)), state.getEndPosition(args.get(args.size() - 1)), ""))
.build();
}
return Description.NO_MATCH;
Expand All @@ -81,4 +90,9 @@ private static boolean isDurationZero(ExpressionTree expressionTree, VisitorStat
}
return false;
}

private static boolean isIntLiteralZero(ExpressionTree expressionTree, VisitorState state) {
Number warmupTime = ASTHelpers.constValue(expressionTree, Number.class);
return warmupTime != null && (warmupTime.equals(0) || warmupTime.equals(0L));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,52 @@ public void should_remove_duration_zero_static_import() {
.doTest();
}

@Test
public void should_remove_int_literal_zero() {
fix().addInputLines(
"Test.java",
"import com.google.common.util.concurrent.RateLimiter;",
"import java.util.concurrent.TimeUnit;",
"class Test {",
" void f() {",
" RateLimiter.create(10, 0, TimeUnit.SECONDS);",
" }",
"}")
.addOutputLines(
"Test.java",
"import com.google.common.util.concurrent.RateLimiter;",
"import java.util.concurrent.TimeUnit;",
"class Test {",
" void f() {",
" RateLimiter.create(10);",
" }",
"}")
.doTest();
}

@Test
public void should_remove_long_literal_zero() {
fix().addInputLines(
"Test.java",
"import com.google.common.util.concurrent.RateLimiter;",
"import java.util.concurrent.TimeUnit;",
"class Test {",
" void f() {",
" RateLimiter.create(10, 0L, TimeUnit.SECONDS);",
" }",
"}")
.addOutputLines(
"Test.java",
"import com.google.common.util.concurrent.RateLimiter;",
"import java.util.concurrent.TimeUnit;",
"class Test {",
" void f() {",
" RateLimiter.create(10);",
" }",
"}")
.doTest();
}

@Test
public void should_not_modify_existing_uses() {
fix().addInputLines(
Expand All @@ -81,6 +127,36 @@ public void should_not_modify_existing_uses() {
.doTest();
}

@Test
public void should_not_modify_existing_uses_int_literal() {
fix().addInputLines(
"Test.java",
"import com.google.common.util.concurrent.RateLimiter;",
"import java.util.concurrent.TimeUnit;",
"class Test {",
" void f() {",
" RateLimiter.create(10, 100, TimeUnit.SECONDS);",
" }",
"}")
.expectUnchanged()
.doTest();
}

@Test
public void should_not_modify_existing_int_literal_zero_permits() {
fix().addInputLines(
"Test.java",
"import com.google.common.util.concurrent.RateLimiter;",
"import java.util.concurrent.TimeUnit;",
"class Test {",
" void f() {",
" RateLimiter.create(0, 100, TimeUnit.SECONDS);",
" }",
"}")
.expectUnchanged()
.doTest();
}

private RefactoringValidator fix() {
return RefactoringValidator.of(ZeroWarmupRateLimiter.class, getClass());
}
Expand Down
5 changes: 5 additions & 0 deletions changelog/@unreleased/pr-1960.v2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type: improvement
improvement:
description: Improve Zero Warmup Rate Limiter to Catch Int Literals
links:
- https://github.com/palantir/gradle-baseline/pull/1960