@@ -148,28 +148,55 @@ private static function extractParameters(string $type, array $values): array
148148 ],
149149 []
150150 );
151+ if (isset (self ::$ parameterTypes [$ type ])) {
152+ $ types = self ::$ parameterTypes [$ type ];
153+ } else {
154+ $ types = static ::PRAMETER_TYPE_HINTS [$ type ] ?? [];
155+ $ parameterRefls = (new \ReflectionClass ($ type ))
156+ ->getConstructor ()
157+ ?->getParameters() ?? [];
158+ foreach ($ parameterRefls as $ refl ) {
159+ $ paramName = $ refl ->getName ();
160+ if (\array_key_exists ($ paramName , $ types )) {
161+ continue ;
162+ }
163+ $ paramType = $ refl ->getType ();
164+ if ($ paramType instanceof \ReflectionNamedType && !$ paramType ->isBuiltin ()) {
165+ $ types [$ paramName ] = $ paramType ->getName ();
166+ } else {
167+ $ types [$ paramName ] = null ;
168+ }
169+ }
170+ self ::$ parameterTypes [$ type ] = $ types ;
171+ }
151172
152173 $ parameters = array_intersect_key ($ values , $ types );
153174 foreach ($ parameters as $ name => $ parameter ) {
154175 $ type = $ types [$ name ];
155- if (null !== $ type && \is_array ($ parameter )) {
156- $ isArrayType = str_ends_with ( $ type , ' [] ' ) ;
157- $ type = $ isArrayType ? substr ( $ type , 0 , - 2 ) : $ type ;
158- $ shortName = ( new \ ReflectionClass ( $ type))-> getShortName ( );
159- $ parameters [ $ name ] = $ isArrayType
160- ? array_map (
161- static fn ( array $ values ): Literal => Literal:: new (
162- $ shortName ,
163- self :: extractParameters ($ type, $ values )
164- ),
165- $ parameter
166- )
167- : Literal::new (
176+ if (null === $ type || ! \is_array ($ parameter )) {
177+ continue ;
178+ }
179+ $ isArrayType = str_ends_with ( $ type, ' [] ' );
180+ /**
181+ * @var class-string
182+ */
183+ $ type = $ isArrayType ? substr ( $ type , 0 , - 2 ) : $ type ;
184+ $ shortName = ( new \ ReflectionClass ($ type))-> getShortName ();
185+ if ( $ isArrayType ) {
186+ $ parameters [ $ name ] = [];
187+ foreach ( $ parameter as $ key => $ values ) {
188+ $ parameters [ $ name ][ $ key ] = Literal::new (
168189 $ shortName ,
169- \ArrayObject::class === $ type
170- ? [$ parameter ]
171- : self ::extractParameters ($ type , $ parameter )
190+ self ::extractParameters ($ type , $ values )
172191 );
192+ }
193+ } else {
194+ $ parameters [$ name ] = Literal::new (
195+ $ shortName ,
196+ \ArrayObject::class === $ type
197+ ? [$ parameter ]
198+ : self ::extractParameters ($ type , $ parameter )
199+ );
173200 }
174201 }
175202
0 commit comments