Skip to content

Commit

Permalink
Recognize orElseThrow() in some checks that handle get()
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 390462777
  • Loading branch information
cushon authored and Error Prone Team committed Aug 12, 2021
1 parent 10ae8a1 commit ba12995
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.sun.source.util.TreeScanner;
import java.util.Iterator;
import javax.annotation.Nullable;
import javax.lang.model.element.Name;

/** @author mariasam@google.com (Maria Sam) */
@BugPattern(
Expand Down Expand Up @@ -132,7 +133,8 @@ public Void visitMethodInvocation(MethodInvocationTree tree, ExpressionTree opti
if (receiver != null && ASTHelpers.sameVariable(receiver, optionalVar)) {
ExpressionTree treeIdent = tree.getMethodSelect();
if (treeIdent instanceof MemberSelectTree) {
if (((MemberSelectTree) treeIdent).getIdentifier().contentEquals("get")) {
Name identifier = ((MemberSelectTree) treeIdent).getIdentifier();
if (identifier.contentEquals("get") || identifier.contentEquals("orElseThrow")) {
hasGet = true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public final class UnnecessaryOptionalGet extends BugChecker
anyOf(
instanceMethod()
.onExactClass("java.util.Optional")
.namedAnyOf("get", "orElse", "orElseGet", "orElseThrow"),
.namedAnyOf("get", "orElseThrow", "orElse", "orElseGet", "orElseThrow"),
instanceMethod()
.onExactClass("java.util.OptionalLong")
.namedAnyOf("getAsLong", "orElse", "orElseGet", "orElseThrow"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,23 @@ public void isEmpty() {
"}")
.doTest();
}

@Test
public void orElseThrow() {
assumeTrue(RuntimeVersion.isAtLeast11());
compilationTestHelper
.addSourceLines(
"Test.java",
"import java.util.Optional;",
"class Test {",
" int g(Optional<Integer> o) {",
" // BUG: Diagnostic contains:",
" if (o.isEmpty()) {",
" return o.orElseThrow();",
" }",
" return -1;",
" }",
"}")
.doTest();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@

package com.google.errorprone.bugpatterns;

import static org.junit.Assume.assumeTrue;

import com.google.errorprone.BugCheckerRefactoringTestHelper;
import com.google.errorprone.util.RuntimeVersion;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
Expand All @@ -29,6 +32,7 @@ public final class UnnecessaryOptionalGetTest {

@Test
public void genericOptionalVars_sameVarGet_replacesWithLambdaArg() {
assumeTrue(RuntimeVersion.isAtLeast11());
refactoringTestHelper
.addInputLines(
"Test.java",
Expand All @@ -40,6 +44,7 @@ public void genericOptionalVars_sameVarGet_replacesWithLambdaArg() {
" op.map(x -> Long.parseLong(op.get()));",
" op.filter(x -> op.get().isEmpty());",
" op.flatMap(x -> Optional.of(op.get()));",
" op.flatMap(x -> Optional.of(op.orElseThrow()));",
" }",
"}")
.addOutputLines(
Expand All @@ -52,6 +57,7 @@ public void genericOptionalVars_sameVarGet_replacesWithLambdaArg() {
" op.map(x -> Long.parseLong(x));",
" op.filter(x -> x.isEmpty());",
" op.flatMap(x -> Optional.of(x));",
" op.flatMap(x -> Optional.of(x));",
" }",
"}")
.doTest();
Expand Down Expand Up @@ -280,4 +286,29 @@ public void differentReceivers() {
.expectUnchanged()
.doTest();
}

@Test
public void orElseThrow() {
assumeTrue(RuntimeVersion.isAtLeast11());
refactoringTestHelper
.addInputLines(
"Test.java",
"import java.util.Optional;",
"public class Test {",
" private void home() {",
" Optional<String> op = Optional.of(\"hello\");",
" op.flatMap(x -> Optional.of(op.orElseThrow()));",
" }",
"}")
.addOutputLines(
"Test.java",
"import java.util.Optional;",
"public class Test {",
" private void home() {",
" Optional<String> op = Optional.of(\"hello\");",
" op.flatMap(x -> Optional.of(x));",
" }",
"}")
.doTest();
}
}

0 comments on commit ba12995

Please sign in to comment.