Skip to content

Commit

Permalink
Fix type inference issues with generated assisted factory in Java 7.
Browse files Browse the repository at this point in the history
To test this, I've updated our gradle use sourceCompatibility = VERSION_1_7.

Fixes #2309

RELNOTES=Fixes #2309: Fixes type inference issues with generated assisted factory in Java 7.
PiperOrigin-RevId: 354533035
  • Loading branch information
bcorso authored and Dagger Team committed Jan 29, 2021
1 parent 552f430 commit cda6e32
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 11 deletions.
11 changes: 8 additions & 3 deletions java/dagger/internal/codegen/AssistedFactoryProcessingStep.java
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,9 @@ public Element originatingElement(ProvisionBinding binding) {
public Optional<TypeSpec.Builder> write(ProvisionBinding binding) {
TypeElement factory = asType(binding.bindingElement().get());

ClassName name = nameGeneratedType(binding);
TypeSpec.Builder builder =
TypeSpec.classBuilder(nameGeneratedType(binding))
TypeSpec.classBuilder(name)
.addModifiers(PUBLIC, FINAL)
.addTypeVariables(
factory.getTypeParameters().stream()
Expand Down Expand Up @@ -357,9 +358,13 @@ public Optional<TypeSpec.Builder> write(ProvisionBinding binding) {
.collect(toImmutableList()))
.returns(providerOf(TypeName.get(factory.asType())))
.addStatement(
"return $T.create(new $T($N))",
"return $T.$Lcreate(new $T($N))",
INSTANCE_FACTORY,
nameGeneratedType(binding),
// Java 7 type inference requires the method call provide the exact type here.
sourceVersion.compareTo(SourceVersion.RELEASE_7) <= 0
? CodeBlock.of("<$T>", types.accessibleType(factoryType, name))
: CodeBlock.of(""),
name,
delegateFactoryParam)
.build());
return Optional.of(builder);
Expand Down
11 changes: 4 additions & 7 deletions javatests/artifacts/dagger/simple/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,14 @@ repositories {
mavenLocal()
}

sourceSets {
main {
java {
srcDir '.'
}
}
java {
// Make sure the generated source is compatible with Java 7.
sourceCompatibility = JavaVersion.VERSION_1_7
}

dependencies {
implementation 'com.google.dagger:dagger:LOCAL-SNAPSHOT'
annotationProcessor 'com.google.dagger:dagger-compiler:LOCAL-SNAPSHOT'
}

mainClassName = 'dagger.example.gradle.simple.SimpleApplication'
mainClassName = 'dagger.simple.SimpleApplication'
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright (C) 2021 The Dagger Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package dagger.simple;

import dagger.Component;
import dagger.assisted.Assisted;
import dagger.assisted.AssistedFactory;
import dagger.assisted.AssistedInject;
import javax.inject.Inject;

// This is a regression test for https://github.com/google/dagger/issues/2309
/** A simple, skeletal application that defines an assisted inject binding. */
public class AssistedInjects {
@Component
interface MyComponent {
FooFactory fooFactory();

ParameterizedFooFactory<Bar, String> parameterizedFooFactory();
}

static final class Bar {
@Inject
Bar() {}
}

static class Foo {
@AssistedInject
Foo(Bar bar, @Assisted String str) {}
}

@AssistedFactory
interface FooFactory {
Foo create(String str);
}

static class ParameterizedFoo<T1, T2> {
@AssistedInject
ParameterizedFoo(T1 t1, @Assisted T2 t2) {}
}

@AssistedFactory
interface ParameterizedFooFactory<T1, T2> {
ParameterizedFoo<T1, T2> create(T2 t2);
}

public static void main(String[] args) {
Foo foo = DaggerAssistedInjects_MyComponent.create().fooFactory().create("");

ParameterizedFoo<Bar, String> parameterizedFoo =
DaggerAssistedInjects_MyComponent.create().parameterizedFooFactory().create("");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* limitations under the License.
*/

package dagger.example.gradle.simple;
package dagger.simple;

import dagger.Component;
import dagger.Module;
Expand Down

0 comments on commit cda6e32

Please sign in to comment.