I tried this config:
rectors:
Rector\Rector\Dynamic\ClassReplacerRector:
'Twig_Extension': 'Twig\Extension\AbstractExtension'
on this file
But no use statements were inserted 😕
I'll look on it today, it should work.
Could you provide full CLI command and it's output you used (screenshot would do)? Just to have more data.
Thank you
It was at home and I'm at work, but IIRC I used a command that ended with src/Twig --config the_config_file_above.
Thanks. Could you also provide the output? Just to be sure what happened
It looks like that specific file and rector passes: https://github.com/rectorphp/rector/pull/154/commits/28c672312b85d093668067bd915fe7dcbb1a7b4e#diff-44c5e45148accc6d2d43a0619174829d
There will be another problem.
I will try running that on whole directory tomorrow
The output:
1 Loaded Rector
===============
- Rector\Rector\Dynamic\ClassReplacerRector
Processing files
================
- src/Twig/Extension/DeprecatedTextExtension.php
- src/Twig/Extension/FlashMessageExtension.php
- src/Twig/Extension/FormTypeExtension.php
- src/Twig/Extension/StatusExtension.php
- src/Twig/Extension/TemplateExtension.php
- src/Twig/Node/TemplateBoxNode.php
- src/Twig/TokenParser/TemplateBoxTokenParser.php
4 Changed Files
===============
- src/Twig/Extension/FlashMessageExtension.php
- src/Twig/Extension/FormTypeExtension.php
- src/Twig/Extension/StatusExtension.php
- src/Twig/Extension/TemplateExtension.php
[OK] Rector is done!
The result:
git --no-pager diff
diff --git a/src/Twig/Extension/FlashMessageExtension.php b/src/Twig/Extension/FlashMessageExtension.php
index 6aa9f0b..7e9cd64 100644
--- a/src/Twig/Extension/FlashMessageExtension.php
+++ b/src/Twig/Extension/FlashMessageExtension.php
@@ -18,7 +18,7 @@ use Sonata\CoreBundle\FlashMessage\FlashManager;
*
* @author Vincent Composieux <[email protected]>
*/
-class FlashMessageExtension extends \Twig_Extension
+class FlashMessageExtension extends AbstractExtension
{
/**
* @var FlashManager
diff --git a/src/Twig/Extension/FormTypeExtension.php b/src/Twig/Extension/FormTypeExtension.php
index 4f7a96b..422ebef 100644
--- a/src/Twig/Extension/FormTypeExtension.php
+++ b/src/Twig/Extension/FormTypeExtension.php
@@ -11,7 +11,7 @@
namespace Sonata\CoreBundle\Twig\Extension;
-class FormTypeExtension extends \Twig_Extension implements \Twig_Extension_GlobalsInterface
+class FormTypeExtension extends AbstractExtension implements \Twig_Extension_GlobalsInterface
{
/**
* @var bool
diff --git a/src/Twig/Extension/StatusExtension.php b/src/Twig/Extension/StatusExtension.php
index 5de249f..fff983a 100644
--- a/src/Twig/Extension/StatusExtension.php
+++ b/src/Twig/Extension/StatusExtension.php
@@ -16,7 +16,7 @@ use Sonata\CoreBundle\Component\Status\StatusClassRendererInterface;
/**
* @author Hugo Briand <[email protected]>
*/
-class StatusExtension extends \Twig_Extension
+class StatusExtension extends AbstractExtension
{
/**
* @var StatusClassRendererInterface[]
diff --git a/src/Twig/Extension/TemplateExtension.php b/src/Twig/Extension/TemplateExtension.php
index e60d274..1f3a005 100644
--- a/src/Twig/Extension/TemplateExtension.php
+++ b/src/Twig/Extension/TemplateExtension.php
@@ -15,7 +15,7 @@ use Sonata\CoreBundle\Model\Adapter\AdapterInterface;
use Sonata\CoreBundle\Twig\TokenParser\TemplateBoxTokenParser;
use Symfony\Component\Translation\TranslatorInterface;
-class TemplateExtension extends \Twig_Extension
+class TemplateExtension extends AbstractExtension
I'd expect use statements to be inserted.
Closed by accident, this need some more work.
Could you try current master?
Now you can use also single file, which should make it easier to debug specific file:
vendor/bin/rector process src/Twig/Extension/FlashMessageExtension.php --config your-config.yml
I'd expect use statements to be inserted.
As for coding standard, it is out of scope of Rector. I've discussed this with few peoples and the main view is that Rectors should only do changes and let user handle the styling as he or she want - here some people prefer FQN and some don't.
See docs to find more.
The fixer you'll need is being worked on: https://github.com/Symplify/Symplify/pull/421
For now let's focus on Rector's part and be sure it works
Update!
The fixer is ready in symlify/easy-coding-standard:@dev and symlify/coding-standard:@dev.
You can use them.
I'm actually waiting for Symfony 4 to be release, before releasing them in Symplify 3 to cover recent BC breaks.
Great! I should be able to try that the day after tomorrow
I can confirm, it works great! Let's try simplify now.
It's not very easy to install because there are no branch aliases. Consider adding them.
I managed to use it on another project but on this particular one I get:
vendor/bin/ecs -vvv check src/Twig --fix
[ERROR] Class 'Symplify\PackageBuilder\Configuration\LevelConfigShortcutFinder' not found
Ok I used the dev-master version of package builder too, it works.
I tried to start from scratch, now it no longer works because this class does not exist.
Here is the script I tried:
#!/bin/bash -eux
cat > easy-coding-standard.neon <<'EOT'
checkers:
Symplify\CodingStandard\Fixer\Import\ImportNamespacedNameFixer:
allow_single_names: true # false by default
EOT
cat > twig_namespaced.yml <<'EOT'
rectors:
Rector\Rector\Dynamic\ClassReplacerRector:
'Twig_Extension': 'Twig\Extension\AbstractExtension'
EOT
composer require --dev \
symplify/coding-standard "dev-master as 3.0" \
symplify/easy-coding-standard "dev-master as 3.0" \
symplify/package-builder "dev-master as 3.0" \
rector/rector @dev \
nikic/php-parser 'dev-master#5900d78 as v3.1.1'
vendor/bin/rector process src/Twig --config twig_namespaced.yml
vendor/bin/ecs -vvv check src/Twig --fix
I managed to make it work:
#!/bin/bash -eux
cat > easy-coding-standard.neon <<'EOT'
checkers:
Symplify\CodingStandard\Fixer\Import\ImportNamespacedNameFixer:
allow_single_names: true # false by default
EOT
cat > twig_namespaced.yml <<'EOT'
rectors:
Rector\Rector\Dynamic\ClassReplacerRector:
'Twig_Extension': 'Twig\Extension\AbstractExtension'
EOT
composer require --dev \
symplify/coding-standard "dev-master as 3.0" \
symplify/easy-coding-standard "dev-master as 3.0" \
symplify/package-builder "3.0.0-RC1 as 3.0" \
rector/rector @dev \
nikic/php-parser 'dev-master#5900d78 as v3.1.1'
vendor/bin/rector process src/Twig --config twig_namespaced.yml
composer require --dev symplify/package-builder "dev-master as 3.0"
vendor/bin/ecs -vvv check src/Twig --fix
Okay let's generate a list of class aliases:
grep -r class_alias vendor/twig|cut -d '(' -f2|cut -d ',' -f 1-2| tr ',' ':'
@greg0ire Could you not simply use PseudoNamespaceToNamespaceRector?
@Soullivaneuh no, as you see, it's not that simple, it does not map cleanly:
'Twig_Extension': 'Twig\Extension\AbstractExtension'
You can combine both with class priority to specify those exceptions. And PseudoNamespaceToNamespaceRector handle the rest
This is getting harder and harder to install 😅
Ah I managed to install it again! sf4 was already installed and was causing conflicts...
dang
[ERROR] Class 'Symplify\PackageBuilder\DependencyInjection\DefinitionCollector' not found in
/home/greg/dev/SonataAdminBundle/vendor/rector/rector/src/DependencyInjection/CompilerPass/CollectorCompilerPas
s.php on line 25
Let's try package builder RC3
Great it works, now I can focus on the set.
Here is how it looks now:
#!/bin/bash -eu
cat > easy-coding-standard.neon <<'EOT'
checkers:
Symplify\CodingStandard\Fixer\Import\ImportNamespacedNameFixer:
allow_single_names: true # false by default
EOT
cat > twig_namespaced.yml <<'EOT'
rectors:
Rector\Rector\Dynamic\ClassReplacerRector:
'Twig_Extension': 'Twig\Extension\AbstractExtension'
'Twig_LoaderInterface': 'Twig\Loader\LoaderInterface'
'Twig_Extension_StringLoader': 'Twig\Extension\StringLoaderExtension'
'Twig_Extension_Optimizer': 'Twig\Extension\OptimizerExtension'
'Twig_Extension_Debug': 'Twig\Extension\DebugExtension'
'Twig_Extension_Sandbox': 'Twig\Extension\SandboxExtension'
'Twig_Extension_Profiler': 'Twig\Extension\ProfilerExtension'
'Twig_Extension_Escaper': 'Twig\Extension\EscaperExtension'
'Twig_Extension_Staging': 'Twig\Extension\StagingExtension'
'Twig_Extension_Core': 'Twig\Extension\CoreExtension'
'Twig_Node': 'Twig\Node\Node'
'Twig_NodeVisitor_Optimizer': 'Twig\NodeVisitor\OptimizerNodeVisitor'
'Twig_NodeVisitor_SafeAnalysis': 'Twig\NodeVisitor\SafeAnalysisNodeVisitor'
'Twig_NodeVisitor_Sandbox': 'Twig\NodeVisitor\SandboxNodeVisitor'
'Twig_NodeVisitor_Escaper': 'Twig\NodeVisitor\EscaperNodeVisitor'
'Twig_SimpleFunction': 'Twig\TwigFunction'
'Twig_Function': 'Twig\TwigFunction'
'Twig_Error_Syntax': 'Twig\Error\SyntaxError'
'Twig_Error_Loader': 'Twig\Error\LoaderError'
'Twig_Error_Runtime': 'Twig\Error\RuntimeError'
'Twig_TokenParser': 'Twig\TokenParser\AbstractTokenParser'
'Twig_TokenParserInterface': 'Twig\TokenParser\TokenParserInterface'
'Twig_CacheInterface': 'Twig\Cache\CacheInterface'
'Twig_NodeVisitorInterface': 'Twig\NodeVisitor\NodeVisitorInterface'
'Twig_Profiler_NodeVisitor_Profiler': 'Twig\Profiler\NodeVisitor\ProfilerNodeVisitor'
'Twig_Profiler_Dumper_Text': 'Twig\Profiler\Dumper\TextDumper'
'Twig_Profiler_Dumper_Base': 'Twig\Profiler\Dumper\BaseDumper'
'Twig_Profiler_Dumper_Blackfire': 'Twig\Profiler\Dumper\BlackfireDumper'
'Twig_Profiler_Dumper_Html': 'Twig\Profiler\Dumper\HtmlDumper'
'Twig_Profiler_Node_LeaveProfile': 'Twig\Profiler\Node\LeaveProfileNode'
'Twig_Profiler_Node_EnterProfile': 'Twig\Profiler\Node\EnterProfileNode'
'Twig_Error': 'Twig\Error\Error'
'Twig_ExistsLoaderInterface': 'Twig\Loader\ExistsLoaderInterface'
'Twig_SimpleTest': 'Twig\TwigTest'
'Twig_Test': 'Twig\TwigTest'
'Twig_FactoryRuntimeLoader': 'Twig\RuntimeLoader\FactoryRuntimeLoader'
'Twig_NodeOutputInterface': 'Twig\Node\NodeOutputInterface'
'Twig_SimpleFilter': 'Twig\TwigFilter'
'Twig_Filter': 'Twig\TwigFilter'
'Twig_Loader_Chain': 'Twig\Loader\ChainLoader'
'Twig_Loader_Array': 'Twig\Loader\ArrayLoader'
'Twig_Loader_Filesystem': 'Twig\Loader\FilesystemLoader'
'Twig_Cache_Null': 'Twig\Cache\NullCache'
'Twig_Cache_Filesystem': 'Twig\Cache\FilesystemCache'
'Twig_NodeCaptureInterface': 'Twig\Node\NodeCaptureInterface'
'Twig_Extension': 'Twig\Extension\AbstractExtension'
'Twig_TokenParser_Macro': 'Twig\TokenParser\MacroTokenParser'
'Twig_TokenParser_Embed': 'Twig\TokenParser\EmbedTokenParser'
'Twig_TokenParser_Do': 'Twig\TokenParser\DoTokenParser'
'Twig_TokenParser_From': 'Twig\TokenParser\FromTokenParser'
'Twig_TokenParser_Extends': 'Twig\TokenParser\ExtendsTokenParser'
'Twig_TokenParser_Set': 'Twig\TokenParser\SetTokenParser'
'Twig_TokenParser_Sandbox': 'Twig\TokenParser\SandboxTokenParser'
'Twig_TokenParser_AutoEscape': 'Twig\TokenParser\AutoEscapeTokenParser'
'Twig_TokenParser_With': 'Twig\TokenParser\WithTokenParser'
'Twig_TokenParser_Include': 'Twig\TokenParser\IncludeTokenParser'
'Twig_TokenParser_Block': 'Twig\TokenParser\BlockTokenParser'
'Twig_TokenParser_Filter': 'Twig\TokenParser\FilterTokenParser'
'Twig_TokenParser_If': 'Twig\TokenParser\IfTokenParser'
'Twig_TokenParser_For': 'Twig\TokenParser\ForTokenParser'
'Twig_TokenParser_Flush': 'Twig\TokenParser\FlushTokenParser'
'Twig_TokenParser_Spaceless': 'Twig\TokenParser\SpacelessTokenParser'
'Twig_TokenParser_Use': 'Twig\TokenParser\UseTokenParser'
'Twig_TokenParser_Import': 'Twig\TokenParser\ImportTokenParser'
'Twig_ContainerRuntimeLoader': 'Twig\RuntimeLoader\ContainerRuntimeLoader'
'Twig_SourceContextLoaderInterface': 'Twig\Loader\SourceContextLoaderInterface'
'Twig_NodeTraverser': 'Twig\NodeTraverser'
'Twig_ExtensionInterface': 'Twig\Extension\ExtensionInterface'
'Twig_Node_Macro': 'Twig\Node\MacroNode'
'Twig_Node_Embed': 'Twig\Node\EmbedNode'
'Twig_Node_Do': 'Twig\Node\DoNode'
'Twig_Node_Text': 'Twig\Node\TextNode'
'Twig_Node_Set': 'Twig\Node\SetNode'
'Twig_Node_Sandbox': 'Twig\Node\SandboxNode'
'Twig_Node_AutoEscape': 'Twig\Node\AutoEscapeNode'
'Twig_Node_With': 'Twig\Node\WithNode'
'Twig_Node_Include': 'Twig\Node\IncludeNode'
'Twig_Node_Print': 'Twig\Node\PrintNode'
'Twig_Node_Block': 'Twig\Node\BlockNode'
'Twig_Node_Expression_MethodCall': 'Twig\Node\Expression\MethodCallExpression'
'Twig_Node_Expression_Unary_Pos': 'Twig\Node\Expression\Unary\PosUnary'
'Twig_Node_Expression_Unary_Not': 'Twig\Node\Expression\Unary\NotUnary'
'Twig_Node_Expression_Unary_Neg': 'Twig\Node\Expression\Unary\NegUnary'
'Twig_Node_Expression_GetAttr': 'Twig\Node\Expression\GetAttrExpression'
'Twig_Node_Expression_Function': 'Twig\Node\Expression\FunctionExpression'
'Twig_Node_Expression_Binary_Power': 'Twig\Node\Expression\Binary\PowerBinary'
'Twig_Node_Expression_Binary_In': 'Twig\Node\Expression\Binary\InBinary'
'Twig_Node_Expression_Binary_BitwiseXor': 'Twig\Node\Expression\Binary\BitwiseXorBinary'
'Twig_Node_Expression_Binary_Concat': 'Twig\Node\Expression\Binary\ConcatBinary'
'Twig_Node_Expression_Binary_NotEqual': 'Twig\Node\Expression\Binary\NotEqualBinary'
'Twig_Node_Expression_Binary_Less': 'Twig\Node\Expression\Binary\LessBinary'
'Twig_Node_Expression_Binary_And': 'Twig\Node\Expression\Binary\AndBinary'
'Twig_Node_Expression_Binary_GreaterEqual': 'Twig\Node\Expression\Binary\GreaterEqualBinary'
'Twig_Node_Expression_Binary_Mod': 'Twig\Node\Expression\Binary\ModBinary'
'Twig_Node_Expression_Binary_NotIn': 'Twig\Node\Expression\Binary\NotInBinary'
'Twig_Node_Expression_Binary_Add': 'Twig\Node\Expression\Binary\AddBinary'
'Twig_Node_Expression_Binary_Matches': 'Twig\Node\Expression\Binary\MatchesBinary'
'Twig_Node_Expression_Binary_EndsWith': 'Twig\Node\Expression\Binary\EndsWithBinary'
'Twig_Node_Expression_Binary_FloorDiv': 'Twig\Node\Expression\Binary\FloorDivBinary'
'Twig_Node_Expression_Binary_StartsWith': 'Twig\Node\Expression\Binary\StartsWithBinary'
'Twig_Node_Expression_Binary_LessEqual': 'Twig\Node\Expression\Binary\LessEqualBinary'
'Twig_Node_Expression_Binary_Equal': 'Twig\Node\Expression\Binary\EqualBinary'
'Twig_Node_Expression_Binary_BitwiseAnd': 'Twig\Node\Expression\Binary\BitwiseAndBinary'
'Twig_Node_Expression_Binary_Mul': 'Twig\Node\Expression\Binary\MulBinary'
'Twig_Node_Expression_Binary_Range': 'Twig\Node\Expression\Binary\RangeBinary'
'Twig_Node_Expression_Binary_Or': 'Twig\Node\Expression\Binary\OrBinary'
'Twig_Node_Expression_Binary_Greater': 'Twig\Node\Expression\Binary\GreaterBinary'
'Twig_Node_Expression_Binary_Div': 'Twig\Node\Expression\Binary\DivBinary'
'Twig_Node_Expression_Binary_BitwiseOr': 'Twig\Node\Expression\Binary\BitwiseOrBinary'
'Twig_Node_Expression_Binary_Sub': 'Twig\Node\Expression\Binary\SubBinary'
'Twig_Node_Expression_Test_Even': 'Twig\Node\Expression\Test\EvenTest'
'Twig_Node_Expression_Test_Defined': 'Twig\Node\Expression\Test\DefinedTest'
'Twig_Node_Expression_Test_Sameas': 'Twig\Node\Expression\Test\SameasTest'
'Twig_Node_Expression_Test_Odd': 'Twig\Node\Expression\Test\OddTest'
'Twig_Node_Expression_Test_Constant': 'Twig\Node\Expression\Test\ConstantTest'
'Twig_Node_Expression_Test_Null': 'Twig\Node\Expression\Test\NullTest'
'Twig_Node_Expression_Test_Divisibleby': 'Twig\Node\Expression\Test\DivisiblebyTest'
'Twig_Node_Expression_Array': 'Twig\Node\Expression\ArrayExpression'
'Twig_Node_Expression_Binary': 'Twig\Node\Expression\Binary\AbstractBinary'
'Twig_Node_Expression_Constant': 'Twig\Node\Expression\ConstantExpression'
'Twig_Node_Expression_Parent': 'Twig\Node\Expression\ParentExpression'
'Twig_Node_Expression_Test': 'Twig\Node\Expression\TestExpression'
'Twig_Node_Expression_Filter_Default': 'Twig\Node\Expression\Filter\DefaultFilter'
'Twig_Node_Expression_Filter': 'Twig\Node\Expression\FilterExpression'
'Twig_Node_Expression_BlockReference': 'Twig\Node\Expression\BlockReferenceExpression'
'Twig_Node_Expression_NullCoalesce': 'Twig\Node\Expression\NullCoalesceExpression'
'Twig_Node_Expression_Name': 'Twig\Node\Expression\NameExpression'
'Twig_Node_Expression_TempName': 'Twig\Node\Expression\TempNameExpression'
'Twig_Node_Expression_Call': 'Twig\Node\Expression\CallExpression'
'Twig_Node_Expression_Unary': 'Twig\Node\Expression\Unary\AbstractUnary'
'Twig_Node_Expression_AssignName': 'Twig\Node\Expression\AssignNameExpression'
'Twig_Node_Expression_Conditional': 'Twig\Node\Expression\ConditionalExpression'
'Twig_Node_CheckSecurity': 'Twig\Node\CheckSecurityNode'
'Twig_Node_Expression': 'Twig\Node\Expression\AbstractExpression'
'Twig_Node_ForLoop': 'Twig\Node\ForLoopNode'
'Twig_Node_If': 'Twig\Node\IfNode'
'Twig_Node_For': 'Twig\Node\ForNode'
'Twig_Node_BlockReference': 'Twig\Node\BlockReferenceNode'
'Twig_Node_Flush': 'Twig\Node\FlushNode'
'Twig_Node_Body': 'Twig\Node\BodyNode'
'Twig_Node_Spaceless': 'Twig\Node\SpacelessNode'
'Twig_Node_Import': 'Twig\Node\ImportNode'
'Twig_Node_SandboxedPrint': 'Twig\Node\SandboxedPrintNode'
'Twig_Node_Module': 'Twig\Node\ModuleNode'
'Twig_RuntimeLoaderInterface': 'Twig\RuntimeLoader\RuntimeLoaderInterface'
'Twig_BaseNodeVisitor': 'Twig\NodeVisitor\AbstractNodeVisitor'
'Twig_Extensions_Extension_Text': 'Twig\Extensions\TextExtension'
'Twig_Extensions_Extension_Array': 'Twig\Extensions\ArrayExtension'
'Twig_Extensions_Extension_Date': 'Twig\Extensions\DateExtension'
'Twig_Extensions_Extension_I18n': 'Twig\Extensions\I18nExtension'
'Twig_Extensions_Extension_Intl': 'Twig\Extensions\IntlExtension'
'Twig_Extensions_TokenParser_Trans': 'Twig\Extensions\TokenParser\TransTokenParser'
'Twig_Extensions_Node_Trans': 'Twig\Extensions\Node\TransNode'
Rector\Rector\Dynamic\PseudoNamespaceToNamespaceRector:
- Twig_
EOT
composer require --dev \
symplify/coding-standard "dev-master as 3.0" \
symplify/easy-coding-standard "dev-master as 3.0" \
symplify/package-builder "3.0.0-RC3 as 3.0" \
symplify/token-runner "dev-master as 3.0" \
rector/rector @dev \
nikic/php-parser 'dev-master#5900d78 as v3.1.1'
vendor/bin/rector process src --config twig_namespaced.yml
composer require --dev symplify/package-builder "dev-master as 3.0"
vendor/bin/ecs -vvv check src --fix
Trick for anyone having conflicts like I do: just entirely remove the require and require-dev sections before proceeding. You don't need them.
I'll look on this and merge it until the end of week. Thanks for your work :+1:
Tried this today… it fails because the name of the $configuration argument to the PseudoNamespaceToNamespaceRector class has changed, but fixing this is not enough. Any chance to get a new tag, with hopefully a commit that works?
Could you send the PR to fix it? I can release fix tag then
Sure!
Ah it's already fixed in master, so I really just need a tag.
Great, let's try that!
Works great!
Thanks for feedback :+1:
No problem! New version of my bash script:
!#/bin/bash
cat > easy-coding-standard.yml <<'EOT'
checkers:
Symplify\CodingStandard\Fixer\Import\ImportNamespacedNameFixer:
allow_single_names: true # false by default
EOT
composer require --dev rector/rector symplify/easy-coding-standard
vendor/bin/rector process src --level underscores-to-namespaces
vendor/bin/ecs -vvv check src --fix --config easy-coding-standard.yml