diff options
author | sameb <sameb@google.com> | 2015-02-18 14:09:43 -0800 |
---|---|---|
committer | Sam Berlin <sameb@google.com> | 2015-02-24 18:28:17 -0500 |
commit | a36310535c69e68b25d74b49ee9f9442abebd954 (patch) | |
tree | fc3caaaf3e9a8209f7541b46cdc1590136d923d4 | |
parent | 0910c1e69ee2b0587f898cb292d4e9f8d9338e28 (diff) | |
download | guice-a36310535c69e68b25d74b49ee9f9442abebd954.tar.gz |
Fix https://github.com/google/guice/issues/904 -- assistedinject factory method
scanning did not ignore synthetic methods created by java8, leading to errors
when the factory interface extended from a superinterface that had generics.
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=86628771
-rw-r--r-- | extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java | 5 | ||||
-rw-r--r-- | extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProvider2Test.java | 36 |
2 files changed, 41 insertions, 0 deletions
diff --git a/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java b/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java index 6ec0cd4a..15b4220c 100644 --- a/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java +++ b/extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java @@ -218,6 +218,11 @@ final class FactoryProvider2 <F> implements InvocationHandler, ImmutableMap.Builder<Method, AssistData> assistDataBuilder = ImmutableMap.builder(); // TODO: also grab methods from superinterfaces for (Method method : factoryRawType.getMethods()) { + // Skip synthetic methods that java8 may have created. + if (method.isBridge() || method.isSynthetic()) { + continue; + } + TypeLiteral<?> returnTypeLiteral = factoryType.getReturnType(method); Key<?> returnType; try { diff --git a/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProvider2Test.java b/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProvider2Test.java index 8903042d..f58352bc 100644 --- a/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProvider2Test.java +++ b/extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProvider2Test.java @@ -1131,4 +1131,40 @@ public class FactoryProvider2Test extends TestCase { this.delegate = null; } } + + static abstract class AbstractAssisted { + interface Factory<T extends AbstractAssisted> { + T create(String string); + } + } + + static class ConcreteAssisted extends AbstractAssisted { + @Inject ConcreteAssisted(@SuppressWarnings("unused") @Assisted String string) {} + } + + static class ConcreteAssistedWithOverride extends AbstractAssisted { + @Inject ConcreteAssistedWithOverride(@SuppressWarnings("unused") @Assisted String string) {} + + interface Factory extends AbstractAssisted.Factory<ConcreteAssistedWithOverride> { + @Override ConcreteAssistedWithOverride create(String string); + } + } + + static class ConcreteAssistedWithoutOverride extends AbstractAssisted { + @Inject ConcreteAssistedWithoutOverride(@SuppressWarnings("unused") @Assisted String string) {} + interface Factory extends AbstractAssisted.Factory<ConcreteAssistedWithoutOverride> {} + } + + // See https://github.com/google/guice/issues/904 + public void testIgnoresSyntheticFactoryMethods() { + // Validate the injector can be successfully created. + Guice.createInjector(new AbstractModule() { + @Override protected void configure() { + install(new FactoryModuleBuilder().build(ConcreteAssistedWithOverride.Factory.class)); + install(new FactoryModuleBuilder().build(ConcreteAssistedWithoutOverride.Factory.class)); + install(new FactoryModuleBuilder().build( + new TypeLiteral<AbstractAssisted.Factory<ConcreteAssisted>>() {})); + } + }); + } } |