12
12
namespace Symfony \Component \Form \Command ;
13
13
14
14
use Symfony \Component \Console \Command \Command ;
15
+ use Symfony \Component \Console \Completion \CompletionInput ;
16
+ use Symfony \Component \Console \Completion \CompletionSuggestions ;
15
17
use Symfony \Component \Console \Exception \InvalidArgumentException ;
16
18
use Symfony \Component \Console \Input \InputArgument ;
17
19
use Symfony \Component \Console \Input \InputInterface ;
@@ -159,19 +161,7 @@ protected function execute(InputInterface $input, OutputInterface $output)
159
161
160
162
private function getFqcnTypeClass (InputInterface $ input , SymfonyStyle $ io , string $ shortClassName ): string
161
163
{
162
- $ classes = [];
163
- sort ($ this ->namespaces );
164
- foreach ($ this ->namespaces as $ namespace ) {
165
- if (class_exists ($ fqcn = $ namespace .'\\' .$ shortClassName )) {
166
- $ classes [] = $ fqcn ;
167
- } elseif (class_exists ($ fqcn = $ namespace .'\\' .ucfirst ($ shortClassName ))) {
168
- $ classes [] = $ fqcn ;
169
- } elseif (class_exists ($ fqcn = $ namespace .'\\' .ucfirst ($ shortClassName ).'Type ' )) {
170
- $ classes [] = $ fqcn ;
171
- } elseif (str_ends_with ($ shortClassName , 'type ' ) && class_exists ($ fqcn = $ namespace .'\\' .ucfirst (substr ($ shortClassName , 0 , -4 ).'Type ' ))) {
172
- $ classes [] = $ fqcn ;
173
- }
174
- }
164
+ $ classes = $ this ->getFqcnTypeClasses ($ shortClassName );
175
165
176
166
if (0 === $ count = \count ($ classes )) {
177
167
$ message = sprintf ("Could not find type \"%s \" into the following namespaces: \n %s " , $ shortClassName , implode ("\n " , $ this ->namespaces ));
@@ -198,6 +188,25 @@ private function getFqcnTypeClass(InputInterface $input, SymfonyStyle $io, strin
198
188
return $ io ->choice (sprintf ("The type \"%s \" is ambiguous. \n\nSelect one of the following form types to display its information: " , $ shortClassName ), $ classes , $ classes [0 ]);
199
189
}
200
190
191
+ private function getFqcnTypeClasses (string $ shortClassName ): array
192
+ {
193
+ $ classes = [];
194
+ sort ($ this ->namespaces );
195
+ foreach ($ this ->namespaces as $ namespace ) {
196
+ if (class_exists ($ fqcn = $ namespace .'\\' .$ shortClassName )) {
197
+ $ classes [] = $ fqcn ;
198
+ } elseif (class_exists ($ fqcn = $ namespace .'\\' .ucfirst ($ shortClassName ))) {
199
+ $ classes [] = $ fqcn ;
200
+ } elseif (class_exists ($ fqcn = $ namespace .'\\' .ucfirst ($ shortClassName ).'Type ' )) {
201
+ $ classes [] = $ fqcn ;
202
+ } elseif (str_ends_with ($ shortClassName , 'type ' ) && class_exists ($ fqcn = $ namespace .'\\' .ucfirst (substr ($ shortClassName , 0 , -4 ).'Type ' ))) {
203
+ $ classes [] = $ fqcn ;
204
+ }
205
+ }
206
+
207
+ return $ classes ;
208
+ }
209
+
201
210
private function getCoreTypes (): array
202
211
{
203
212
$ coreExtension = new CoreExtension ();
@@ -242,4 +251,42 @@ private function findAlternatives(string $name, array $collection): array
242
251
243
252
return array_keys ($ alternatives );
244
253
}
254
+
255
+ public function complete (CompletionInput $ input , CompletionSuggestions $ suggestions ): void
256
+ {
257
+ if ($ input ->mustSuggestArgumentValuesFor ('class ' )) {
258
+ $ suggestions ->suggestValues (array_merge ($ this ->getCoreTypes (), $ this ->types ));
259
+
260
+ return ;
261
+ }
262
+
263
+ if ($ input ->mustSuggestArgumentValuesFor ('option ' ) && null !== $ class = $ input ->getArgument ('class ' )) {
264
+ $ this ->completeOptions ($ class , $ suggestions );
265
+
266
+ return ;
267
+ }
268
+
269
+ if ($ input ->mustSuggestOptionValuesFor ('format ' )) {
270
+ $ helper = new DescriptorHelper ();
271
+ $ suggestions ->suggestValues ($ helper ->getFormats ());
272
+ }
273
+ }
274
+
275
+ private function completeOptions (string $ class , CompletionSuggestions $ suggestions ): void
276
+ {
277
+ if (!class_exists ($ class ) || !is_subclass_of ($ class , FormTypeInterface::class)) {
278
+ $ classes = $ this ->getFqcnTypeClasses ($ class );
279
+
280
+ if (1 === count ($ classes )) {
281
+ $ class = $ classes [0 ];
282
+ }
283
+ }
284
+
285
+ if (!$ this ->formRegistry ->hasType ($ class )) {
286
+ return ;
287
+ }
288
+
289
+ $ resolvedType = $ this ->formRegistry ->getType ($ class );
290
+ $ suggestions ->suggestValues ($ resolvedType ->getOptionsResolver ()->getDefinedOptions ());
291
+ }
245
292
}
0 commit comments