1919use  stdClass ;
2020use  function  explode ;
2121use  function  strcasecmp ;
22+ use  function  strtolower ;
2223use  function  substr ;
2324
2425final  class  AutowiredAttributeServicesExtension extends  CompilerExtension
@@ -39,6 +40,15 @@ public function loadConfiguration(): void
3940		$ builder  = $ this  ->getContainerBuilder ();
4041
4142		$ autowiredParameters  = Attributes::findTargetMethodParameters (AutowiredParameter::class);
43+ 		$ constructorParameters  = [];
44+ 		foreach  ($ autowiredParameters  as  $ parameter ) {
45+ 			if  (strcasecmp ($ parameter ->method , '__construct ' ) !== 0 ) {
46+ 				continue ;
47+ 			}
48+ 			$ lowerClass  = strtolower ($ parameter ->class );
49+ 			$ constructorParameters [$ lowerClass ] ??= [];
50+ 			$ constructorParameters [$ lowerClass ][] = $ parameter ;
51+ 		}
4252
4353		foreach  (Attributes::findTargetClasses (AutowiredService::class) as  $ class ) {
4454			$ reflection  = new  ReflectionClass ($ class ->name );
@@ -53,7 +63,7 @@ public function loadConfiguration(): void
5363				$ definition ->setFactory (new  Statement ([new  Reference (substr ($ ref , 1 )), $ method ]));
5464			}
5565
56- 			$ this  ->processParameters ($ class ->name , $ definition , $ autowiredParameters  );
66+ 			$ this  ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters  );
5767
5868			foreach  (ValidateServiceTagsExtension::INTERFACE_TAG_MAPPING  as  $ interface  => $ tag ) {
5969				if  (!$ reflection ->implementsInterface ($ interface )) {
@@ -76,7 +86,7 @@ public function loadConfiguration(): void
7686				$ definition ->setFactory (new  Statement ([new  Reference (substr ($ ref , 1 )), $ method ]));
7787			}
7888
79- 			$ this  ->processParameters ($ class ->name , $ definition , $ autowiredParameters  );
89+ 			$ this  ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters  );
8090		}
8191
8292		foreach  (Attributes::findTargetClasses (GenerateFactory::class) as  $ class ) {
@@ -89,7 +99,7 @@ public function loadConfiguration(): void
8999			}
90100
91101			$ resultDefinition  = $ definition ->getResultDefinition ();
92- 			$ this  ->processParameters ($ class ->name , $ resultDefinition , $ autowiredParameters  );
102+ 			$ this  ->processConstructorParameters ($ class ->name , $ resultDefinition , $ constructorParameters  );
93103		}
94104
95105		/** @var stdClass&object{level: int|null} $config */ 
@@ -109,7 +119,7 @@ public function loadConfiguration(): void
109119				->setAutowired ($ class ->name )
110120				->addTag (LazyRegistry::RULE_TAG );
111121
112- 			$ this  ->processParameters ($ class ->name , $ definition , $ autowiredParameters  );
122+ 			$ this  ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters  );
113123		}
114124
115125		foreach  (Attributes::findTargetClasses (RegisteredCollector::class) as  $ class ) {
@@ -123,24 +133,18 @@ public function loadConfiguration(): void
123133				->setAutowired ($ class ->name )
124134				->addTag (RegistryFactory::COLLECTOR_TAG );
125135
126- 			$ this  ->processParameters ($ class ->name , $ definition , $ autowiredParameters  );
136+ 			$ this  ->processConstructorParameters ($ class ->name , $ definition , $ constructorParameters  );
127137		}
128138	}
129139
130140	/** 
131141	 * @param class-string $className 
132- 	 * @param TargetMethodParameter<AutowiredParameter>[] $autowiredParameters  
142+ 	 * @param array<lowercase-string, non-empty-list< TargetMethodParameter<AutowiredParameter>>> $constructorParameters  
133143	 */ 
134- 	private  function  processParameters (string  $ className , ServiceDefinition   $ definition , array  $ autowiredParameters  ): void 
144+ 	private  function  processConstructorParameters (string  $ className , ServiceDefinition   $ definition , array  $ constructorParameters  ): void 
135145	{
136146		$ builder  = $ this  ->getContainerBuilder ();
137- 		foreach  ($ autowiredParameters  as  $ autowiredParameter ) {
138- 			if  (strcasecmp ($ autowiredParameter ->method , '__construct ' ) !== 0 ) {
139- 				continue ;
140- 			}
141- 			if  (strcasecmp ($ autowiredParameter ->class , $ className ) !== 0 ) {
142- 				continue ;
143- 			}
147+ 		foreach  ($ constructorParameters [strtolower ($ className )] ?? [] as  $ autowiredParameter ) {
144148			$ ref  = $ autowiredParameter ->attribute ->ref ;
145149			if  ($ ref  === null ) {
146150				$ argument  = Helpers::expand (
0 commit comments