Skip to content

Commit 8ccc0cb

Browse files
authored
Merge pull request square#484 from google/moe_sync_10/27/2016
Moe sync 10/27/2016
2 parents 666a546 + 4b0e237 commit 8ccc0cb

File tree

54 files changed

+1988
-1528
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1988
-1528
lines changed

compiler/src/it/functional-tests/src/main/java/test/ParentModule.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,4 @@ abstract class ParentModule<A extends Number & Comparable<A>, B, C extends Itera
2525
static List<Set<String>> provideStaticGenericTypeWithNoTypeParametersInParameterizedModule() {
2626
return new ArrayList<>();
2727
}
28-
2928
}

compiler/src/it/functional-tests/src/main/java/test/cycle/Cycles.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,15 @@
3030

3131
/**
3232
* Cycle classes used for testing cyclic dependencies.
33-
* A <- (E <- D <- B <- C <- Provider<A>, Lazy<A>), (B <- C <- Provider<A>, Lazy<A>)
34-
* S <- Provider<S>, Lazy<S>
33+
*
34+
* <pre>
35+
* {@literal A ← (E ← D ← B ← C ← Provider<A>, Lazy<A>), (B ← C ← Provider<A>, Lazy<A>)}
36+
* {@literal S ← Provider<S>, Lazy<S>}
37+
* </pre>
3538
*
3639
* @author Tony Bentancur
3740
* @since 2.0
3841
*/
39-
4042
final class Cycles {
4143
private Cycles() {}
4244

compiler/src/it/functional-tests/src/test/java/test/GenericTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,5 @@ public class GenericTest {
144144
GenericComponent component = DaggerGenericComponent.create();
145145
assertThat(component.iterableInt()).containsExactly(1, 2).inOrder();
146146
assertThat(component.iterableDouble()).containsExactly(3d, 4d).inOrder();
147-
148147
}
149148
}

compiler/src/it/guava-functional-tests/src/main/java/test/optional/OptionalBindingComponents.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,7 @@
3131
import javax.inject.Provider;
3232
import javax.inject.Qualifier;
3333

34-
/**
35-
* Classes to support {@link OptionalBindingComponentsPresentTest}, {@link
36-
* OptionalBindingComponentsAbsentTest} and {@link
37-
* test.optional.a.OptionalBindingComponentsWithInaccessibleTypesTest}.
38-
*/
34+
/** Classes to support testing {@code BindsOptionalOf} functionality. */
3935
public final class OptionalBindingComponents {
4036

4137
/** A qualifier. */

compiler/src/it/producers-functional-tests/src/main/java/producerstest/binds/FooOfStrings.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@
1717
package producerstest.binds;
1818

1919
/**
20-
* This is not marked with {@link javax.inject.Inject @Inject} (like the {@link dagger.Provides
21-
* @Provides} version in {@link test.bind.FooOfStrings}), to test that {@link dagger.Binds @Binds}
22-
* properly translate to {@link dagger.internal.codegen.ProductionBinding}s when the right-hand-side
23-
* of the method is also a production binding. We force this by adding a {@link
24-
* dagger.producers.Produces @Produces} method to add it to the graph instead of relying on the
25-
* {@link dagger.internal.codegen.ProvisionBinding} that would be created by default with an {@code
26-
* @Inject} constructor.
20+
* This is not marked with {@link javax.inject.Inject @Inject} in order to test that {@link
21+
* dagger.Binds @Binds} properly translate to {@link dagger.internal.codegen.ProductionBinding}s
22+
* when the right-hand-side of the method is also a production binding. We force this by adding a
23+
* {@link dagger.producers.Produces @Produces} method to add it to the graph instead of relying on
24+
* the {@link dagger.internal.codegen.ProvisionBinding} that would be created by default with an
25+
* {@code @Inject} constructor.
2726
*/
2827
final class FooOfStrings implements Foo<String> {}

compiler/src/it/producers-functional-tests/src/main/java/producerstest/optional/OptionalBindingComponents.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,10 @@
3434
import java.lang.annotation.Retention;
3535
import java.util.concurrent.Executor;
3636
import java.util.concurrent.Executors;
37+
import javax.inject.Provider;
3738
import javax.inject.Qualifier;
3839

39-
/**
40-
* Classes to support {@link OptionalBindingComponentsAbsentTest} and {@link
41-
* OptionalBindingComponentsPresentTest}.
42-
*/
40+
/** Classes to support testing {@code BindsOptionalOf} functionality. */
4341
final class OptionalBindingComponents {
4442

4543
/** A qualifier. */

compiler/src/main/java/dagger/internal/codegen/AbstractComponentWriter.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
import static dagger.internal.codegen.AbstractComponentWriter.InitializationState.DELEGATED;
2828
import static dagger.internal.codegen.AbstractComponentWriter.InitializationState.INITIALIZED;
2929
import static dagger.internal.codegen.AbstractComponentWriter.InitializationState.UNINITIALIZED;
30-
import static dagger.internal.codegen.AnnotationSpecs.SUPPRESS_WARNINGS_UNCHECKED;
30+
import static dagger.internal.codegen.AnnotationSpecs.Suppression.RAWTYPES;
31+
import static dagger.internal.codegen.AnnotationSpecs.Suppression.UNCHECKED;
3132
import static dagger.internal.codegen.BindingKey.contribution;
3233
import static dagger.internal.codegen.CodeBlocks.makeParametersCodeBlock;
33-
import static dagger.internal.codegen.ContributionBinding.FactoryCreationStrategy.ENUM_INSTANCE;
34+
import static dagger.internal.codegen.ContributionBinding.FactoryCreationStrategy.SINGLETON_INSTANCE;
3435
import static dagger.internal.codegen.ErrorMessages.CANNOT_RETURN_NULL_FROM_NON_NULLABLE_COMPONENT_METHOD;
3536
import static dagger.internal.codegen.MapKeys.getMapKeyExpression;
3637
import static dagger.internal.codegen.MemberSelect.emptyFrameworkMapFactory;
@@ -40,6 +41,7 @@
4041
import static dagger.internal.codegen.MemberSelect.staticMethod;
4142
import static dagger.internal.codegen.MembersInjectionBinding.Strategy.NO_OP;
4243
import static dagger.internal.codegen.Scope.reusableScope;
44+
import static dagger.internal.codegen.SourceFiles.bindingTypeElementTypeVariableNames;
4345
import static dagger.internal.codegen.SourceFiles.generatedClassNameForBinding;
4446
import static dagger.internal.codegen.SourceFiles.membersInjectorNameForType;
4547
import static dagger.internal.codegen.TypeNames.DELEGATE_FACTORY;
@@ -198,12 +200,8 @@ protected AbstractComponentWriter(
198200
parent.optionalFactories);
199201
}
200202

201-
protected final TypeElement componentDefinitionType() {
202-
return graph.componentDescriptor().componentDefinitionType();
203-
}
204-
205203
protected final ClassName componentDefinitionTypeName() {
206-
return ClassName.get(componentDefinitionType());
204+
return ClassName.get(graph.componentType());
207205
}
208206

209207
/**
@@ -374,7 +372,7 @@ private void addBuildMethod(
374372
if (componentCanMakeNewInstances(builderFieldEntry.getKey())) {
375373
buildMethod.addCode(
376374
"if ($1N == null) { this.$1N = new $2T(); }", builderField, builderField.type);
377-
} else if (requiresAPassedInstance(elements, builderFieldEntry.getKey())) {
375+
} else if (requiresAPassedInstance(elements, types, builderFieldEntry.getKey())) {
378376
buildMethod.addCode(
379377
"if ($N == null) { throw new $T($T.class.getCanonicalName() + $S); }",
380378
builderField,
@@ -537,7 +535,7 @@ private FieldSpec addFrameworkField(
537535
contributionBindingField.name());
538536
contributionField.addModifiers(PRIVATE);
539537
if (useRawType) {
540-
contributionField.addAnnotation(AnnotationSpecs.SUPPRESS_WARNINGS_RAWTYPES);
538+
contributionField.addAnnotation(AnnotationSpecs.suppressWarnings(RAWTYPES));
541539
}
542540

543541
FieldSpec field = contributionField.build();
@@ -568,7 +566,7 @@ private Optional<MemberSelect> staticMemberSelect(ResolvedBindings resolvedBindi
568566
switch (bindingKey.kind()) {
569567
case CONTRIBUTION:
570568
ContributionBinding contributionBinding = resolvedBindings.contributionBinding();
571-
if (contributionBinding.factoryCreationStrategy().equals(ENUM_INSTANCE)
569+
if (contributionBinding.factoryCreationStrategy().equals(SINGLETON_INSTANCE)
572570
&& !contributionBinding.scope().isPresent()) {
573571
switch (contributionBinding.bindingKind()) {
574572
case SYNTHETIC_MULTIBOUND_MAP:
@@ -589,7 +587,7 @@ private Optional<MemberSelect> staticMemberSelect(ResolvedBindings resolvedBindi
589587
case PROVISION:
590588
if (bindingKey.key().type().getKind().equals(DECLARED)) {
591589
ImmutableList<TypeVariableName> typeVariables =
592-
SourceFiles.bindingTypeElementTypeVariableNames(contributionBinding);
590+
bindingTypeElementTypeVariableNames(contributionBinding);
593591
if (!typeVariables.isEmpty()) {
594592
List<? extends TypeMirror> typeArguments =
595593
((DeclaredType) bindingKey.key().type()).getTypeArguments();
@@ -696,7 +694,7 @@ private void implementInterfaceMethods() {
696694
ExecutableType requestType =
697695
MoreTypes.asExecutable(
698696
types.asMemberOf(
699-
MoreTypes.asDeclared(componentDefinitionType().asType()), methodElement));
697+
MoreTypes.asDeclared(graph.componentType().asType()), methodElement));
700698
MethodSignature signature =
701699
MethodSignature.fromExecutableType(
702700
methodElement.getSimpleName().toString(), requestType);
@@ -795,7 +793,7 @@ private void initializeFrameworkTypes() {
795793
* initializing a raw field in this method, but the structure of this code makes it
796794
* awkward to pass that bit through. This will be cleaned up when we no longer
797795
* separate fields and initilization as we do now. */
798-
.addAnnotation(SUPPRESS_WARNINGS_UNCHECKED)
796+
.addAnnotation(AnnotationSpecs.suppressWarnings(UNCHECKED))
799797
.addCode(CodeBlocks.concat(partition));
800798
if (builderName.isPresent()) {
801799
initializeMethod.addParameter(builderName.get(), "builder", FINAL);
@@ -856,7 +854,7 @@ private Optional<CodeBlock> initializeContributionBinding(BindingKey bindingKey)
856854
binding.scope().isPresent()
857855
? decorateForScope(delegatingCodeBlock, binding.scope().get())
858856
: delegatingCodeBlock))));
859-
case ENUM_INSTANCE:
857+
case SINGLETON_INSTANCE:
860858
if (!binding.scope().isPresent()) {
861859
return Optional.absent();
862860
}

compiler/src/main/java/dagger/internal/codegen/AnnotationSpecs.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,32 @@
1616

1717
package dagger.internal.codegen;
1818

19+
import static com.google.common.base.Preconditions.checkNotNull;
20+
21+
import com.google.common.base.Ascii;
22+
import com.google.common.base.Preconditions;
23+
import com.google.common.collect.Lists;
1924
import com.squareup.javapoet.AnnotationSpec;
25+
import java.util.Arrays;
2026

2127
final class AnnotationSpecs {
28+
enum Suppression {
29+
RAWTYPES,
30+
UNCHECKED,
31+
;
2232

23-
static final AnnotationSpec SUPPRESS_WARNINGS_UNCHECKED = suppressWarnings("unchecked");
24-
static final AnnotationSpec SUPPRESS_WARNINGS_RAWTYPES = suppressWarnings("rawtypes");
33+
@Override
34+
public String toString() {
35+
return Ascii.toLowerCase(name());
36+
}
37+
}
2538

26-
private static AnnotationSpec suppressWarnings(String value) {
27-
return AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "$S", value).build();
39+
static AnnotationSpec suppressWarnings(Suppression first, Suppression... rest) {
40+
checkNotNull(first);
41+
Arrays.stream(rest).forEach(Preconditions::checkNotNull);
42+
AnnotationSpec.Builder builder = AnnotationSpec.builder(SuppressWarnings.class);
43+
Lists.asList(first, rest).forEach(suppression -> builder.addMember("value", "$S", suppression));
44+
return builder.build();
2845
}
2946

3047
private AnnotationSpecs() {}

compiler/src/main/java/dagger/internal/codegen/Binding.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import com.google.auto.common.MoreElements;
2424
import com.google.auto.value.AutoValue;
25+
import com.google.auto.value.extension.memoized.Memoized;
2526
import com.google.common.base.Optional;
2627
import com.google.common.collect.FluentIterable;
2728
import com.google.common.collect.ImmutableList;
@@ -112,10 +113,10 @@ final Set<DependencyRequest> dependencies() {
112113
* binding keys:
113114
*
114115
* <dl>
115-
* <dt>{@code T}
116-
* <dd>{@code String t}
117-
* <dt>{@code String}
118-
* <dd>{@code String string}
116+
* <dt>{@code T}
117+
* <dd>{@code String t}
118+
* <dt>{@code String}
119+
* <dd>{@code String string}
119120
* </dl>
120121
*
121122
* <p>Note that the sets returned by this method when called on the same binding will be equal,
@@ -124,6 +125,7 @@ final Set<DependencyRequest> dependencies() {
124125
/* TODO(dpb): The stable-order postcondition is actually hard to verify in code for two equal
125126
* instances of Binding, because it really depends on the order of the binding's dependencies,
126127
* and two equal instances of Binding may have the same dependencies in a different order. */
128+
@Memoized
127129
ImmutableList<FrameworkDependency> frameworkDependencies() {
128130
return ImmutableList.copyOf(
129131
dependencyAssociations()
@@ -158,6 +160,7 @@ static DependencyAssociation create(
158160
* multiple times if the {@linkplain Binding#unresolved() unresolved} binding requires it. If that
159161
* distinction is not important, the entries can be merged into a single mapping.
160162
*/
163+
@Memoized
161164
ImmutableList<DependencyAssociation> dependencyAssociations() {
162165
BindingTypeMapper bindingTypeMapper = BindingTypeMapper.forBindingType(bindingType());
163166
ImmutableList.Builder<DependencyAssociation> frameworkDependencies = ImmutableList.builder();
@@ -179,6 +182,7 @@ ImmutableList<DependencyAssociation> dependencyAssociations() {
179182
* Returns the mapping from each {@linkplain #dependencies dependency} to its associated {@link
180183
* FrameworkDependency}.
181184
*/
185+
@Memoized
182186
ImmutableMap<DependencyRequest, FrameworkDependency> dependenciesToFrameworkDependenciesMap() {
183187
ImmutableMap.Builder<DependencyRequest, FrameworkDependency> frameworkDependencyMap =
184188
ImmutableMap.builder();

compiler/src/main/java/dagger/internal/codegen/BindingDeclarationFormatter.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,26 +17,53 @@
1717
package dagger.internal.codegen;
1818

1919
import static com.google.common.base.Preconditions.checkArgument;
20+
import static com.google.common.collect.Sets.immutableEnumSet;
2021
import static dagger.internal.codegen.ConfigurationAnnotations.getModuleSubcomponents;
2122
import static dagger.internal.codegen.ErrorMessages.stripCommonTypePrefixes;
2223
import static dagger.internal.codegen.MoreAnnotationMirrors.simpleName;
2324
import static dagger.internal.codegen.Util.AS_DECLARED_TYPE;
25+
import static javax.lang.model.type.TypeKind.DECLARED;
26+
import static javax.lang.model.type.TypeKind.EXECUTABLE;
2427

2528
import com.google.auto.common.MoreElements;
2629
import com.google.auto.common.MoreTypes;
2730
import com.google.common.collect.ImmutableList;
31+
import com.google.common.collect.ImmutableSet;
2832
import com.google.common.collect.Iterables;
2933
import javax.lang.model.element.Element;
34+
import javax.lang.model.type.TypeKind;
3035
import javax.lang.model.type.TypeMirror;
3136

3237
/**
3338
* Formats a {@link BindingDeclaration} into a {@link String} suitable for use in error messages.
3439
*/
3540
final class BindingDeclarationFormatter extends Formatter<BindingDeclaration> {
41+
private static final ImmutableSet<TypeKind> FORMATTABLE_ELEMENT_TYPE_KINDS =
42+
immutableEnumSet(EXECUTABLE, DECLARED);
43+
3644
private final MethodSignatureFormatter methodSignatureFormatter;
45+
private final KeyFormatter keyFormatter;
3746

38-
BindingDeclarationFormatter(MethodSignatureFormatter methodSignatureFormatter) {
47+
BindingDeclarationFormatter(
48+
MethodSignatureFormatter methodSignatureFormatter, KeyFormatter keyFormatter) {
3949
this.methodSignatureFormatter = methodSignatureFormatter;
50+
this.keyFormatter = keyFormatter;
51+
}
52+
53+
/**
54+
* Returns {@code true} for declarations that this formatter can format. Specifically:
55+
*
56+
* <ul>
57+
* <li>Those with {@linkplain BindingDeclaration#bindingElement() binding elements} that are
58+
* methods, constructors, or types.
59+
* </ul>
60+
*/
61+
boolean canFormat(BindingDeclaration bindingDeclaration) {
62+
if (bindingDeclaration.bindingElement().isPresent()) {
63+
return FORMATTABLE_ELEMENT_TYPE_KINDS.contains(
64+
bindingDeclaration.bindingElement().get().asType().getKind());
65+
}
66+
return false;
4067
}
4168

4269
@Override

0 commit comments

Comments
 (0)