aboutsummaryrefslogtreecommitdiff
path: root/extensions
diff options
context:
space:
mode:
authorsameb <sameb@google.com>2015-02-18 14:09:43 -0800
committerSam Berlin <sameb@google.com>2015-02-24 18:28:17 -0500
commita36310535c69e68b25d74b49ee9f9442abebd954 (patch)
treefc3caaaf3e9a8209f7541b46cdc1590136d923d4 /extensions
parent0910c1e69ee2b0587f898cb292d4e9f8d9338e28 (diff)
downloadguice-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
Diffstat (limited to 'extensions')
-rw-r--r--extensions/assistedinject/src/com/google/inject/assistedinject/FactoryProvider2.java5
-rw-r--r--extensions/assistedinject/test/com/google/inject/assistedinject/FactoryProvider2Test.java36
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>>() {}));
+ }
+ });
+ }
}