Skip to content

Commit 41c48f2

Browse files
mtarldKorbeil
andcommitted
[TypeInfo] Introduce component
Co-authored-by: Baptiste Leduc <[email protected]>
1 parent 4406087 commit 41c48f2

File tree

79 files changed

+3577
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+3577
-0
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
"symfony/translation": "self.version",
110110
"symfony/twig-bridge": "self.version",
111111
"symfony/twig-bundle": "self.version",
112+
"symfony/type-info": "self.version",
112113
"symfony/uid": "self.version",
113114
"symfony/validator": "self.version",
114115
"symfony/var-dumper": "self.version",

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
7.1
5+
---
6+
7+
* Register TypeInfo services
8+
49
7.0
510
---
611

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/UnusedTagsPass.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ class UnusedTagsPass implements CompilerPassInterface
6969
'mime.mime_type_guesser',
7070
'monolog.logger',
7171
'notifier.channel',
72+
'type_info.resolver',
7273
'property_info.access_extractor',
7374
'property_info.initializable_extractor',
7475
'property_info.list_extractor',

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
use Symfony\Component\Serializer\Encoder\JsonDecode;
4444
use Symfony\Component\Serializer\Serializer;
4545
use Symfony\Component\Translation\Translator;
46+
use Symfony\Component\TypeInfo\Type;
4647
use Symfony\Component\Uid\Factory\UuidFactory;
4748
use Symfony\Component\Validator\Validation;
4849
use Symfony\Component\Webhook\Controller\WebhookController;
@@ -158,6 +159,7 @@ public function getConfigTreeBuilder(): TreeBuilder
158159
$this->addAnnotationsSection($rootNode);
159160
$this->addSerializerSection($rootNode, $enableIfStandalone);
160161
$this->addPropertyAccessSection($rootNode, $willBeAvailable);
162+
$this->addTypeInfoSection($rootNode, $enableIfStandalone);
161163
$this->addPropertyInfoSection($rootNode, $enableIfStandalone);
162164
$this->addCacheSection($rootNode, $willBeAvailable);
163165
$this->addPhpErrorsSection($rootNode);
@@ -1148,6 +1150,18 @@ private function addPropertyInfoSection(ArrayNodeDefinition $rootNode, callable
11481150
;
11491151
}
11501152

1153+
private function addTypeInfoSection(ArrayNodeDefinition $rootNode, callable $enableIfStandalone): void
1154+
{
1155+
$rootNode
1156+
->children()
1157+
->arrayNode('type_info')
1158+
->info('Type info configuration')
1159+
->{$enableIfStandalone('symfony/type-info', Type::class)}()
1160+
->end()
1161+
->end()
1162+
;
1163+
}
1164+
11511165
private function addCacheSection(ArrayNodeDefinition $rootNode, callable $willBeAvailable): void
11521166
{
11531167
$rootNode

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@
167167
use Symfony\Component\Translation\LocaleSwitcher;
168168
use Symfony\Component\Translation\PseudoLocalizationTranslator;
169169
use Symfony\Component\Translation\Translator;
170+
use Symfony\Component\TypeInfo\Type;
171+
use Symfony\Component\TypeInfo\TypeResolver\StringTypeResolver;
170172
use Symfony\Component\Uid\Factory\UuidFactory;
171173
use Symfony\Component\Uid\UuidV4;
172174
use Symfony\Component\Validator\Constraints\ExpressionLanguageProvider;
@@ -356,6 +358,7 @@ public function load(array $configs, ContainerBuilder $container): void
356358
}
357359
}
358360

361+
$typeInfoEnabled = $this->readConfigEnabled('type_info', $container, $config['type_info']);
359362
$propertyInfoEnabled = $this->readConfigEnabled('property_info', $container, $config['property_info']);
360363
$this->registerHttpCacheConfiguration($config['http_cache'], $container, $config['http_method_override']);
361364
$this->registerEsiConfiguration($config['esi'], $container, $loader);
@@ -388,6 +391,10 @@ public function load(array $configs, ContainerBuilder $container): void
388391
$container->removeDefinition('console.command.serializer_debug');
389392
}
390393

394+
if ($typeInfoEnabled) {
395+
$this->registerTypeInfoConfiguration($container, $loader);
396+
}
397+
391398
if ($propertyInfoEnabled) {
392399
$this->registerPropertyInfoConfiguration($container, $loader);
393400
}
@@ -1950,6 +1957,22 @@ private function registerPropertyInfoConfiguration(ContainerBuilder $container,
19501957
}
19511958
}
19521959

1960+
private function registerTypeInfoConfiguration(ContainerBuilder $container, PhpFileLoader $loader): void
1961+
{
1962+
if (!class_exists(Type::class)) {
1963+
throw new LogicException('TypeInfo support cannot be enabled as the TypeInfo component is not installed. Try running "composer require symfony/type-info".');
1964+
}
1965+
1966+
$loader->load('type_info.php');
1967+
1968+
if (ContainerBuilder::willBeAvailable('phpstan/phpdoc-parser', PhpDocParser::class, ['symfony/framework-bundle', 'symfony/type-info'])) {
1969+
$container->register('type_info.resolver.string', StringTypeResolver::class)
1970+
->addTag('type_info.resolver', ['priority' => -1000]);
1971+
1972+
$container->setAlias(StringTypeResolver::class, 'type_info.resolver.string');
1973+
}
1974+
}
1975+
19531976
private function registerLockConfiguration(array $config, ContainerBuilder $container, PhpFileLoader $loader): void
19541977
{
19551978
$loader->load('lock.php');

src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
use Symfony\Component\Translation\DependencyInjection\TranslationExtractorPass;
6565
use Symfony\Component\Translation\DependencyInjection\TranslatorPass;
6666
use Symfony\Component\Translation\DependencyInjection\TranslatorPathsPass;
67+
use Symfony\Component\TypeInfo\DependencyInjection\TypeInfoPass;
6768
use Symfony\Component\Validator\DependencyInjection\AddAutoMappingConfigurationPass;
6869
use Symfony\Component\Validator\DependencyInjection\AddConstraintValidatorsPass;
6970
use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass;
@@ -150,6 +151,7 @@ public function build(ContainerBuilder $container): void
150151
$this->addCompilerPassIfExists($container, TranslationDumperPass::class);
151152
$container->addCompilerPass(new FragmentRendererPass());
152153
$this->addCompilerPassIfExists($container, SerializerPass::class);
154+
$this->addCompilerPassIfExists($container, TypeInfoPass::class);
153155
$this->addCompilerPassIfExists($container, PropertyInfoPass::class);
154156
$container->addCompilerPass(new ControllerArgumentValueResolverPass());
155157
$container->addCompilerPass(new CachePoolPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 32);

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
<xsd:element name="property-access" type="property_access" minOccurs="0" maxOccurs="1" />
2828
<xsd:element name="scheduler" type="scheduler" minOccurs="0" maxOccurs="1" />
2929
<xsd:element name="serializer" type="serializer" minOccurs="0" maxOccurs="1" />
30+
<xsd:element name="type-info" type="type_info" minOccurs="0" maxOccurs="1" />
3031
<xsd:element name="property-info" type="property_info" minOccurs="0" maxOccurs="1" />
3132
<xsd:element name="cache" type="cache" minOccurs="0" maxOccurs="1" />
3233
<xsd:element name="workflow" type="workflow" minOccurs="0" maxOccurs="unbounded" />
@@ -326,6 +327,10 @@
326327
<xsd:attribute name="max-depth-handler" type="xsd:string" />
327328
</xsd:complexType>
328329

330+
<xsd:complexType name="type_info">
331+
<xsd:attribute name="enabled" type="xsd:boolean" />
332+
</xsd:complexType>
333+
329334
<xsd:complexType name="property_info">
330335
<xsd:attribute name="enabled" type="xsd:boolean" />
331336
</xsd:complexType>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <[email protected]>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
13+
14+
use Symfony\Component\TypeInfo\TypeContext\TypeContextFactory;
15+
use Symfony\Component\TypeInfo\TypeResolver\ChainTypeResolver;
16+
use Symfony\Component\TypeInfo\TypeResolver\ReflectionParameterTypeResolver;
17+
use Symfony\Component\TypeInfo\TypeResolver\ReflectionPropertyTypeResolver;
18+
use Symfony\Component\TypeInfo\TypeResolver\ReflectionReturnTypeResolver;
19+
use Symfony\Component\TypeInfo\TypeResolver\ReflectionTypeResolver;
20+
use Symfony\Component\TypeInfo\TypeResolver\TypeResolverInterface;
21+
22+
return static function (ContainerConfigurator $container) {
23+
$container->services()
24+
// type context
25+
->set('type_info.type_context_factory', TypeContextFactory::class)
26+
->args([service('type_info.resolver.string')->nullOnInvalid()])
27+
28+
// type resolvers
29+
->set('type_info.resolver', ChainTypeResolver::class)
30+
->args([[]])
31+
->alias(TypeResolverInterface::class, 'type_info.resolver')
32+
33+
->set('type_info.resolver.reflection_type', ReflectionTypeResolver::class)
34+
->args([service('type_info.type_context_factory')])
35+
->tag('type_info.resolver', ['priority' => -1001])
36+
->alias(ReflectionTypeResolver::class, 'type_info.resolver.reflection_type')
37+
38+
->set('type_info.resolver.reflection_parameter', ReflectionParameterTypeResolver::class)
39+
->args([service('type_info.resolver.reflection_type'), service('type_info.type_context_factory')])
40+
->tag('type_info.resolver', ['priority' => -1002])
41+
->alias(ReflectionParameterTypeResolver::class, 'type_info.resolver.reflection_parameter')
42+
43+
->set('type_info.resolver.reflection_property', ReflectionPropertyTypeResolver::class)
44+
->args([service('type_info.resolver.reflection_type'), service('type_info.type_context_factory')])
45+
->tag('type_info.resolver', ['priority' => -1003])
46+
->alias(ReflectionPropertyTypeResolver::class, 'type_info.resolver.reflection_property')
47+
48+
->set('type_info.resolver.reflection_return', ReflectionReturnTypeResolver::class)
49+
->args([service('type_info.resolver.reflection_type'), service('type_info.type_context_factory')])
50+
->tag('type_info.resolver', ['priority' => -1004])
51+
->alias(ReflectionReturnTypeResolver::class, 'type_info.resolver.reflection_return')
52+
;
53+
};

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/ConfigurationTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,9 @@ protected static function getBundleDefaultConfig()
620620
'throw_exception_on_invalid_index' => false,
621621
'throw_exception_on_invalid_property_path' => true,
622622
],
623+
'type_info' => [
624+
'enabled' => !class_exists(FullStack::class),
625+
],
623626
'property_info' => [
624627
'enabled' => !class_exists(FullStack::class),
625628
],

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
'default_context' => ['enable_max_depth' => true],
7171
],
7272
'property_info' => true,
73+
'type_info' => true,
7374
'ide' => 'file%%link%%format',
7475
'request' => [
7576
'formats' => [

0 commit comments

Comments
 (0)