Skip to content

ShouldNotHappenException when encountering anonymous class #1574

@malarzm

Description

@malarzm

Running with -vvv makes me think it's related to Rector\Symfony\Rector\New_\StringToArrayArgumentProcessRector. When I comment out the part with the anonymous class the error is gone.

Class causing an error:

<?php

declare(strict_types=1);

namespace App\Admin\Form\Setting;

use App\Admin\DTO\SettingsDTO;
use App\Shop\Enum\FormNameEnum;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Regex;

class SettingEditNumberType extends AbstractType
{
    public const NAME = FormNameEnum::SETTING_EDIT;

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->add(
            $builder->create(
                'value',
                TextType::class,
                [
                    'empty_data' => '',
                    'constraints' => array_merge(
                        [
                            new NotBlank(),
                            new Regex(['pattern' => '/^[0-9\.\,]+$/']),
                        ],
                        $options['value_field_constraints']
                    ),
                ]
            )->addModelTransformer(
                new class() implements DataTransformerInterface {
                    public function transform($value)
                    {
                        if (null === $value) {
                            return null;
                        }

                        if (!\is_float($value) && !\is_int($value)) {
                            throw new TransformationFailedException('Expected either a float or an int.');
                        }

                        return (string) $value;
                    }

                    public function reverseTransform($value)
                    {
                        if (null === $value) {
                            return null;
                        }

                        return (float) str_replace(',', '.', $value);
                    }
                }
            )
        );
    }

    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults(
            [
                'data_class' => SettingsDTO::class,
                'csrf_protection' => false,
                'value_field_constraints' => [],
            ]
        );

        $resolver->setAllowedTypes('value_field_constraints', 'array');
    }

    /** @noinspection PhpMissingParentCallCommonInspection */
    public function getBlockPrefix(): string
    {
        return self::NAME;
    }
}

Exception trace:


Rector\Symfony\Rector\New_\StringToArrayArgumentProcessRector

In Broker.php line 294:
                                      
  [PHPStan\ShouldNotHappenException]  
  Internal error.                     
                                      

Exception trace:
 () at /rector/vendor/phpstan/phpstan/src/Broker/Broker.php:294
 PHPStan\Broker\Broker->getAnonymousClassReflection() at /rector/vendor/phpstan/phpstan/src/Analyser/Scope.php:1093
 PHPStan\Analyser\Scope->resolveType() at /rector/vendor/phpstan/phpstan/src/Analyser/Scope.php:362
 PHPStan\Analyser\Scope->getType() at /rector/packages/NodeTypeResolver/src/NodeTypeResolver.php:410
 Rector\NodeTypeResolver\NodeTypeResolver->resolveFirstTypes() at /rector/packages/NodeTypeResolver/src/NodeTypeResolver.php:168
 Rector\NodeTypeResolver\NodeTypeResolver->resolve() at /rector/packages/NodeTypeResolver/src/NodeTypeResolver.php:144
 Rector\NodeTypeResolver\NodeTypeResolver->getTypes() at /rector/packages/NodeTypeResolver/src/NodeTypeResolver.php:118
 Rector\NodeTypeResolver\NodeTypeResolver->isType() at /rector/src/Rector/NodeTypeResolverTrait.php:30
 Rector\Rector\AbstractRector->isType() at /rector/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php:80
 Rector\Symfony\Rector\New_\StringToArrayArgumentProcessRector->refactor() at /rector/src/Rector/AbstractRector.php:87
 Rector\Rector\AbstractRector->enterNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:123
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:146
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:146
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:114
 PhpParser\NodeTraverser->traverseNode() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:223
 PhpParser\NodeTraverser->traverseArray() at /rector/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php:91
 PhpParser\NodeTraverser->traverse() at /rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php:52
 Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverse() at /rector/src/Application/FileProcessor.php:114
 Rector\Application\FileProcessor->refactor() at /rector/src/Application/RectorApplication.php:108
 Rector\Application\RectorApplication->Rector\Application\{closure}() at /rector/src/Application/RectorApplication.php:137
 Rector\Application\RectorApplication->tryCatchWrapper() at /rector/src/Application/RectorApplication.php:109
 Rector\Application\RectorApplication->runOnFileInfos() at /rector/src/Console/Command/ProcessCommand.php:154
 Rector\Console\Command\ProcessCommand->execute() at /rector/vendor/symfony/console/Command/Command.php:255
 Symfony\Component\Console\Command\Command->run() at /rector/src/Console/Command/AbstractCommand.php:32
 Rector\Console\Command\AbstractCommand->run() at /rector/vendor/symfony/console/Application.php:939
 Symfony\Component\Console\Application->doRunCommand() at /rector/vendor/symfony/console/Application.php:273
 Symfony\Component\Console\Application->doRun() at /rector/src/Console/Application.php:92
 Rector\Console\Application->doRun() at /rector/vendor/symfony/console/Application.php:149
 Symfony\Component\Console\Application->run() at /rector/bin/rector:24

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions