google / google/error-prone

False positives for ProvidesMethodOutsideOfModule bug pattern

Open
#3,873 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
7.2k
Forks
820
Avg merge
5h 9m
Merged PRs (30d)
50

Description

In Gerrit build we are seeing many false positives for ProvidesMethodOutsideOfModule bug pattern.

For example, we have changed from single injection to multiple injections in this CL: [1]

```diff
diff --git a/java/com/google/gerrit/server/update/SuperprojectUpdateSubmissionListener.java b/java/com/google/gerrit/server/update/SuperprojectUpdateSubmissionListener.java
index dffdff0e7f..4c65c80ad8 100644
--- a/java/com/google/gerrit/server/update/SuperprojectUpdateSubmissionListener.java
+++ b/java/com/google/gerrit/server/update/SuperprojectUpdateSubmissionListener.java
@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.server.submit.MergeOpRepoManager;
import com.google.gerrit.server.submit.SubmoduleOp;
import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
@@ -39,11 +40,11 @@ public class SuperprojectUpdateSubmissionListener implements SubmissionListener
private boolean dryrun;

public static class Module extends AbstractModule {
- @Override
- protected void configure() {
- bind(SubmissionListener.class)
- .annotatedWith(SuperprojectUpdateOnSubmission.class)
- .to(SuperprojectUpdateSubmissionListener.class);
+ @Provides
+ @SuperprojectUpdateOnSubmission
+ ImmutableList provideSubmissionListeners(
+ SuperprojectUpdateSubmissionListener listener) {
+ return ImmutableList.of(listener);
}
}
```

After the above change we are starting to see this error (that we demoted to warning severity):

```bash
java/com/google/gerrit/server/update/SuperprojectUpdateSubmissionListener.java:43: warning: [ProvidesMethodOutsideOfModule] @Provides methods need to be declared in a Module to have any effect.
@Provides
^
(see https://errorprone.info/bugpattern/ProvidesMethodOutsideOfModule)
Did you mean to remove this line?
Target //java/com/google/gerrit/server:server up-to-date:
bazel-bin/java/com/google/gerrit/server/libserver.jar
INFO: Elapsed time: 43.147s, Critical Path: 42.88s
INFO: 4 processes: 1 internal, 2 linux-sandbox, 1 worker.
INFO: Build completed successfully, 4 total actions
```

Another example of occurrence of this false positive:

```bash
java/com/google/gerrit/server/ssh/SshAddressesModule.java:40: warning: [ProvidesMethodOutsideOfModule] @Provides methods need to be declared in a Module to have any effect.
@Provides
^
(see https://errorprone.info/bugpattern/ProvidesMethodOutsideOfModule)
Did you mean to remove this line?
java/com/google/gerrit/server/ssh/SshAddressesModule.java:71: warning: [ProvidesMethodOutsideOfModule] @Provides methods need to be declared in a Module to have any effect.
@Provides
^
(see https://errorprone.info/bugpattern/ProvidesMethodOutsideOfModule)
Did you mean to remove this line?
```

The above error is reported for this code: [2] and the code works and looks just fine to me.

Gerrit Code Review is using Bazel 6.1.2 with latest java_tools v12.1 that is shipping ErrorProne 2.18.

To reproduce, clone [Gerrit](https://gerrit.googlesource.com/gerrit) recursively and run: `bazel build java/com/google/gerrit/server:server`.

[1] https://gerrit-review.googlesource.com/c/gerrit/+/284097
[2] https://gerrit.googlesource.com/gerrit/+/refs/heads/master/java/com/google/gerrit/server/ssh/SshAddressesModule.java#40

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.