Skip to content

Commit

Permalink
Merge pull request square#342 from cgruber/orphananalysisovercompensates
Browse files Browse the repository at this point in the history
Fix over-eager orphan analysis
  • Loading branch information
cgruber committed Nov 12, 2013
2 parents 8d4126b + c30813c commit 80daa62
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,13 @@ private Map<String, Binding<?>> processCompleteModule(TypeElement rootModule,
Map<String, Binding<?>> addTo = overrides ? overrideBindings : baseBindings;

// Gather the injectable types from the annotation.
Set<String> injectsProvisionKeys = new LinkedHashSet<String>();
for (Object injectableTypeObject : (Object[]) annotation.get("injects")) {
TypeMirror injectableType = (TypeMirror) injectableTypeObject;
String providerKey = GeneratorKeys.get(injectableType);
injectsProvisionKeys.add(providerKey);
String key = isInterface(injectableType)
? GeneratorKeys.get(injectableType)
? providerKey
: GeneratorKeys.rawMembersKey(injectableType);
linker.requestBinding(key, module.getQualifiedName().toString(),
getClass().getClassLoader(), false, true);
Expand Down Expand Up @@ -216,6 +219,9 @@ private Map<String, Binding<?>> processCompleteModule(TypeElement rootModule,

switch (provides.type()) {
case UNIQUE:
if (injectsProvisionKeys.contains(binding.provideKey)) {
binding.setDependedOn(true);
}
addTo.put(key, binding);
break;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@

import com.google.common.base.Joiner;
import com.google.testing.compile.JavaFileObjects;
import java.util.Arrays;
import javax.tools.JavaFileObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
import static dagger.tests.integration.ProcessorTestUtils.daggerProcessors;
import static org.truth0.Truth.ASSERT;

Expand All @@ -32,7 +34,6 @@ public final class LibraryModuleTest {
@Test public void unusedProviderMethodsPassOnLibrary() {
JavaFileObject source = JavaFileObjects.forSourceString("Library", Joiner.on("\n").join(
"import dagger.Module;",
"import dagger.ObjectGraph;",
"import dagger.Provides;",
"import java.lang.Override;",
"@Module(library = true)",
Expand All @@ -48,7 +49,6 @@ public final class LibraryModuleTest {
@Test public void unusedProviderMethodsFailOnNonLibrary() {
JavaFileObject source = JavaFileObjects.forSourceString("Library", Joiner.on("\n").join(
"import dagger.Module;",
"import dagger.ObjectGraph;",
"import dagger.Provides;",
"import java.lang.Override;",
"@Module(library = false)",
Expand All @@ -58,9 +58,44 @@ public final class LibraryModuleTest {
" }",
"}"));
ASSERT.about(javaSource()).that(source).processedWith(daggerProcessors()).failsToCompile()
.withErrorContaining("Graph validation failed:").in(source).onLine(6).and()
.withErrorContaining("You have these unused @Provider methods:").in(source).onLine(6).and()
.withErrorContaining("1. TestModule.string()").in(source).onLine(6).and()
.withErrorContaining("Set library=true in your module").in(source).onLine(6);
.withErrorContaining("Graph validation failed:").in(source).onLine(5).and()
.withErrorContaining("You have these unused @Provider methods:").in(source).onLine(5).and()
.withErrorContaining("1. TestModule.string()").in(source).onLine(5).and()
.withErrorContaining("Set library=true in your module").in(source).onLine(5);
}

@Test public void injectsOfInterfaceMakesProvidesBindingNotAnOrphan() {
JavaFileObject foo = JavaFileObjects.forSourceString("Foo", "interface Foo {}");
JavaFileObject module = JavaFileObjects.forSourceString("TestModule", Joiner.on("\n").join(
"import dagger.Module;",
"import dagger.Provides;",
"import javax.inject.Singleton;",
"@Module(injects = Foo.class, library = false)",
"class TestModule {",
" @Singleton @Provides Foo provideFoo() {",
" return new Foo() {};",
" }",
"}"));
ASSERT.about(javaSources()).that(Arrays.asList(foo, module))
.processedWith(daggerProcessors())
.compilesWithoutError();
}

@Test public void injectsOfClassMakesProvidesBindingNotAnOrphan() {
JavaFileObject foo = JavaFileObjects.forSourceString("Foo", "class Foo {}");
JavaFileObject module = JavaFileObjects.forSourceString("TestModule", Joiner.on("\n").join(
"import dagger.Module;",
"import dagger.Provides;",
"import javax.inject.Singleton;",
"@Module(injects = Foo.class, library = false)",
"class TestModule {",
" @Singleton @Provides Foo provideFoo() {",
" return new Foo() {};",
" }",
"}"));
ASSERT.about(javaSources()).that(Arrays.asList(foo, module))
.processedWith(daggerProcessors())
.compilesWithoutError();
}

}

0 comments on commit 80daa62

Please sign in to comment.