diff --git a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php index 0ed1e4e2afe3d..b8df4059b4d31 100644 --- a/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php +++ b/src/Symfony/Component/PropertyInfo/Extractor/ReflectionExtractor.php @@ -112,7 +112,7 @@ public function getTypes($class, $property, array $context = []) } if ( - $context['enable_constructor_extraction'] ?? $this->enableConstructorExtraction && + ($context['enable_constructor_extraction'] ?? $this->enableConstructorExtraction) && $fromConstructor = $this->extractFromConstructor($class, $property) ) { return $fromConstructor; diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php index e58c70d41d702..709ef93c55d90 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php @@ -293,4 +293,29 @@ public function getInitializableProperties(): array [NotInstantiable::class, 'foo', false], ]; } + + /** + * @dataProvider constructorTypesProvider + */ + public function testExtractTypeConstructor(string $class, string $property, array $type = null) + { + /* Check that constructor extractions works by default, and if passed in via context. + Check that null is returned if constructor extraction is disabled */ + $this->assertEquals($type, $this->extractor->getTypes($class, $property, [])); + $this->assertEquals($type, $this->extractor->getTypes($class, $property, ['enable_constructor_extraction' => true])); + $this->assertNull($this->extractor->getTypes($class, $property, ['enable_constructor_extraction' => false])); + } + + public function constructorTypesProvider(): array + { + return [ + // php71 dummy has following constructor: __construct(string $string, int $intPrivate) + [Php71Dummy::class, 'string', [new Type(Type::BUILTIN_TYPE_STRING, false)]], + [Php71Dummy::class, 'intPrivate', [new Type(Type::BUILTIN_TYPE_INT, false)]], + // Php71DummyExtended2 adds int $intWithAccessor + [Php71DummyExtended2::class, 'intWithAccessor', [new Type(Type::BUILTIN_TYPE_INT, false)]], + [Php71DummyExtended2::class, 'intPrivate', [new Type(Type::BUILTIN_TYPE_INT, false)]], + [DefaultValue::class, 'foo', null], + ]; + } }