From d5bec8f6e67f4bb478ffd74835dba4fa9ca76d26 Mon Sep 17 00:00:00 2001 From: Andy Boothe Date: Tue, 14 Jan 2025 17:27:47 -0600 Subject: [PATCH] fix issue where Lazy and Provider were not working properly --- .../assumptions/dagger/BoxingDaggerTest.java | 50 ++++++++++++++++++- .../core/DaggerComponentAnalyzer.java | 7 +-- ...onmentVariableProcessorConversionTest.java | 12 ++++- ...SystemPropertyProcessorConversionTest.java | 14 +++++- 4 files changed, 76 insertions(+), 7 deletions(-) diff --git a/rapier-assumptions-tests/src/test/java/rapier/assumptions/dagger/BoxingDaggerTest.java b/rapier-assumptions-tests/src/test/java/rapier/assumptions/dagger/BoxingDaggerTest.java index 058cf93..7608fd4 100644 --- a/rapier-assumptions-tests/src/test/java/rapier/assumptions/dagger/BoxingDaggerTest.java +++ b/rapier-assumptions-tests/src/test/java/rapier/assumptions/dagger/BoxingDaggerTest.java @@ -19,6 +19,7 @@ */ package rapier.assumptions.dagger; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrowsExactly; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.IOException; @@ -65,7 +66,7 @@ public Integer provideInteger() { final String errors = compileSourceCode(componentSourceCode, moduleSourceCode); assertTrue(errors.isBlank(), "Expected no errors, but errors were found."); - + // TODO After we refactor DaggerTestBase, verify no warnings here } @@ -189,4 +190,51 @@ public static void main(String[] args) { assertThrowsExactly(NullPointerException.class, () -> compileAndRunSourceCode(componentSourceCode, moduleSourceCode, appSourceCode)); } + + + /** + * Verify that Dagger will satisfy a primitve dependency with a binding of its boxed equivalent + */ + @Test + public void givenIntDependencyAndIntegerBinding_whenCompileAndRun_thenNullError() + throws IOException { + final String componentSourceCode = """ + import dagger.Component; + import javax.inject.Provider; + import javax.annotation.Nullable; + + @Component(modules={ExampleModule.class}) + public interface ExampleComponent { + public int provisionInt(); + } + """; + + final String moduleSourceCode = """ + import dagger.Module; + import dagger.Provides; + import javax.annotation.Nullable; + + @Module + public class ExampleModule { + @Provides + public Integer provideInteger() { + return 123; + } + } + """; + + final String appSourceCode = """ + public class ExampleApp { + public static void main(String[] args) { + ExampleComponent c = DaggerExampleComponent.builder().build(); + System.out.println(c.provisionInt()); + } + } + """; + + final String output = + compileAndRunSourceCode(componentSourceCode, moduleSourceCode, appSourceCode).trim(); + + assertEquals(output, "123"); + } } diff --git a/rapier-compiler-core/src/main/java/rapier/compiler/core/DaggerComponentAnalyzer.java b/rapier-compiler-core/src/main/java/rapier/compiler/core/DaggerComponentAnalyzer.java index 624212c..95d9d13 100644 --- a/rapier-compiler-core/src/main/java/rapier/compiler/core/DaggerComponentAnalyzer.java +++ b/rapier-compiler-core/src/main/java/rapier/compiler/core/DaggerComponentAnalyzer.java @@ -294,10 +294,11 @@ private Optional newInjectionSite(DaggerInjectionSiteType s final TypeMirror provisionedErasure = getTypes().erasure(provisionedType); final TypeMirror literalJavaxInjectProviderType = - getElements().getTypeElement("javax.inject.Provider").asType(); + getTypes().erasure(getElements().getTypeElement("javax.inject.Provider").asType()); final TypeMirror literalJakaInjectProviderType = - getElements().getTypeElement("jakarta.inject.Provider").asType(); - final TypeMirror literalDaggerLazyType = getElements().getTypeElement("dagger.Lazy").asType(); + getTypes().erasure(getElements().getTypeElement("jakarta.inject.Provider").asType()); + final TypeMirror literalDaggerLazyType = + getTypes().erasure(getElements().getTypeElement("dagger.Lazy").asType()); final TypeMirror literalJavaUtilOptionalType = getElements().getTypeElement("java.util.Optional").asType(); diff --git a/rapier-environment-variable-compiler/src/test/java/rapier/envvar/compiler/EnvironmentVariableProcessorConversionTest.java b/rapier-environment-variable-compiler/src/test/java/rapier/envvar/compiler/EnvironmentVariableProcessorConversionTest.java index 89daba3..6d52c18 100644 --- a/rapier-environment-variable-compiler/src/test/java/rapier/envvar/compiler/EnvironmentVariableProcessorConversionTest.java +++ b/rapier-environment-variable-compiler/src/test/java/rapier/envvar/compiler/EnvironmentVariableProcessorConversionTest.java @@ -103,6 +103,12 @@ public interface ExampleComponent { @rapier.envvar.EnvironmentVariable("BOOLEAN") public boolean provisionBooleanAsBoolean(); + + @rapier.envvar.EnvironmentVariable("STRING") + public dagger.Lazy provisionLazyOfString(); + + @rapier.envvar.EnvironmentVariable("STRING") + public javax.inject.Provider provisionProviderOfString(); } """); @@ -198,6 +204,8 @@ public static void main(String[] args) { System.out.println(component.provisionStringAsSingleArgumentConstructorExample()); System.out.println(component.provisionBooleanAsBoxedBoolean()); System.out.println(component.provisionBooleanAsBoolean()); + System.out.println(component.provisionLazyOfString().get()); + System.out.println(component.provisionProviderOfString().get()); } } """); @@ -231,7 +239,9 @@ public static void main(String[] args) { ValueOfExample [s=xyz] SingleArgumentConstructorExample [s=xyz] true - true""", output); + true + xyz + xyz""", output); } /** diff --git a/rapier-system-property-compiler/src/test/java/rapier/sysprop/compiler/SystemPropertyProcessorConversionTest.java b/rapier-system-property-compiler/src/test/java/rapier/sysprop/compiler/SystemPropertyProcessorConversionTest.java index 2b2dc34..bc894b8 100644 --- a/rapier-system-property-compiler/src/test/java/rapier/sysprop/compiler/SystemPropertyProcessorConversionTest.java +++ b/rapier-system-property-compiler/src/test/java/rapier/sysprop/compiler/SystemPropertyProcessorConversionTest.java @@ -40,7 +40,7 @@ public class SystemPropertyProcessorConversionTest extends RapierTestBase { public void test() throws IOException { final JavaFileObject componentSource = prepareSourceFile(""" package com.example; - + @dagger.Component(modules = {RapierExampleComponentSystemPropertyModule.class}) public interface ExampleComponent { @rapier.sysprop.SystemProperty("INT") @@ -103,6 +103,12 @@ public interface ExampleComponent { @rapier.sysprop.SystemProperty("BOOLEAN") public boolean provisionBooleanAsBoolean(); + + @rapier.sysprop.SystemProperty("STRING") + public dagger.Lazy provisionLazyOfString(); + + @rapier.sysprop.SystemProperty("STRING") + public javax.inject.Provider provisionProviderOfString(); } """); @@ -198,6 +204,8 @@ public static void main(String[] args) { System.out.println(component.provisionStringAsSingleArgumentConstructorExample()); System.out.println(component.provisionBooleanAsBoxedBoolean()); System.out.println(component.provisionBooleanAsBoolean()); + System.out.println(component.provisionLazyOfString().get()); + System.out.println(component.provisionProviderOfString().get()); } } """); @@ -231,7 +239,9 @@ public static void main(String[] args) { ValueOfExample [s=xyz] SingleArgumentConstructorExample [s=xyz] true - true""", output); + true + xyz + xyz""", output); } /**