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

Skip to content

Commit c7e9493

Browse files
committed
[PropertyInfo] Use the right context for methods defined in traits
1 parent 3f42c08 commit c7e9493

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

src/Symfony/Component/PropertyInfo/Extractor/PhpDocExtractor.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,17 @@ private function getDocBlockFromMethod(string $class, string $ucFirstProperty, i
269269
}
270270

271271
try {
272-
return [$this->docBlockFactory->create($reflectionMethod, $this->createFromReflector($reflectionMethod->getDeclaringClass())), $prefix];
272+
$reflector = $reflectionMethod->getDeclaringClass();
273+
274+
foreach ($reflector->getTraits() as $trait) {
275+
if ($trait->hasMethod($methodName)) {
276+
$reflector = $trait;
277+
278+
break;
279+
}
280+
}
281+
282+
return [$this->docBlockFactory->create($reflectionMethod, $this->createFromReflector($reflector)), $prefix];
273283
} catch (\InvalidArgumentException $e) {
274284
return null;
275285
} catch (\RuntimeException $e) {

src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,23 @@ public function propertiesDefinedByTraitsProvider(): array
295295
];
296296
}
297297

298+
/**
299+
* @dataProvider methodsDefinedByTraitsProvider
300+
*/
301+
public function testMethodsDefinedByTraits(string $property, Type $type)
302+
{
303+
$this->assertEquals([$type], $this->extractor->getTypes(DummyUsingTrait::class, $property));
304+
}
305+
306+
public function methodsDefinedByTraitsProvider(): array
307+
{
308+
return [
309+
['methodInTraitPrimitiveType', new Type(Type::BUILTIN_TYPE_STRING)],
310+
['methodInTraitObjectSameNamespace', new Type(Type::BUILTIN_TYPE_OBJECT, false, DummyUsedInTrait::class)],
311+
['methodInTraitObjectDifferentNamespace', new Type(Type::BUILTIN_TYPE_OBJECT, false, Dummy::class)],
312+
];
313+
}
314+
298315
/**
299316
* @dataProvider propertiesStaticTypeProvider
300317
*/

src/Symfony/Component/PropertyInfo/Tests/Fixtures/TraitUsage/DummyTrait.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,28 @@ trait DummyTrait
2929
* @var Dummy
3030
*/
3131
private $propertyInTraitObjectDifferentNamespace;
32+
33+
/**
34+
* @return string
35+
*/
36+
public function getMethodInTraitPrimitiveType()
37+
{
38+
return 'value';
39+
}
40+
41+
/**
42+
* @return DummyUsedInTrait
43+
*/
44+
public function getMethodInTraitObjectSameNamespace()
45+
{
46+
return new DummyUsedInTrait();
47+
}
48+
49+
/**
50+
* @return Dummy
51+
*/
52+
public function getMethodInTraitObjectDifferentNamespace()
53+
{
54+
return new Dummy();
55+
}
3256
}

0 commit comments

Comments
 (0)