From a36310535c69e68b25d74b49ee9f9442abebd954 Mon Sep 17 00:00:00 2001 From: sameb Date: Wed, 18 Feb 2015 14:09:43 -0800 Subject: 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 --- .../inject/assistedinject/FactoryProvider2.java | 5 +++ .../assistedinject/FactoryProvider2Test.java | 36 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) 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 implements InvocationHandler, ImmutableMap.Builder 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 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 { + @Override ConcreteAssistedWithOverride create(String string); + } + } + + static class ConcreteAssistedWithoutOverride extends AbstractAssisted { + @Inject ConcreteAssistedWithoutOverride(@SuppressWarnings("unused") @Assisted String string) {} + interface Factory extends AbstractAssisted.Factory {} + } + + // 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>() {})); + } + }); + } } -- cgit v1.2.3