<?php namespace Symfony\Component\DependencyInjection\Compiler; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; class PassConfig { public const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization'; public const TYPE_OPTIMIZE = 'optimization'; public const TYPE_BEFORE_REMOVING = 'beforeRemoving'; public const TYPE_REMOVE = 'removing'; public const TYPE_AFTER_REMOVING = 'afterRemoving'; private MergeExtensionConfigurationPass $mergePass; private array $afterRemovingPasses; private array $beforeOptimizationPasses; private array $beforeRemovingPasses = []; private array $optimizationPasses; private array $removingPasses; public function __construct() { $this->mergePass = new MergeExtensionConfigurationPass(); $this->beforeOptimizationPasses = [ 100 => [ new ResolveClassPass(), new RegisterAutoconfigureAttributesPass(), new AutowireAsDecoratorPass(), new AttributeAutoconfigurationPass(), new ResolveInstanceofConditionalsPass(), new RegisterEnvVarProcessorsPass(), ], -1000 => [new ExtensionCompilerPass()], ]; $this->optimizationPasses = [[ new AutoAliasServicePass(), new ValidateEnvPlaceholdersPass(), new ResolveDecoratorStackPass(), new ResolveAutowireInlineAttributesPass(), 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 ServiceLocatorTagPass(), 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 = [ 0 => [ new ResolveHotPathPass(), new ResolveNoPreloadPass(), new AliasDeprecatedPublicServicesPass(), ], -2048 => [new RemoveBuildParametersPass()], ]; } public function getPasses(): array { return array_merge( [$this->mergePass], $this->getBeforeOptimizationPasses(), $this->getOptimizationPasses(), $this->getBeforeRemovingPasses(), $this->getRemovingPasses(), $this->getAfterRemovingPasses() ); } public function addPass(CompilerPassInterface $pass, string $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): void { $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; } public function getAfterRemovingPasses(): array { return $this->sortPasses($this->afterRemovingPasses); } public function getBeforeOptimizationPasses(): array { return $this->sortPasses($this->beforeOptimizationPasses); } public function getBeforeRemovingPasses(): array { return $this->sortPasses($this->beforeRemovingPasses); } public function getOptimizationPasses(): array { return $this->sortPasses($this->optimizationPasses); } public function getRemovingPasses(): array { return $this->sortPasses($this->removingPasses); } public function getMergePass(): CompilerPassInterface { return $this->mergePass; } public function setMergePass(CompilerPassInterface $pass): void { $this->mergePass = $pass; } public function setAfterRemovingPasses(array $passes): void { $this->afterRemovingPasses = [$passes]; } public function setBeforeOptimizationPasses(array $passes): void { $this->beforeOptimizationPasses = [$passes]; } public function setBeforeRemovingPasses(array $passes): void { $this->beforeRemovingPasses = [$passes]; } public function setOptimizationPasses(array $passes): void { $this->optimizationPasses = [$passes]; } public function setRemovingPasses(array $passes): void { $this->removingPasses = [$passes]; } private function sortPasses(array $passes): array { if (0 === \count($passes)) { return []; } krsort($passes); return array_merge(...$passes); } }