diff options
author | Eric Chang <erichang@google.com> | 2023-12-14 12:12:56 -0800 |
---|---|---|
committer | Dagger Team <dagger-dev+copybara@google.com> | 2023-12-14 12:15:38 -0800 |
commit | 13d64c6ba2fb8c887cd924fe1a0cdeb90ea83779 (patch) | |
tree | 1a219274b0d9b7dcd99eb1a45e156068494fb081 | |
parent | 5f8b76c146989b56a679d89df9f71afe29e31663 (diff) | |
download | dagger2-13d64c6ba2fb8c887cd924fe1a0cdeb90ea83779.tar.gz |
Internal changes
RELNOTES=n/a
PiperOrigin-RevId: 591015561
4 files changed, 75 insertions, 14 deletions
diff --git a/java/dagger/internal/codegen/binding/Nullability.java b/java/dagger/internal/codegen/binding/Nullability.java index e916e1681..4231a8fb0 100644 --- a/java/dagger/internal/codegen/binding/Nullability.java +++ b/java/dagger/internal/codegen/binding/Nullability.java @@ -55,13 +55,16 @@ public abstract class Nullability { } private static ImmutableSet<ClassName> getNullableAnnotations(XElement element) { - return getNullableAnnotations(element.getAllAnnotations().stream()); + return getNullableAnnotations(element.getAllAnnotations().stream(), ImmutableSet.of()); } - private static ImmutableSet<ClassName> getNullableAnnotations(Stream<XAnnotation> annotations) { + private static ImmutableSet<ClassName> getNullableAnnotations( + Stream<XAnnotation> annotations, + ImmutableSet<ClassName> filterSet) { return annotations .map(XAnnotations::getClassName) .filter(annotation -> annotation.simpleName().contentEquals("Nullable")) + .filter(annotation -> !filterSet.contains(annotation)) .collect(toImmutableSet()); } diff --git a/java/dagger/internal/codegen/writing/FactoryGenerator.java b/java/dagger/internal/codegen/writing/FactoryGenerator.java index 9fba7cd09..32195ba6a 100644 --- a/java/dagger/internal/codegen/writing/FactoryGenerator.java +++ b/java/dagger/internal/codegen/writing/FactoryGenerator.java @@ -248,7 +248,6 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding MethodSpec.Builder getMethod = methodBuilder("get") .addModifiers(PUBLIC) - .returns(providedTypeName) .addParameters(assistedParameters.values()); if (factoryTypeName(binding).isPresent()) { @@ -270,10 +269,12 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding .nullability() .nullableAnnotations() .forEach(getMethod::addAnnotation); + getMethod.returns(providedTypeName); getMethod.addStatement("return $L", invokeNewInstance); } else if (!binding.injectionSites().isEmpty()) { CodeBlock instance = CodeBlock.of("instance"); getMethod + .returns(providedTypeName) .addStatement("$T $L = $L", providedTypeName, instance, invokeNewInstance) .addCode( InjectionSiteMethod.invokeAll( @@ -283,8 +284,11 @@ public final class FactoryGenerator extends SourceFileGenerator<ProvisionBinding binding.key().type().xprocessing(), sourceFiles.frameworkFieldUsages(binding.dependencies(), frameworkFields)::get)) .addStatement("return $L", instance); + } else { - getMethod.addStatement("return $L", invokeNewInstance); + getMethod + .returns(providedTypeName) + .addStatement("return $L", invokeNewInstance); } return getMethod.build(); } diff --git a/java/dagger/internal/codegen/writing/InjectionMethods.java b/java/dagger/internal/codegen/writing/InjectionMethods.java index f4752f2c6..39c03dd7f 100644 --- a/java/dagger/internal/codegen/writing/InjectionMethods.java +++ b/java/dagger/internal/codegen/writing/InjectionMethods.java @@ -405,7 +405,8 @@ final class InjectionMethods { if (isVoid(method.getReturnType())) { return builder.addStatement("$L", invocation).build(); } else { - Nullability.of(method) + Nullability nullability = Nullability.of(method); + nullability .nullableAnnotations() .forEach(builder::addAnnotation); return builder diff --git a/javatests/dagger/functional/nullables/JspecifyNullableTest.java b/javatests/dagger/functional/nullables/JspecifyNullableTest.java index 63b4a9ae4..b5d42f3b7 100644 --- a/javatests/dagger/functional/nullables/JspecifyNullableTest.java +++ b/javatests/dagger/functional/nullables/JspecifyNullableTest.java @@ -22,6 +22,7 @@ import static org.junit.Assert.assertThrows; import dagger.Component; import dagger.Module; import dagger.Provides; +import javax.inject.Provider; import org.jspecify.annotations.Nullable; import org.junit.Test; import org.junit.runner.RunWith; @@ -29,40 +30,92 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public final class JspecifyNullableTest { - @Component(modules = MyModule.class) + @Component(modules = MyModule.class, dependencies = ComponentDependency.class) interface MyComponent { Integer getInt(); + InnerType getInnerType(); + Provider<Dependency> getDependencyProvider(); } + interface Dependency {} + + interface InnerType {} + @Module static class MyModule { - private final Integer value; + private final Integer integer; + private final InnerType innerType; - MyModule(Integer value) { - this.value = value; + MyModule(Integer integer, InnerType innerType) { + this.integer = integer; + this.innerType = innerType; } @Provides @Nullable Integer provideInt() { - return value; + return integer; + } + + @Provides + @Nullable InnerType provideInnerType() { + return innerType; + } + } + + @Component(modules = DependencyModule.class) + interface ComponentDependency { + @Nullable Dependency dependency(); + } + + @Module + static class DependencyModule { + private final Dependency dependency; + + DependencyModule(Dependency dependency) { + this.dependency = dependency; + } + + @Provides + @Nullable Dependency provideDependency() { + return dependency; } } @Test public void testWithValue() { - MyComponent component = - DaggerJspecifyNullableTest_MyComponent.builder().myModule(new MyModule(15)).build(); + MyComponent component = DaggerJspecifyNullableTest_MyComponent.builder() + .myModule(new MyModule(15, new InnerType() {})) + .componentDependency( + DaggerJspecifyNullableTest_ComponentDependency.builder() + .dependencyModule(new DependencyModule(new Dependency() {})).build()) + .build(); assertThat(component.getInt()).isEqualTo(15); + assertThat(component.getInnerType()).isNotNull(); + assertThat(component.getDependencyProvider().get()).isNotNull(); } @Test public void testWithNull() { - MyComponent component = - DaggerJspecifyNullableTest_MyComponent.builder().myModule(new MyModule(null)).build(); + MyComponent component = DaggerJspecifyNullableTest_MyComponent.builder() + .myModule(new MyModule(null, null)) + .componentDependency( + DaggerJspecifyNullableTest_ComponentDependency.builder() + .dependencyModule(new DependencyModule(null)).build()) + .build(); NullPointerException expectedException = assertThrows(NullPointerException.class, component::getInt); assertThat(expectedException) .hasMessageThat() .contains("Cannot return null from a non-@Nullable @Provides method"); + NullPointerException expectedException2 = + assertThrows(NullPointerException.class, component::getInnerType); + assertThat(expectedException2) + .hasMessageThat() + .contains("Cannot return null from a non-@Nullable @Provides method"); + NullPointerException expectedException3 = + assertThrows(NullPointerException.class, () -> component.getDependencyProvider().get()); + assertThat(expectedException3) + .hasMessageThat() + .contains("Cannot return null from a non-@Nullable @Provides method"); } } |