Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b056274

Browse files
committed
feat(PhpAstExtractor): Add extraction of FormType implicit labels
1 parent 2d1c721 commit b056274

7 files changed

Lines changed: 45 additions & 94 deletions

File tree

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationUpdateCommandPass.php renamed to src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/TranslationExtractCommandPass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
1616

17-
class TranslationUpdateCommandPass implements CompilerPassInterface
17+
class TranslationExtractCommandPass implements CompilerPassInterface
1818
{
1919
public function process(ContainerBuilder $container): void
2020
{

src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerRealRefPass;
2121
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TestServiceContainerWeakRefPass;
2222
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationLintCommandPass;
23-
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationUpdateCommandPass;
23+
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\TranslationExtractCommandPass;
2424
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\UnusedTagsPass;
2525
use Symfony\Bundle\FrameworkBundle\DependencyInjection\VirtualRequestStackPass;
2626
use Symfony\Component\Cache\Adapter\ApcuAdapter;
@@ -188,7 +188,7 @@ public function build(ContainerBuilder $container): void
188188
// must be registered after MonologBundle's LoggerChannelPass
189189
$container->addCompilerPass(new ErrorLoggerCompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);
190190
$container->addCompilerPass(new VirtualRequestStackPass());
191-
$container->addCompilerPass(new TranslationUpdateCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
191+
$container->addCompilerPass(new TranslationExtractCommandPass(), PassConfig::TYPE_BEFORE_REMOVING);
192192
$this->addCompilerPassIfExists($container, StreamablePass::class);
193193

194194
if ($container->getParameter('kernel.debug')) {

src/Symfony/Component/Translation/DependencyInjection/TranslatorPass.php

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public function process(ContainerBuilder $container): void
2525
}
2626

2727
$this->processLoadersAndReaders($container);
28-
$this->processExtractorFormTypeVisitor($container);
2928
$this->processExtractorConstraintVisitor($container);
3029
$this->processTwigPaths($container);
3130
}
@@ -58,30 +57,6 @@ private function processLoadersAndReaders(ContainerBuilder $container): void
5857
;
5958
}
6059

61-
// TO BE DELETED
62-
private function processExtractorFormTypeVisitor(ContainerBuilder $container): void
63-
{
64-
if (!$container->hasDefinition('translation.extractor.visitor.form_type')) {
65-
return;
66-
}
67-
68-
$formTypeVisitorDefinition = $container->getDefinition('translation.extractor.visitor.form_type');
69-
$formTypeClassNames = [];
70-
71-
foreach ($container->getDefinitions() as $definition) {
72-
if (!$definition->hasTag('form.type')) {
73-
continue;
74-
}
75-
76-
// Resolve constraint validator FQCN even if defined as %foo.validator.class% parameter
77-
$className = $container->getParameterBag()->resolveValue($definition->getClass());
78-
// Extraction of the constraint class name from the Constraint Validator FQCN
79-
$formTypeClassNames[] = str_replace('Type', '', substr(strrchr($className, '\\'), 1));
80-
}
81-
82-
$formTypeVisitorDefinition->setArgument(0, $formTypeClassNames);
83-
}
84-
8560
private function processExtractorConstraintVisitor(ContainerBuilder $container): void
8661
{
8762
if (!$container->hasDefinition('validator') || !$container->hasDefinition('translation.extractor.visitor.constraint')) {

src/Symfony/Component/Translation/Extractor/Visitor/FormTrait.php

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/Symfony/Component/Translation/Extractor/Visitor/FormTypeVisitor.php

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use PhpParser\Node;
1515
use PhpParser\NodeVisitor;
16+
use Symfony\Component\Form\AbstractType;
1617

1718
/**
1819
* @author Mathieu Santostefano <[email protected]>
@@ -21,13 +22,10 @@
2122
*/
2223
final class FormTypeVisitor extends AbstractVisitor implements NodeVisitor
2324
{
24-
use FormTrait;
25-
26-
public function __construct(
27-
// to be deleted
28-
private readonly array $formTypeClassNames = [],
29-
) {
30-
}
25+
/**
26+
* Stores whether the current class is a form type across visits of all children nodes.
27+
*/
28+
private bool $isFormType = false;
3129

3230
public function beforeTraverse(array $nodes): ?Node
3331
{
@@ -45,6 +43,11 @@ public function enterNode(Node $node): ?Node
4543
$this->visitArray($node);
4644
}
4745

46+
// Visit all "add()" method calls to look for implicit labels
47+
if ($node instanceof Node\Expr\MethodCall) {
48+
$this->visitMethodCall($node);
49+
}
50+
4851
return null;
4952
}
5053

@@ -58,6 +61,21 @@ public function afterTraverse(array $nodes): ?Node
5861
return null;
5962
}
6063

64+
private function visitMethodCall(Node\Expr\MethodCall $node): void
65+
{
66+
if ('add' !== $node->name->name) {
67+
return;
68+
}
69+
70+
if (!$node->args[0]->value instanceof Node\Scalar\String_) {
71+
return;
72+
}
73+
74+
if (\count($node->args) === 1) {
75+
$this->addMessageToCatalogue($this->getStringValue($node->args[0]->value), 'messages', $node->args[0]->value->getStartLine());
76+
}
77+
}
78+
6179
private function visitArray(Node\Expr\Array_ $node): void
6280
{
6381
foreach ($node->items as $item) {
@@ -70,4 +88,19 @@ private function visitArray(Node\Expr\Array_ $node): void
7088
}
7189
}
7290
}
91+
92+
private function isFormType(Node $node): bool
93+
{
94+
if ($node instanceof Node\Stmt\Class_) {
95+
if ($node->extends !== null) {
96+
if ($node->extends->isFullyQualified()) {
97+
if ($node->extends->name === AbstractType::class) {
98+
$this->isFormType = true;
99+
}
100+
}
101+
}
102+
}
103+
104+
return $this->isFormType;
105+
}
73106
}

src/Symfony/Component/Translation/Tests/DependencyInjection/TranslatorPassTest.php

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,4 @@ public function testValidPhpAstExtractorConstraintVisitorArguments()
149149

150150
$this->assertSame(['NotBlank', 'Isbn', 'Length', 'Time'], $constraintVisitor->getArgument(0));
151151
}
152-
153-
public function testValidPhpAstExtractorFormTypeVisitorArguments()
154-
{
155-
$container = new ContainerBuilder();
156-
$container->register('translator.default')
157-
->setArguments([null, null, null, null]);
158-
$formTypeVisitor = $container->register('translation.extractor.visitor.form_type', FormTypeVisitor::class);
159-
$container->register('form.type.text', TextType::class)
160-
->addTag('form.type');
161-
162-
$pass = new TranslatorPass();
163-
$pass->process($container);
164-
165-
$this->assertSame(['Text'], $formTypeVisitor->getArgument(0));
166-
}
167152
}

src/Symfony/Component/Translation/Tests/Extractor/PhpAstExtractorTest.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ public function testExtraction(iterable|string $resource)
3636
'Isbn',
3737
'Length',
3838
]),
39-
new FormTypeVisitor([
40-
'ExplicitLabelType',
41-
]),
39+
new FormTypeVisitor(),
4240
]);
4341
$extractor->setPrefix('prefix');
4442
$catalogue = new MessageCatalogue('en');
@@ -210,9 +208,7 @@ public function testExtractionFromIndentedHeredocNowdoc()
210208
'Isbn',
211209
'Length',
212210
]),
213-
new FormTypeVisitor([
214-
'ExplicitLabelType',
215-
]),
211+
new FormTypeVisitor(),
216212
]);
217213
$extractor->setPrefix('prefix');
218214
$extractor->extract(__DIR__.'/../Fixtures/extractor-7.3/translation.html.php', $catalogue);

0 commit comments

Comments
 (0)