diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/Handlers.java b/nullaway/src/main/java/com/uber/nullaway/handlers/Handlers.java
index 8f709c066e..22792ddd5f 100644
--- a/nullaway/src/main/java/com/uber/nullaway/handlers/Handlers.java
+++ b/nullaway/src/main/java/com/uber/nullaway/handlers/Handlers.java
@@ -61,7 +61,9 @@ public static Handler buildDefault(Config config) {
handlerListBuilder.add(libraryModelsHandler);
handlerListBuilder.add(StreamNullabilityPropagatorFactory.getRxStreamNullabilityPropagator());
handlerListBuilder.add(StreamNullabilityPropagatorFactory.getJavaStreamNullabilityPropagator());
- handlerListBuilder.add(libraryModelsHandler.getStreamNullabilityPropagatorFromModels());
+ handlerListBuilder.add(
+ StreamNullabilityPropagatorFactory.fromSpecs(
+ libraryModelsHandler.getStreamNullabilitySpecs()));
handlerListBuilder.add(new ContractHandler(config));
handlerListBuilder.add(new ApacheThriftIsSetHandler());
handlerListBuilder.add(new GrpcHandler());
diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java b/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java
index b18c19753a..e000c4fdcf 100644
--- a/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java
+++ b/nullaway/src/main/java/com/uber/nullaway/handlers/LibraryModelsHandler.java
@@ -294,18 +294,22 @@ private void setUnconditionalArgumentNullness(
}
/**
- * Generate a StreamNullabilityPropagator handler based on all the stream specifications loaded
- * from any of our library models.
+ * Get all the stream specifications loaded from any of our library models.
*
- *
This handler must be registered in Handlers.java separatedly from the LibraryModelsHandler
- * itself.
+ *
This is used in Handlers.java to create a StreamNullabilityPropagator handler, which gets
+ * registered independently of this LibraryModelsHandler itself.
+ *
+ *
LibraryModelsHandler is responsible from reading the library models for stream specs, but
+ * beyond that, checking of the specs falls under the responsibility of the generated
+ * StreamNullabilityPropagator handler.
+ *
+ * @return The list of all stream specifications loaded from any of our library models.
*/
- public StreamNullabilityPropagator getStreamNullabilityPropagatorFromModels() {
+ public ImmutableList getStreamNullabilitySpecs() {
// Note: Currently, OptimizedLibraryModels doesn't carry the information about stream type
- // records,
- // it is not clear what it means to "optimize" lookup for those and they get access only once:
- // here.
- return new StreamNullabilityPropagator(libraryModels.customStreamNullabilitySpecs());
+ // records, it is not clear what it means to "optimize" lookup for those and they get accessed
+ // only once by calling this method during handler setup in Handlers.java.
+ return libraryModels.customStreamNullabilitySpecs();
}
private static LibraryModels loadLibraryModels(Config config) {
diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/StreamNullabilityPropagatorFactory.java b/nullaway/src/main/java/com/uber/nullaway/handlers/StreamNullabilityPropagatorFactory.java
index 0642296b8e..a3695c67ee 100644
--- a/nullaway/src/main/java/com/uber/nullaway/handlers/StreamNullabilityPropagatorFactory.java
+++ b/nullaway/src/main/java/com/uber/nullaway/handlers/StreamNullabilityPropagatorFactory.java
@@ -29,6 +29,8 @@
import com.uber.nullaway.handlers.stream.StreamTypeRecord;
public class StreamNullabilityPropagatorFactory {
+
+ /** Returns a handler for the standard Java 8 stream APIs. */
public static StreamNullabilityPropagator getJavaStreamNullabilityPropagator() {
ImmutableList streamModels =
StreamModelBuilder.start()
@@ -78,6 +80,7 @@ public static StreamNullabilityPropagator getJavaStreamNullabilityPropagator() {
return new StreamNullabilityPropagator(streamModels);
}
+ /** Returns a handler for io.reactivex.* stream APIs */
public static StreamNullabilityPropagator getRxStreamNullabilityPropagator() {
ImmutableList rxModels =
StreamModelBuilder.start()
@@ -137,4 +140,19 @@ public static StreamNullabilityPropagator getRxStreamNullabilityPropagator() {
return new StreamNullabilityPropagator(rxModels);
}
+
+ /**
+ * Create a new StreamNullabilityPropagator from a list of StreamTypeRecord specs.
+ *
+ * This is used to create a new StreamNullabilityPropagator based on stream API specs provided
+ * by library models.
+ *
+ * @param streamNullabilitySpecs the list of StreamTypeRecord objects defining one or more stream
+ * APIs (from {@link StreamModelBuilder}).
+ * @return A handler corresponding to the stream APIs defined by the given specs.
+ */
+ public static StreamNullabilityPropagator fromSpecs(
+ ImmutableList streamNullabilitySpecs) {
+ return new StreamNullabilityPropagator(streamNullabilitySpecs);
+ }
}
diff --git a/nullaway/src/main/java/com/uber/nullaway/handlers/stream/StreamModelBuilder.java b/nullaway/src/main/java/com/uber/nullaway/handlers/stream/StreamModelBuilder.java
index d46ec50627..94e0b1a6e8 100644
--- a/nullaway/src/main/java/com/uber/nullaway/handlers/stream/StreamModelBuilder.java
+++ b/nullaway/src/main/java/com/uber/nullaway/handlers/stream/StreamModelBuilder.java
@@ -92,6 +92,12 @@ public StreamModelBuilder addStreamType(TypePredicate tp) {
return this;
}
+ /**
+ * Add a stream type to our models based on the type's fully qualified name.
+ *
+ * @param fullyQualifiedName the FQN of the class/interface in our stream-based API.
+ * @return This builder (for chaining).
+ */
public StreamModelBuilder addStreamTypeFromName(String fullyQualifiedName) {
return this.addStreamType(new DescendantOf(Suppliers.typeFromString(fullyQualifiedName)));
}