123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\DependencyInjection\Compiler;
- use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
- /**
- * Compiler Pass Configuration.
- *
- * This class has a default configuration embedded.
- *
- * @author Johannes M. Schmitt <schmittjoh@gmail.com>
- */
- class PassConfig
- {
- public const TYPE_AFTER_REMOVING = 'afterRemoving';
- public const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
- public const TYPE_BEFORE_REMOVING = 'beforeRemoving';
- public const TYPE_OPTIMIZE = 'optimization';
- public const TYPE_REMOVE = 'removing';
- private $mergePass;
- private $afterRemovingPasses = [];
- private $beforeOptimizationPasses = [];
- private $beforeRemovingPasses = [];
- private $optimizationPasses;
- private $removingPasses;
- public function __construct()
- {
- $this->mergePass = new MergeExtensionConfigurationPass();
- $this->beforeOptimizationPasses = [
- 100 => [
- new ResolveClassPass(),
- new ResolveInstanceofConditionalsPass(),
- new RegisterEnvVarProcessorsPass(),
- ],
- -1000 => [new ExtensionCompilerPass()],
- ];
- $this->optimizationPasses = [[
- new AutoAliasServicePass(),
- new ValidateEnvPlaceholdersPass(),
- new ResolveDecoratorStackPass(),
- new ResolveChildDefinitionsPass(),
- new RegisterServiceSubscribersPass(),
- new ResolveParameterPlaceHoldersPass(false, false),
- new ResolveFactoryClassPass(),
- new ResolveNamedArgumentsPass(),
- new AutowireRequiredMethodsPass(),
- new AutowireRequiredPropertiesPass(),
- new ResolveBindingsPass(),
- new ServiceLocatorTagPass(),
- new DecoratorServicePass(),
- new CheckDefinitionValidityPass(),
- new AutowirePass(false),
- new ResolveTaggedIteratorArgumentPass(),
- new ResolveServiceSubscribersPass(),
- new ResolveReferencesToAliasesPass(),
- new ResolveInvalidReferencesPass(),
- new AnalyzeServiceReferencesPass(true),
- new CheckCircularReferencesPass(),
- new CheckReferenceValidityPass(),
- new CheckArgumentsValidityPass(false),
- ]];
- $this->removingPasses = [[
- new RemovePrivateAliasesPass(),
- new ReplaceAliasByActualDefinitionPass(),
- new RemoveAbstractDefinitionsPass(),
- new RemoveUnusedDefinitionsPass(),
- new AnalyzeServiceReferencesPass(),
- new CheckExceptionOnInvalidReferenceBehaviorPass(),
- new InlineServiceDefinitionsPass(new AnalyzeServiceReferencesPass()),
- new AnalyzeServiceReferencesPass(),
- new DefinitionErrorExceptionPass(),
- ]];
- $this->afterRemovingPasses = [[
- new ResolveHotPathPass(),
- new ResolveNoPreloadPass(),
- new AliasDeprecatedPublicServicesPass(),
- ]];
- }
- /**
- * Returns all passes in order to be processed.
- *
- * @return CompilerPassInterface[]
- */
- public function getPasses()
- {
- return array_merge(
- [$this->mergePass],
- $this->getBeforeOptimizationPasses(),
- $this->getOptimizationPasses(),
- $this->getBeforeRemovingPasses(),
- $this->getRemovingPasses(),
- $this->getAfterRemovingPasses()
- );
- }
- /**
- * Adds a pass.
- *
- * @throws InvalidArgumentException when a pass type doesn't exist
- */
- public function addPass(CompilerPassInterface $pass, string $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0)
- {
- $property = $type.'Passes';
- if (!isset($this->$property)) {
- throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
- }
- $passes = &$this->$property;
- if (!isset($passes[$priority])) {
- $passes[$priority] = [];
- }
- $passes[$priority][] = $pass;
- }
- /**
- * Gets all passes for the AfterRemoving pass.
- *
- * @return CompilerPassInterface[]
- */
- public function getAfterRemovingPasses()
- {
- return $this->sortPasses($this->afterRemovingPasses);
- }
- /**
- * Gets all passes for the BeforeOptimization pass.
- *
- * @return CompilerPassInterface[]
- */
- public function getBeforeOptimizationPasses()
- {
- return $this->sortPasses($this->beforeOptimizationPasses);
- }
- /**
- * Gets all passes for the BeforeRemoving pass.
- *
- * @return CompilerPassInterface[]
- */
- public function getBeforeRemovingPasses()
- {
- return $this->sortPasses($this->beforeRemovingPasses);
- }
- /**
- * Gets all passes for the Optimization pass.
- *
- * @return CompilerPassInterface[]
- */
- public function getOptimizationPasses()
- {
- return $this->sortPasses($this->optimizationPasses);
- }
- /**
- * Gets all passes for the Removing pass.
- *
- * @return CompilerPassInterface[]
- */
- public function getRemovingPasses()
- {
- return $this->sortPasses($this->removingPasses);
- }
- /**
- * Gets the Merge pass.
- *
- * @return CompilerPassInterface
- */
- public function getMergePass()
- {
- return $this->mergePass;
- }
- public function setMergePass(CompilerPassInterface $pass)
- {
- $this->mergePass = $pass;
- }
- /**
- * Sets the AfterRemoving passes.
- *
- * @param CompilerPassInterface[] $passes
- */
- public function setAfterRemovingPasses(array $passes)
- {
- $this->afterRemovingPasses = [$passes];
- }
- /**
- * Sets the BeforeOptimization passes.
- *
- * @param CompilerPassInterface[] $passes
- */
- public function setBeforeOptimizationPasses(array $passes)
- {
- $this->beforeOptimizationPasses = [$passes];
- }
- /**
- * Sets the BeforeRemoving passes.
- *
- * @param CompilerPassInterface[] $passes
- */
- public function setBeforeRemovingPasses(array $passes)
- {
- $this->beforeRemovingPasses = [$passes];
- }
- /**
- * Sets the Optimization passes.
- *
- * @param CompilerPassInterface[] $passes
- */
- public function setOptimizationPasses(array $passes)
- {
- $this->optimizationPasses = [$passes];
- }
- /**
- * Sets the Removing passes.
- *
- * @param CompilerPassInterface[] $passes
- */
- public function setRemovingPasses(array $passes)
- {
- $this->removingPasses = [$passes];
- }
- /**
- * Sort passes by priority.
- *
- * @param array $passes CompilerPassInterface instances with their priority as key
- *
- * @return CompilerPassInterface[]
- */
- private function sortPasses(array $passes): array
- {
- if (0 === \count($passes)) {
- return [];
- }
- krsort($passes);
- // Flatten the array
- return array_merge(...$passes);
- }
- }
|