| 
5 | 5 | namespace GraphQL\Utils;  | 
6 | 6 | 
 
  | 
7 | 7 | use GraphQL\Error\Error;  | 
 | 8 | +use GraphQL\Language\AST\ArgumentNode;  | 
 | 9 | +use GraphQL\Language\AST\DirectiveNode;  | 
 | 10 | +use GraphQL\Language\AST\NodeKind;  | 
8 | 11 | use GraphQL\Language\Printer;  | 
9 | 12 | use GraphQL\Type\Definition\Directive;  | 
10 | 13 | use GraphQL\Type\Definition\EnumType;  | 
 | 
29 | 32 | use function count;  | 
30 | 33 | use function explode;  | 
31 | 34 | use function implode;  | 
 | 35 | +use function iterator_to_array;  | 
32 | 36 | use function ksort;  | 
33 | 37 | use function mb_strlen;  | 
34 | 38 | use function preg_match_all;  | 
@@ -371,7 +375,7 @@ public static function printType(Type $type, array $options = []): string  | 
371 | 375 |      */  | 
372 | 376 |     protected static function printScalar(ScalarType $type, array $options): string  | 
373 | 377 |     {  | 
374 |  | -        return sprintf('%sscalar %s', static::printDescription($options, $type), $type->name);  | 
 | 378 | +        return sprintf('%sscalar %s', static::printDescription($options, $type), $type->name) . static::printFieldOrTypeDirectives($type);  | 
375 | 379 |     }  | 
376 | 380 | 
 
  | 
377 | 381 |     /**  | 
@@ -410,14 +414,64 @@ protected static function printFields(array $options, $type): string  | 
410 | 414 |                 static function (FieldDefinition $f, int $i) use ($options): string {  | 
411 | 415 |                     return static::printDescription($options, $f, '  ', $i === 0) . '  ' .  | 
412 | 416 |                         $f->name . static::printArgs($options, $f->args, '  ') . ': ' .  | 
413 |  | -                        (string) $f->getType() . static::printDeprecated($f);  | 
 | 417 | +                        (string) $f->getType() . static::printFieldOrTypeDirectives($f);  | 
414 | 418 |                 },  | 
415 | 419 |                 $fields,  | 
416 | 420 |                 array_keys($fields)  | 
417 | 421 |             )  | 
418 | 422 |         );  | 
419 | 423 |     }  | 
420 | 424 | 
 
  | 
 | 425 | +    /**  | 
 | 426 | +     * @param FieldDefinition|ScalarType|EnumValueDefinition $fieldOrEnumVal  | 
 | 427 | +     */  | 
 | 428 | +    protected static function printFieldOrTypeDirectives($fieldOrEnumVal): string  | 
 | 429 | +    {  | 
 | 430 | +        $serialized = '';  | 
 | 431 | + | 
 | 432 | +        if (($fieldOrEnumVal instanceof FieldDefinition || $fieldOrEnumVal instanceof EnumValueDefinition) && $fieldOrEnumVal->deprecationReason !== null) {  | 
 | 433 | +            $serialized .= static::printDeprecated($fieldOrEnumVal);  | 
 | 434 | +        }  | 
 | 435 | + | 
 | 436 | +        if ($fieldOrEnumVal->astNode !== null) {  | 
 | 437 | +            foreach ($fieldOrEnumVal->astNode->directives as $directive) {  | 
 | 438 | +                /** @var DirectiveNode $directive */  | 
 | 439 | +                if ($directive->name->value === Directive::DEPRECATED_NAME && $fieldOrEnumVal->deprecationReason !== null) {  | 
 | 440 | +                    continue;  | 
 | 441 | +                }  | 
 | 442 | + | 
 | 443 | +                $serialized .= ' @' . $directive->name->value;  | 
 | 444 | + | 
 | 445 | +                if ($directive->arguments->count() === 0) {  | 
 | 446 | +                    continue;  | 
 | 447 | +                }  | 
 | 448 | + | 
 | 449 | +                $serialized .= '(' . implode(', ', array_map(static function (ArgumentNode $argument): string {  | 
 | 450 | +                    switch ($argument->value->kind) {  | 
 | 451 | +                        case NodeKind::INT:  | 
 | 452 | +                            $type = Type::int();  | 
 | 453 | +                            break;  | 
 | 454 | +                        case NodeKind::FLOAT:  | 
 | 455 | +                            $type = Type::float();  | 
 | 456 | +                            break;  | 
 | 457 | +                        case NodeKind::STRING:  | 
 | 458 | +                            $type = Type::string();  | 
 | 459 | +                            break;  | 
 | 460 | +                        case NodeKind::BOOLEAN:  | 
 | 461 | +                            $type = Type::boolean();  | 
 | 462 | +                            break;  | 
 | 463 | +                        default:  | 
 | 464 | +                            return '';  | 
 | 465 | +                    }  | 
 | 466 | + | 
 | 467 | +                    return $argument->name->value . ': ' . Printer::doPrint(AST::astFromValue($argument->value->value, $type));  | 
 | 468 | +                }, iterator_to_array($directive->arguments))) . ')';  | 
 | 469 | +            }  | 
 | 470 | +        }  | 
 | 471 | + | 
 | 472 | +        return $serialized;  | 
 | 473 | +    }  | 
 | 474 | + | 
421 | 475 |     /**  | 
422 | 476 |      * @param FieldArgument|EnumValueDefinition $fieldOrEnumVal  | 
423 | 477 |      */  | 
@@ -487,7 +541,7 @@ protected static function printEnumValues(array $values, array $options): string  | 
487 | 541 |             array_map(  | 
488 | 542 |                 static function (EnumValueDefinition $value, int $i) use ($options): string {  | 
489 | 543 |                     return static::printDescription($options, $value, '  ', $i === 0) . '  ' .  | 
490 |  | -                        $value->name . static::printDeprecated($value);  | 
 | 544 | +                        $value->name . static::printFieldOrTypeDirectives($value);  | 
491 | 545 |                 },  | 
492 | 546 |                 $values,  | 
493 | 547 |                 array_keys($values)  | 
 | 
0 commit comments