FutureReturnValueIgnored: check the return type before searching super methods

For every call whose return value is unused, MATCHER checked for
@CanIgnoreReturnValue on the method, searched all supertypes for
overridden methods annotated with @CanIgnoreReturnValue, and ran the
IGNORED_METHODS matchers before checking whether the method returns a
Future at all. Most methods don't, so checking the return type first
avoids computing the supertype closure and scanning member scopes for
nearly all calls.

The matcher is a conjunction of predicates that don't depend on each
other and have no side effects other than completing symbols, so
reordering them doesn't change its result. getSymbol() having returned a
MethodSymbol is the only precondition the return type check needs, and
it already handles void, type variables and error types on its own.
(On an incomplete classpath, non-Future calls no longer complete the
supertypes of the method's owner, while calls exempted by the earlier
predicates now walk the supertypes of their return type, which
checkLostType() already does for the result type of method invocations.)

PiperOrigin-RevId: 1018394858
1 file changed
tree: bfa4c9d54498cb3510dd06a920f3336125c38fcf
  1. .github/
  2. .idea/
  3. annotation/
  4. annotations/
  5. check_api/
  6. core/
  7. docgen/
  8. docgen_processor/
  9. docs/
  10. examples/
  11. refaster/
  12. test_helpers/
  13. type_annotations/
  14. util/
  15. .gitattributes
  16. .gitignore
  17. appveyor.yml
  18. AUTHORS
  19. bnd.bnd
  20. CONTRIBUTING.md
  21. COPYING
  22. KEYS.txt
  23. pom.xml
  24. README.md
README.md

Error Prone

Error Prone is a static analysis tool for Java that catches common programming mistakes at compile-time.

public class ShortSet {
  public static void main (String[] args) {
    Set<Short> s = new HashSet<>();
    for (short i = 0; i < 100; i++) {
      s.add(i);
      s.remove(i - 1);
    }
    System.out.println(s.size());
  }
}
error: [CollectionIncompatibleType] Argument 'i - 1' should not be passed to this method;
its type int is not compatible with its collection's type argument Short
      s.remove(i - 1);
              ^
    (see https://errorprone.info/bugpattern/CollectionIncompatibleType)
1 error

Getting Started

Our documentation is at errorprone.info.

Error Prone works with Bazel, Maven, Ant, and Gradle. See our installation instructions for details.

Developing Error Prone

Developing and building Error Prone is documented on the wiki.

Links