From a1fe285b5e5c500c6c3f3af3cae78b23738bb772 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Fri, 24 Oct 2025 21:28:00 +0200 Subject: [PATCH] [depre] Deprecate StringExtensionToConfigBuilderRector as deprecated in Symfony 7.4 --- composer.json | 4 +- .../Doctrine/database_prefix_on_empty.php.inc | 27 -- .../Doctrine/doctrine_mapping_type.php.inc | 33 --- .../doctrine_orm_cache_driver.php.inc | 35 --- .../Framework/framework_cache_pool.php.inc | 35 --- .../Fixture/Monolog/excluded_codes.php.inc | 30 --- .../Fixture/Monolog/two_channels.php.inc | 33 --- .../Fixture/doctrine_extension.php.inc | 34 --- .../Fixture/doctrine_mapping.php.inc | 39 --- .../Fixture/doctrine_mapping_many.php.inc | 45 ---- .../Fixture/doctrine_orm.php.inc | 47 ---- .../Fixture/doctrine_orm_and_dbal.php.inc | 31 --- .../Fixture/framework_extension.php.inc | 50 ---- .../framework_extension_nested.php.inc | 32 --- .../Fixture/null_framework_extension.php.inc | 25 -- ...security_access_control_many_items.php.inc | 37 --- .../Fixture/security_access_manager.php.inc | 29 --- .../Fixture/security_extension.php.inc | 38 --- .../Fixture/security_provider.php.inc | 30 --- .../Fixture/skip_no_extension.php.inc | 31 --- .../Fixture/skip_undefined_method.php.inc | 38 --- .../Fixture/underscore_option.php.inc | 27 -- .../Source/SomeUserProvider.php | 8 - ...ringExtensionToConfigBuilderRectorTest.php | 28 --- .../config/configured_rule.php | 10 - .../NodeFactory/SymfonyClosureFactory.php | 45 ---- .../StringExtensionToConfigBuilderRector.php | 231 +----------------- ...rReturnTypeBasedOnSetterRequiredRector.php | 1 - .../NestedConfigCallsFactory.php | 168 ------------- ...ccessDecisionManagerConfigArrayHandler.php | 54 ---- rules/Configs/Enum/DoctrineConfigKey.php | 18 -- rules/Configs/Enum/GroupingMethods.php | 19 -- rules/Configs/Enum/SecurityConfigKey.php | 53 ---- .../SymfonyClosureExtensionMatcher.php | 115 --------- src/Utils/StringUtils.php | 3 + .../ExtensionKeyAndConfiguration.php | 26 -- 36 files changed, 13 insertions(+), 1496 deletions(-) delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/database_prefix_on_empty.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_mapping_type.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_orm_cache_driver.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Framework/framework_cache_pool.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/excluded_codes.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/two_channels.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_extension.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping_many.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm_and_dbal.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension_nested.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/null_framework_extension.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_control_many_items.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_manager.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_extension.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_provider.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_no_extension.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_undefined_method.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/underscore_option.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Source/SomeUserProvider.php delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/StringExtensionToConfigBuilderRectorTest.php delete mode 100644 rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/config/configured_rule.php delete mode 100644 rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php delete mode 100644 rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php delete mode 100644 rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php delete mode 100644 rules/Configs/Enum/DoctrineConfigKey.php delete mode 100644 rules/Configs/Enum/GroupingMethods.php delete mode 100644 rules/Configs/Enum/SecurityConfigKey.php delete mode 100644 src/NodeAnalyzer/SymfonyClosureExtensionMatcher.php delete mode 100644 src/ValueObject/ExtensionKeyAndConfiguration.php diff --git a/composer.json b/composer.json index a6ff73092..3c3d03478 100644 --- a/composer.json +++ b/composer.json @@ -8,9 +8,9 @@ "ext-xml": "*" }, "require-dev": { - "phpecs/phpecs": "^2.0.1", + "phpecs/phpecs": "^2.2", "phpstan/extension-installer": "^1.4", - "phpstan/phpstan": "^2.1.8", + "phpstan/phpstan": "^2.1.31", "phpstan/phpstan-webmozart-assert": "^2.0", "phpunit/phpunit": "^11.4", "rector/rector-src": "dev-main", diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/database_prefix_on_empty.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/database_prefix_on_empty.php.inc deleted file mode 100644 index 211aff89b..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/database_prefix_on_empty.php.inc +++ /dev/null @@ -1,27 +0,0 @@ -extension('doctrine', [ - 'dbal' => [ - 'dbname_suffix' => 'some_special_suffix', - ], - ]); -}; - -?> ------ -dbal()->connection('default')->dbnameSuffix('some_special_suffix'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_mapping_type.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_mapping_type.php.inc deleted file mode 100644 index b592df77a..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_mapping_type.php.inc +++ /dev/null @@ -1,33 +0,0 @@ -extension('doctrine', [ - 'dbal' => [ - 'connections' => [ - 'default' => [ - 'mapping_types' => [ - 'enum' => 'string', - ], - ], - ], - ], - ]); -}; - -?> ------ -dbal()->connection('default')->mappingType('enum', 'string'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_orm_cache_driver.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_orm_cache_driver.php.inc deleted file mode 100644 index fca72c35f..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Doctrine/doctrine_orm_cache_driver.php.inc +++ /dev/null @@ -1,35 +0,0 @@ -extension('doctrine', [ - 'orm' => [ - 'query_cache_driver' => [ - 'type' => 'pool', - 'pool' => 'pool_name_one', - ], - 'result_cache_driver' => [ - 'type' => 'pool', - 'pool' => 'pool_name_two', - ], - ], - ]); -}; - -?> ------ -orm()->entityManager('default')->queryCacheDriver()->type('pool')->pool('pool_name_one'); - $doctrineConfig->orm()->entityManager('default')->resultCacheDriver()->type('pool')->pool('pool_name_two'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Framework/framework_cache_pool.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Framework/framework_cache_pool.php.inc deleted file mode 100644 index da00352cb..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Framework/framework_cache_pool.php.inc +++ /dev/null @@ -1,35 +0,0 @@ -extension('framework', [ - 'cache' => [ - 'pools' => [ - 'doctrine.result_cache_pool' => [ - 'adapter' => 'some_adapter', - ], - 'doctrine.system_cache_pool' => [ - 'adapter' => 'another_adapter', - ], - ], - ], - ]); -}; - -?> ------ -cache()->pool('doctrine.result_cache_pool')->adapter('some_adapter'); - $frameworkConfig->cache()->pool('doctrine.system_cache_pool')->adapter('another_adapter'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/excluded_codes.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/excluded_codes.php.inc deleted file mode 100644 index 5228f6243..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/excluded_codes.php.inc +++ /dev/null @@ -1,30 +0,0 @@ -extension('monolog', [ - 'handlers' => [ - 'main' => [ - 'type' => 'firstType', - 'excluded_http_codes' => [400, 500] - ], - ], - ]); -}; - -?> ------ -handler('main')->type('firstType')->excludedHttpCode([400, 500]); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/two_channels.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/two_channels.php.inc deleted file mode 100644 index a13c82956..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/Monolog/two_channels.php.inc +++ /dev/null @@ -1,33 +0,0 @@ -extension('monolog', [ - 'handlers' => [ - 'main' => [ - 'type' => 'firstType', - ], - 'console' => [ - 'type' => 'secondType', - ], - ], - ]); -}; - -?> ------ -handler('main')->type('firstType'); - $monologConfig->handler('console')->type('secondType'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_extension.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_extension.php.inc deleted file mode 100644 index 27d82be8f..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_extension.php.inc +++ /dev/null @@ -1,34 +0,0 @@ -extension('doctrine', [ - 'dbal' => [ - 'default_connection' => 'default', - 'connections' => [ - 'default' => [ - 'driver' => 'pdo_pgsql', - 'host' => '%database_host%', - ], - ], - ], - ]); -}; - -?> ------ -dbal()->defaultConnection('default'); - $doctrineConfig->dbal()->connection('default')->driver('pdo_pgsql')->host('%database_host%'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping.php.inc deleted file mode 100644 index 1090f5b5d..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping.php.inc +++ /dev/null @@ -1,39 +0,0 @@ -extension('doctrine', [ - 'orm' => [ - 'entity_managers' => [ - 'default' => [ - 'naming_strategy' => 'doctrine.orm.naming_strategy.underscore', - 'mappings' => [ - 'unique_items' => [ - 'is_bundle' => false, - 'type' => 'annotation', - 'dir' => '/some-path', - 'prefix' => 'App\FirstNamespace', - ], - ], - ], - ], - ], - ]); -}; - -?> ------ -orm()->entityManager('default')->namingStrategy('doctrine.orm.naming_strategy.underscore')->mapping('unique_items')->isBundle(false)->type('annotation')->dir('/some-path')->prefix('App\FirstNamespace'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping_many.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping_many.php.inc deleted file mode 100644 index 4eedf00da..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_mapping_many.php.inc +++ /dev/null @@ -1,45 +0,0 @@ -extension('doctrine', [ - 'orm' => [ - 'entity_managers' => [ - 'default' => [ - 'naming_strategy' => 'doctrine.orm.naming_strategy.underscore', - 'mappings' => [ - 'unique_items' => [ - 'is_bundle' => false, - 'type' => 'annotation', - 'dir' => '/some-path', - 'prefix' => 'App\FirstNamespace', - ], - 'shared_hearts' => [ - 'is_bundle' => false, - 'type' => 'annotation', - 'dir' => '/another-path', - 'prefix' => 'App\SecondNamespace', - ], - ], - ], - ], - ], - ]); -}; - -?> ------ -orm()->entityManager('default')->namingStrategy('doctrine.orm.naming_strategy.underscore')->mapping('unique_items')->isBundle(false)->type('annotation')->dir('/some-path')->prefix('App\FirstNamespace')->mapping('shared_hearts')->isBundle(false)->type('annotation')->dir('/another-path')->prefix('App\SecondNamespace'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm.php.inc deleted file mode 100644 index 1a724ab4c..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm.php.inc +++ /dev/null @@ -1,47 +0,0 @@ -extension('doctrine', [ - 'orm' => [ - 'default_entity_manager' => 'default', - 'entity_managers' => [ - 'default' => [ - 'query_cache_driver' => [ - 'type' => 'pool', - 'pool' => 'doctrine.system_cache_pool', - ], - 'result_cache_driver' => [ - 'type' => 'pool2', - 'pool' => 'doctrine.result_cache_pool2', - ], - ], - 'extra' => [ - 'query_cache_driver' => [ - 'type' => 'bool', - 'pool' => 'enabled', - ], - ] - ] - ] - ]); -}; - -?> ------ -orm()->defaultEntityManager('default'); - $doctrineConfig->orm()->entityManager('default')->queryCacheDriver()->type('pool')->pool('doctrine.system_cache_pool')->resultCacheDriver()->type('pool2')->pool('doctrine.result_cache_pool2'); - $doctrineConfig->orm()->entityManager('extra')->queryCacheDriver()->type('bool')->pool('enabled'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm_and_dbal.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm_and_dbal.php.inc deleted file mode 100644 index e80d268e7..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/doctrine_orm_and_dbal.php.inc +++ /dev/null @@ -1,31 +0,0 @@ -extension('doctrine', [ - 'dbal' => [ - 'default_connection' => 'default', - ], - 'orm' => [ - 'some_value' => 'default', - ], - ]); -}; - -?> ------ -dbal()->defaultConnection('default'); - $doctrineConfig->orm()->someValue('default'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension.php.inc deleted file mode 100644 index d1f69ffe6..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension.php.inc +++ /dev/null @@ -1,50 +0,0 @@ -extension('framework', [ - 'secret' => 'onetwothree', - 'router' => [ - 'resource' => '%kernel.project_dir%/config/routing.php', - 'strict_requirements' => null, - ], - 'form' => null, - 'csrf_protection' => null, - 'validation' => [ - 'enable_annotations' => true, - ], - 'default_locale' => 'en', - 'fragments' => null, - 'http_method_override' => true, - 'session' => [ - 'cookie_secure' => true, - 'handler_id' => SomeSessionHandler::class, - ], - 'translator' => [ - 'enabled' => false, - ], - ]); -}; - -?> ------ -secret('onetwothree'); - $frameworkConfig->router()->resource('%kernel.project_dir%/config/routing.php')->strictRequirements(null); - $frameworkConfig->validation()->enableAnnotations(true); - $frameworkConfig->defaultLocale('en'); - $frameworkConfig->httpMethodOverride(true); - $frameworkConfig->session()->cookieSecure(true)->handlerId('SomeSessionHandler'); - $frameworkConfig->translator()->enabled(false); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension_nested.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension_nested.php.inc deleted file mode 100644 index bd376c152..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/framework_extension_nested.php.inc +++ /dev/null @@ -1,32 +0,0 @@ -extension('framework', [ - 'router' => [ - 'resource' => '/some-routing.php', - 'strict_requirements' => true, - ], - 'validation' => [ - 'enable_annotations' => true, - ], - ]); -}; - -?> ------ -router()->resource('/some-routing.php')->strictRequirements(true); - $frameworkConfig->validation()->enableAnnotations(true); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/null_framework_extension.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/null_framework_extension.php.inc deleted file mode 100644 index efa2a8fa6..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/null_framework_extension.php.inc +++ /dev/null @@ -1,25 +0,0 @@ -extension('framework', [ - 'form' => null, - 'csrf_protection' => null, - ]); -}; - -?> ------ - diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_control_many_items.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_control_many_items.php.inc deleted file mode 100644 index 5e224c6cd..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_control_many_items.php.inc +++ /dev/null @@ -1,37 +0,0 @@ -extension('security', [ - 'access_control' => [ - [ - 'path' => '^/first', - 'role' => 'PUBLIC_ACCESS', - ], - [ - 'path' => '^/second', - 'role' => 'PUBLIC_ACCESS', - ], - ], - ]); -}; - -?> ------ -accessControl()->path('^/first')->roles(['PUBLIC_ACCESS']); - $securityConfig->accessControl()->path('^/second')->roles(['PUBLIC_ACCESS']); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_manager.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_manager.php.inc deleted file mode 100644 index 4b3522326..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_access_manager.php.inc +++ /dev/null @@ -1,29 +0,0 @@ -extension('security', [ - 'access_decision_manager' => [ - 'strategy' => 'unanimous', - ], - ]); -}; - -?> ------ -accessDecisionManager()->strategy('unanimous'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_extension.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_extension.php.inc deleted file mode 100644 index 7b2e5ec53..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_extension.php.inc +++ /dev/null @@ -1,38 +0,0 @@ -extension('security', [ - 'providers' => [ - 'webservice' => [ - 'id' => SomeUserProvider::class, - ], - ], - 'firewalls' => [ - 'dev' => [ - 'pattern' => '^/(_(profiler|wdt)|css|images|js)/', - 'security' => false, - ], - ], - ]); -}; - -?> ------ -provider()->id('Rector\Symfony\Tests\CodeQuality\Rector\Closure\StringExtensionToConfigBuilderRector\Source\SomeUserProvider'); - $securityConfig->firewall()->pattern('^/(_(profiler|wdt)|css|images|js)/')->security(false); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_provider.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_provider.php.inc deleted file mode 100644 index a8d6daf38..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/security_provider.php.inc +++ /dev/null @@ -1,30 +0,0 @@ -extension('security', [ - 'entity' => [ - 'class' => 'App\SomeClass', - 'property' => 'apiKey', - ], - ]); -}; - -?> ------ -entity()->class('App\SomeClass')->property('apiKey'); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_no_extension.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_no_extension.php.inc deleted file mode 100644 index bd0f0e5bd..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_no_extension.php.inc +++ /dev/null @@ -1,31 +0,0 @@ -services(); - - $services->alias(RequestFactoryInterface::class, 'http_discovery.psr17_factory'); - - $services->alias(ResponseFactoryInterface::class, 'http_discovery.psr17_factory'); - - $services->alias(ServerRequestFactoryInterface::class, 'http_discovery.psr17_factory'); - - $services->alias(StreamFactoryInterface::class, 'http_discovery.psr17_factory'); - - $services->alias(UploadedFileFactoryInterface::class, 'http_discovery.psr17_factory'); - - $services->alias(UriFactoryInterface::class, 'http_discovery.psr17_factory'); - - $services->set('http_discovery.psr17_factory', Psr17Factory::class); -}; \ No newline at end of file diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_undefined_method.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_undefined_method.php.inc deleted file mode 100644 index 57c7f2730..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/skip_undefined_method.php.inc +++ /dev/null @@ -1,38 +0,0 @@ -extension('security', [ - 'password_hashers' => [ - PasswordAuthenticatedUserInterface::class => 'auto', - ], - 'providers' => [ - 'app_user_provider' => [ - 'id' => SecurityUserProvider::class, - ], - ], - 'firewalls' => [ - 'dev' => [ - 'pattern' => '^/(_(profiler|wdt)|css|images|js)/', - 'security' => false, - 'stateless' => false, - ], - 'main' => [ - 'lazy' => true, - 'provider' => 'app_user_provider', - 'stateless' => false, - 'json_login' => [ - 'check_path' => 'api_login', - 'username_path' => 'email', - 'password_path' => 'password', - ], - ], - ], - 'access_control' => null, - ]); -}; diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/underscore_option.php.inc b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/underscore_option.php.inc deleted file mode 100644 index c3bd3f0d6..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Fixture/underscore_option.php.inc +++ /dev/null @@ -1,27 +0,0 @@ -extension('framework', [ - 'default_locale' => 'en', - 'http_method_override' => true, - ]); -}; - -?> ------ -defaultLocale('en'); - $frameworkConfig->httpMethodOverride(true); -}; - -?> diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Source/SomeUserProvider.php b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Source/SomeUserProvider.php deleted file mode 100644 index 12c528f38..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/Source/SomeUserProvider.php +++ /dev/null @@ -1,8 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; - } -} diff --git a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/config/configured_rule.php b/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/config/configured_rule.php deleted file mode 100644 index 8480c6d5a..000000000 --- a/rules-tests/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector/config/configured_rule.php +++ /dev/null @@ -1,10 +0,0 @@ -rule(StringExtensionToConfigBuilderRector::class); -}; diff --git a/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php b/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php deleted file mode 100644 index 3cd2bb7ba..000000000 --- a/rules/CodeQuality/NodeFactory/SymfonyClosureFactory.php +++ /dev/null @@ -1,45 +0,0 @@ -params[0] = $this->createConfigParam($configClass); - $closure->stmts = $stmts; - - return $closure; - } - - private function createConfigParam(string $configClass): Param - { - $configVariable = $this->createConfigVariable($configClass); - $fullyQualified = new FullyQualified($configClass); - - return new Param($configVariable, null, $fullyQualified); - } - - private function createConfigVariable(string $configClass): Variable - { - $variableName = $this->propertyNaming->fqnToVariableName($configClass); - return new Variable($variableName); - } -} diff --git a/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php b/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php index d9dd3b16d..6ad5e5f9b 100644 --- a/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php +++ b/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php @@ -5,68 +5,19 @@ namespace Rector\Symfony\CodeQuality\Rector\Closure; use PhpParser\Node; -use PhpParser\Node\Expr\Array_; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Stmt\Expression; -use Rector\Naming\Naming\PropertyNaming; -use Rector\PhpParser\Node\Value\ValueResolver; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\Symfony\CodeQuality\NodeFactory\SymfonyClosureFactory; -use Rector\Symfony\Configs\ConfigArrayHandler\NestedConfigCallsFactory; -use Rector\Symfony\Configs\ConfigArrayHandler\SecurityAccessDecisionManagerConfigArrayHandler; -use Rector\Symfony\Configs\Enum\DoctrineConfigKey; -use Rector\Symfony\Configs\Enum\SecurityConfigKey; -use Rector\Symfony\NodeAnalyzer\SymfonyClosureExtensionMatcher; -use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; -use Rector\Symfony\Utils\StringUtils; -use Rector\Symfony\ValueObject\ExtensionKeyAndConfiguration; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use Webmozart\Assert\Assert; /** * @changelog https://symfony.com/blog/new-in-symfony-5-3-config-builder-classes - * - * @see \Rector\Symfony\Tests\CodeQuality\Rector\Closure\StringExtensionToConfigBuilderRector\StringExtensionToConfigBuilderRectorTest + * @deprecated as feature deprecated in Symfony 7.4 https://github.com/symfony/symfony/pull/62135 */ -final class StringExtensionToConfigBuilderRector extends AbstractRector +final class StringExtensionToConfigBuilderRector extends AbstractRector implements DeprecatedInterface { - /** - * @var array - */ - private const EXTENSION_KEY_TO_CLASS_MAP = [ - 'security' => 'Symfony\Config\SecurityConfig', - 'framework' => 'Symfony\Config\FrameworkConfig', - 'monolog' => 'Symfony\Config\MonologConfig', - 'twig' => 'Symfony\Config\TwigConfig', - 'doctrine' => 'Symfony\Config\DoctrineConfig', - 'doctrine_migrations' => 'Symfony\Config\DoctrineMigrationsConfig', - 'sentry' => 'Symfony\Config\SentryConfig', - 'web_profiler' => 'Symfony\Config\WebProfilerConfig', - 'debug' => 'Symfony\Config\DebugConfig', - 'maker' => 'Symfony\Config\MakerConfig', - 'nelmio_cors' => 'Symfony\Config\NelmioCorsConfig', - 'api_platform' => 'Symfony\Config\ApiPlatformConfig', - // @see https://github.com/thephpleague/flysystem-bundle/blob/3.x/src/DependencyInjection/Configuration.php - 'flysystem' => 'Symfony\Config\FlysystemConfig', - ]; - - public function __construct( - private readonly SymfonyPhpClosureDetector $symfonyPhpClosureDetector, - private readonly SymfonyClosureExtensionMatcher $symfonyClosureExtensionMatcher, - private readonly PropertyNaming $propertyNaming, - private readonly ValueResolver $valueResolver, - private readonly NestedConfigCallsFactory $nestedConfigCallsFactory, - private readonly SecurityAccessDecisionManagerConfigArrayHandler $securityAccessDecisionManagerConfigArrayHandler, - private readonly SymfonyClosureFactory $symfonyClosureFactory - ) { - // make sure to avoid duplicates - Assert::uniqueValues(self::EXTENSION_KEY_TO_CLASS_MAP); - Assert::uniqueValues(array_keys(self::EXTENSION_KEY_TO_CLASS_MAP)); - } - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition('Convert PHP fluent configs to Symfony 5.3 builder classes with method API', [ @@ -113,175 +64,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (! $this->symfonyPhpClosureDetector->detect($node)) { - return null; - } - - $extensionKeyAndConfiguration = $this->symfonyClosureExtensionMatcher->match($node); - if (! $extensionKeyAndConfiguration instanceof ExtensionKeyAndConfiguration) { - return null; - } - - $configClass = self::EXTENSION_KEY_TO_CLASS_MAP[$extensionKeyAndConfiguration->getKey()] ?? null; - if ($configClass === null) { - // better return null, to avoid failure on 3rd party extension that do not have a config class - return null; - } - - $configVariable = $this->createConfigVariable($configClass); - - $methodCallStmts = $this->createMethodCallStmts($extensionKeyAndConfiguration->getArray(), $configVariable); - if ($methodCallStmts === null) { - return null; - } - - return $this->symfonyClosureFactory->create($configClass, $node, $methodCallStmts); - } - - /** - * @return array> - */ - private function createMethodCallStmts(Array_ $configurationArray, Variable $configVariable): ?array - { - $methodCallStmts = []; - - $configurationValues = $this->valueResolver->getValue($configurationArray); - - foreach ($configurationValues as $key => $value) { - $splitMany = false; - $nested = false; - $nextKeyArgument = false; - - if (in_array($key, [DoctrineConfigKey::DBAL, DoctrineConfigKey::ORM], true)) { - // doctrine - $methodCallName = $key; - $splitMany = true; - $nested = true; - - } elseif ($key === 'handlers') { - // monolog - $methodCallName = 'handler'; - $splitMany = true; - $nextKeyArgument = true; - - } elseif ($key === SecurityConfigKey::PROVIDERS) { - // symfony security - $methodCallName = SecurityConfigKey::PROVIDER; - $splitMany = true; - } elseif ($key === SecurityConfigKey::FIREWALLS) { - $methodCallName = SecurityConfigKey::FIREWALL; - $splitMany = true; - } elseif ($key === SecurityConfigKey::ACCESS_CONTROL) { - $splitMany = true; - $methodCallName = 'accessControl'; - } else { - $methodCallName = StringUtils::underscoreToCamelCase($key); - } - - // security - if (in_array($key, [SecurityConfigKey::ACCESS_DECISION_MANAGER, SecurityConfigKey::ENTITY], true)) { - $mainMethodName = StringUtils::underscoreToCamelCase($key); - - $accessDecisionManagerMethodCalls = $this->securityAccessDecisionManagerConfigArrayHandler->handle( - $configurationArray, - $configVariable, - $mainMethodName - ); - - if ($accessDecisionManagerMethodCalls !== []) { - $methodCallStmts = array_merge($methodCallStmts, $accessDecisionManagerMethodCalls); - continue; - } - } - - if ($splitMany) { - $currentConfigCaller = $nested ? new MethodCall($configVariable, $methodCallName) : $configVariable; - if (! is_array($value)) { - return null; - } - - foreach ($value as $itemName => $itemConfiguration) { - if ($nested && is_array($itemConfiguration)) { - $methodCallName = $itemName; - } - - if (! is_array($itemConfiguration)) { - // simple call - $args = $this->nodeFactory->createArgs([$itemConfiguration]); - - $itemName = StringUtils::underscoreToCamelCase($itemName); - - // doctrine: implicit default connection now must be explicit - // this option requires call on connection(...) - if ($currentConfigCaller instanceof MethodCall && $this->isName( - $currentConfigCaller->name, - 'dbal' - ) && $itemName === 'dbnameSuffix') { - $currentConfigCaller = new MethodCall( - $currentConfigCaller, - 'connection', - $this->nodeFactory->createArgs(['default']) - ); - } - - $methodCall = new MethodCall($currentConfigCaller, $itemName, $args); - $methodCallStmts[] = new Expression($methodCall); - continue; - } - - if ($currentConfigCaller instanceof MethodCall && $this->isName( - $currentConfigCaller->name, - 'orm' - ) && in_array($itemName, ['query_cache_driver', 'result_cache_driver'], true)) { - // implicit entityManagerDefault(...) - $currentConfigCaller = new MethodCall( - $currentConfigCaller, - 'entityManager', - $this->nodeFactory->createArgs(['default']) - ); - } - - $nextMethodCallExpressions = $this->nestedConfigCallsFactory->create( - [$itemConfiguration], - $currentConfigCaller, - $methodCallName, - $nextKeyArgument, - $itemName - ); - - $methodCallStmts = array_merge($methodCallStmts, $nextMethodCallExpressions); - } - } else { - // skip empty values - if ($value === null) { - continue; - } - - $simpleMethodName = StringUtils::underscoreToCamelCase($key); - - if (is_array($value)) { - $simpleMethodCallStmts = $this->nestedConfigCallsFactory->create( - [$value], - $configVariable, - $simpleMethodName, - false, - ); - - $methodCallStmts = array_merge($methodCallStmts, $simpleMethodCallStmts); - } else { - $args = $this->nodeFactory->createArgs([$value]); - $methodCall = new MethodCall($configVariable, $simpleMethodName, $args); - $methodCallStmts[] = new Expression($methodCall); - } - } - } - - return $methodCallStmts; - } - - private function createConfigVariable(string $configClass): Variable - { - $variableName = $this->propertyNaming->fqnToVariableName($configClass); - return new Variable($variableName); + throw new ShouldNotHappenException(sprintf( + 'The "%s" rector is deprecated as Symfony deprecated the feature in 7.4. See https://github.com/symfony/symfony/pull/62135', + self::class + )); } } diff --git a/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php b/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php index 9f9dcffe0..6d725987c 100644 --- a/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php +++ b/rules/CodeQuality/Rector/Trait_/AddTraitGetterReturnTypeBasedOnSetterRequiredRector.php @@ -16,7 +16,6 @@ use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; use Rector\Rector\AbstractRector; use Rector\Symfony\Enum\SymfonyAttribute; -use Rector\Symfony\Enum\SymfonyClass; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; diff --git a/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php b/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php deleted file mode 100644 index 260c06260..000000000 --- a/rules/Configs/ConfigArrayHandler/NestedConfigCallsFactory.php +++ /dev/null @@ -1,168 +0,0 @@ - - */ - private const METHOD_RENAMES = [ - // monolog - 'excludedHttpCodes' => 'excludedHttpCode', - // doctrine - 'result_cache_driver' => 'resultCacheDriver', - 'query_cache_driver' => 'queryCacheDriver', - ]; - - public function __construct( - private NodeFactory $nodeFactory - ) { - } - - /** - * @param mixed[] $values - * @return array> - */ - public function create( - array $values, - Variable|MethodCall $configCaller, - string $mainMethodName, - bool $nextKeyArgument, - string|int|null $nextKey = null - ): array { - $methodCallStmts = []; - - foreach ($values as $key => $value) { - if (is_array($value)) { - // symfony framework cache - if ($mainMethodName === 'cache') { - $configCaller = new MethodCall($configCaller, 'cache', []); - - foreach ($value as $subKey => $subValue) { - if ($subKey === 'pools') { - foreach ($subValue as $poolName => $poolConfiguration) { - $poolMethodCall = new MethodCall($configCaller, 'pool', [ - new Arg(new String_($poolName)), - ]); - - foreach ($poolConfiguration as $poolMethodName => $poolParameters) { - Assert::string($poolMethodName); - - $poolMethodCall = new MethodCall( - $poolMethodCall, - $poolMethodName, - $this->nodeFactory->createArgs([$poolParameters]), - ); - } - - $methodCallStmts[] = new Expression($poolMethodCall); - } - } - } - - continue; - } - - // doctrine - foreach (GroupingMethods::GROUPING_METHOD_NAME_TO_SPLIT as $groupingMethodName => $splitMethodName) { - if ($mainMethodName === $groupingMethodName) { - // @possibly here - foreach ($value as $connectionName => $connectionConfiguration) { - $connectionArgs = $this->nodeFactory->createArgs([$connectionName]); - - $connectionMethodCall = new MethodCall($configCaller, $splitMethodName, $connectionArgs); - $connectionMethodCall = $this->createMainMethodCall( - $connectionConfiguration, - $connectionMethodCall - ); - - $methodCallStmts[] = new Expression($connectionMethodCall); - } - - continue 2; - } - } - - $mainMethodName = self::METHOD_RENAMES[$mainMethodName] ?? $mainMethodName; - - $mainMethodCall = new MethodCall($configCaller, $mainMethodName); - if ($key === 0 && $nextKeyArgument && is_string($nextKey)) { - $mainMethodCall->args[] = new Arg(new String_($nextKey)); - } - - $mainMethodCall = $this->createMainMethodCall($value, $mainMethodCall); - $methodCallStmts[] = new Expression($mainMethodCall); - } - } - - return $methodCallStmts; - } - - /** - * @param array $value - */ - private function createMainMethodCall(array $value, MethodCall $mainMethodCall): MethodCall - { - foreach ($value as $methodName => $parameters) { - Assert::string($methodName); - - // security - if ($methodName === SecurityConfigKey::ROLE) { - $methodName = SecurityConfigKey::ROLES; - $parameters = [$parameters]; - } else { - $methodName = StringUtils::underscoreToCamelCase($methodName); - } - - $methodName = self::METHOD_RENAMES[$methodName] ?? $methodName; - - // special case for dbal()->connection() - if ($methodName === 'mappingTypes') { - foreach ($parameters as $name => $type) { - $args = $this->nodeFactory->createArgs([$name, $type]); - $mainMethodCall = new MethodCall($mainMethodCall, 'mappingType', $args); - } - - continue; - } elseif (isset(GroupingMethods::GROUPING_METHOD_NAME_TO_SPLIT[$methodName])) { - $splitMethodName = GroupingMethods::GROUPING_METHOD_NAME_TO_SPLIT[$methodName]; - - foreach ($parameters as $splitName => $splitParameters) { - $args = $this->nodeFactory->createArgs([$splitName]); - $mainMethodCall = new MethodCall($mainMethodCall, $splitMethodName, $args); - - $mainMethodCall = $this->createMainMethodCall($splitParameters, $mainMethodCall); - } - - continue; - } - - // traverse nested arrays with recursion call - if (is_array($parameters) && ! array_is_list($parameters)) { - $mainMethodCall = new MethodCall($mainMethodCall, $methodName); - $mainMethodCall = $this->createMainMethodCall($parameters, $mainMethodCall); - - continue; - } - - $args = $this->nodeFactory->createArgs([$parameters]); - $mainMethodCall = new MethodCall($mainMethodCall, $methodName, $args); - } - - return $mainMethodCall; - } -} diff --git a/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php b/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php deleted file mode 100644 index bf07acad5..000000000 --- a/rules/Configs/ConfigArrayHandler/SecurityAccessDecisionManagerConfigArrayHandler.php +++ /dev/null @@ -1,54 +0,0 @@ -> - */ - public function handle(Array_ $array, Variable $variable, string $mainMethodName): array - { - if (! $array->items[0] instanceof ArrayItem) { - return []; - } - - $configurationArrayItem = $array->items[0]; - - $nestedArray = $configurationArrayItem->value; - if (! $nestedArray instanceof Array_) { - return []; - } - - // build accessControl() method call here - $accessDecisionManagerMethodCall = new MethodCall($variable, $mainMethodName); - - foreach ($nestedArray->items as $nestedArrayItem) { - if (! $nestedArrayItem instanceof ArrayItem) { - continue; - } - - if (! $nestedArrayItem->key instanceof String_) { - continue; - } - - $methodNameString = $nestedArrayItem->key; - $methodName = $methodNameString->value; - - $args = [new Arg($nestedArrayItem->value)]; - $accessDecisionManagerMethodCall = new MethodCall($accessDecisionManagerMethodCall, $methodName, $args); - } - - return [new Expression($accessDecisionManagerMethodCall)]; - } -} diff --git a/rules/Configs/Enum/DoctrineConfigKey.php b/rules/Configs/Enum/DoctrineConfigKey.php deleted file mode 100644 index b05b1210e..000000000 --- a/rules/Configs/Enum/DoctrineConfigKey.php +++ /dev/null @@ -1,18 +0,0 @@ - - */ - public const GROUPING_METHOD_NAME_TO_SPLIT = [ - 'connections' => 'connection', - 'entity_managers' => 'entityManager', - 'mappings' => 'mapping', - 'handlers' => 'handler', - 'pools' => 'pool', - ]; -} diff --git a/rules/Configs/Enum/SecurityConfigKey.php b/rules/Configs/Enum/SecurityConfigKey.php deleted file mode 100644 index 52f8a56ae..000000000 --- a/rules/Configs/Enum/SecurityConfigKey.php +++ /dev/null @@ -1,53 +0,0 @@ -stmts) > 1) { - $extensionNames = $this->resolveExtensionNames($closure); - if (count($extensionNames) > 2) { - return null; - } - - if ($extensionNames === []) { - return null; - } - - // warn use early about it, to avoid silent skip - $errorMessage = sprintf( - 'Split extensions "%s" to multiple separated files first', - implode('", "', $extensionNames) - ); - - throw new ShouldNotHappenException($errorMessage); - } - - // must be exactly single line - if (count($closure->stmts) !== 1) { - return null; - } - - $onlyStmt = $closure->stmts[0]; - if (! $onlyStmt instanceof Expression) { - return null; - } - - if (! $onlyStmt->expr instanceof MethodCall) { - return null; - } - - $methodCall = $onlyStmt->expr; - - $args = $methodCall->getArgs(); - $extensionKey = $this->matchExtensionName($methodCall); - - if (! is_string($extensionKey)) { - return null; - } - - $secondArg = $args[1]; - if (! $secondArg->value instanceof Array_) { - return null; - } - - return new ExtensionKeyAndConfiguration($extensionKey, $secondArg->value); - } - - private function matchExtensionName(MethodCall $methodCall): ?string - { - if (! $this->nodeNameResolver->isName($methodCall->name, 'extension')) { - return null; - } - - $args = $methodCall->getArgs(); - - $firstArg = $args[0]; - return $this->valueResolver->getValue($firstArg->value); - } - - /** - * @return string[] - */ - private function resolveExtensionNames(Closure $closure): array - { - $extensionNames = []; - - foreach ($closure->stmts as $stmt) { - if (! $stmt instanceof Expression) { - continue; - } - - $expr = $stmt->expr; - if (! $expr instanceof MethodCall) { - continue; - } - - $extensionName = $this->matchExtensionName($expr); - if (! is_string($extensionName)) { - continue; - } - - $extensionNames[] = $extensionName; - } - - return $extensionNames; - } -} diff --git a/src/Utils/StringUtils.php b/src/Utils/StringUtils.php index 649dd05ca..a4cb06388 100644 --- a/src/Utils/StringUtils.php +++ b/src/Utils/StringUtils.php @@ -4,6 +4,9 @@ namespace Rector\Symfony\Utils; +/** + * @api might be used soon + */ final class StringUtils { public static function underscoreToCamelCase(string $value): string diff --git a/src/ValueObject/ExtensionKeyAndConfiguration.php b/src/ValueObject/ExtensionKeyAndConfiguration.php deleted file mode 100644 index 8aa884093..000000000 --- a/src/ValueObject/ExtensionKeyAndConfiguration.php +++ /dev/null @@ -1,26 +0,0 @@ -key; - } - - public function getArray(): Array_ - { - return $this->array; - } -}