blob: 6437774bf98f8bb3e98d1a54890347791c23e307 [file] [log] [blame]
/*
* 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.internal.codegen.writing;
import dagger.internal.codegen.binding.ComponentRequirement;
import dagger.internal.codegen.binding.ContributionBinding;
import dagger.internal.codegen.binding.ProvisionBinding;
import dagger.spi.model.RequestKind;
import javax.inject.Inject;
/**
* A factory for creating a binding expression for an unscoped instance.
*
* <p>Note that these binding expressions are for getting "direct" instances -- i.e. instances that
* are created via constructors or modules (e.g. {@code new Foo()} or {@code
* FooModule.provideFoo()}) as opposed to an instance created from calling a getter on a framework
* type (e.g. {@code fooProvider.get()}). See {@link FrameworkInstanceRequestRepresentation} for
* binding expressions that are created from framework types.
*/
final class UnscopedDirectInstanceRequestRepresentationFactory {
private final AssistedFactoryRequestRepresentation.Factory
assistedFactoryRequestRepresentationFactory;
private final ComponentInstanceRequestRepresentation.Factory
componentInstanceRequestRepresentationFactory;
private final ComponentProvisionRequestRepresentation.Factory
componentProvisionRequestRepresentationFactory;
private final ComponentRequirementRequestRepresentation.Factory
componentRequirementRequestRepresentationFactory;
private final DelegateRequestRepresentation.Factory delegateRequestRepresentationFactory;
private final MapRequestRepresentation.Factory mapRequestRepresentationFactory;
private final OptionalRequestRepresentation.Factory optionalRequestRepresentationFactory;
private final SetRequestRepresentation.Factory setRequestRepresentationFactory;
private final SimpleMethodRequestRepresentation.Factory simpleMethodRequestRepresentationFactory;
private final SubcomponentCreatorRequestRepresentation.Factory
subcomponentCreatorRequestRepresentationFactory;
@Inject
UnscopedDirectInstanceRequestRepresentationFactory(
ComponentImplementation componentImplementation,
AssistedFactoryRequestRepresentation.Factory assistedFactoryRequestRepresentationFactory,
ComponentInstanceRequestRepresentation.Factory componentInstanceRequestRepresentationFactory,
ComponentProvisionRequestRepresentation.Factory
componentProvisionRequestRepresentationFactory,
ComponentRequirementRequestRepresentation.Factory
componentRequirementRequestRepresentationFactory,
DelegateRequestRepresentation.Factory delegateRequestRepresentationFactory,
MapRequestRepresentation.Factory mapRequestRepresentationFactory,
OptionalRequestRepresentation.Factory optionalRequestRepresentationFactory,
SetRequestRepresentation.Factory setRequestRepresentationFactory,
SimpleMethodRequestRepresentation.Factory simpleMethodRequestRepresentationFactory,
SubcomponentCreatorRequestRepresentation.Factory
subcomponentCreatorRequestRepresentationFactory) {
this.assistedFactoryRequestRepresentationFactory = assistedFactoryRequestRepresentationFactory;
this.componentInstanceRequestRepresentationFactory =
componentInstanceRequestRepresentationFactory;
this.componentProvisionRequestRepresentationFactory =
componentProvisionRequestRepresentationFactory;
this.componentRequirementRequestRepresentationFactory =
componentRequirementRequestRepresentationFactory;
this.delegateRequestRepresentationFactory = delegateRequestRepresentationFactory;
this.mapRequestRepresentationFactory = mapRequestRepresentationFactory;
this.optionalRequestRepresentationFactory = optionalRequestRepresentationFactory;
this.setRequestRepresentationFactory = setRequestRepresentationFactory;
this.simpleMethodRequestRepresentationFactory = simpleMethodRequestRepresentationFactory;
this.subcomponentCreatorRequestRepresentationFactory =
subcomponentCreatorRequestRepresentationFactory;
}
/** Returns a direct, unscoped binding expression for a {@link RequestKind#INSTANCE} request. */
RequestRepresentation create(ContributionBinding binding) {
switch (binding.kind()) {
case DELEGATE:
return delegateRequestRepresentationFactory.create(binding, RequestKind.INSTANCE);
case COMPONENT:
return componentInstanceRequestRepresentationFactory.create(binding);
case COMPONENT_DEPENDENCY:
return componentRequirementRequestRepresentationFactory.create(
binding, ComponentRequirement.forDependency(binding.key().type().java()));
case COMPONENT_PROVISION:
return componentProvisionRequestRepresentationFactory.create((ProvisionBinding) binding);
case SUBCOMPONENT_CREATOR:
return subcomponentCreatorRequestRepresentationFactory.create(binding);
case MULTIBOUND_SET:
return setRequestRepresentationFactory.create((ProvisionBinding) binding);
case MULTIBOUND_MAP:
return mapRequestRepresentationFactory.create((ProvisionBinding) binding);
case OPTIONAL:
return optionalRequestRepresentationFactory.create((ProvisionBinding) binding);
case BOUND_INSTANCE:
return componentRequirementRequestRepresentationFactory.create(
binding, ComponentRequirement.forBoundInstance(binding));
case ASSISTED_FACTORY:
return assistedFactoryRequestRepresentationFactory.create((ProvisionBinding) binding);
case INJECTION:
case PROVISION:
return simpleMethodRequestRepresentationFactory.create((ProvisionBinding) binding);
case ASSISTED_INJECTION:
case MEMBERS_INJECTOR:
case MEMBERS_INJECTION:
case COMPONENT_PRODUCTION:
case PRODUCTION:
// Fall through
}
throw new AssertionError("Unexpected binding kind: " + binding.kind());
}
}