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

Skip to content

Commit 65bf8ed

Browse files
committed
[TypeInfo] Fix static type resolution when called class is in different namespace
1 parent d1f0ede commit 65bf8ed

8 files changed

Lines changed: 71 additions & 22 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyUnionType;
3030
use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyWithTemplateAndParent;
3131
use Symfony\Component\PropertyInfo\Tests\Fixtures\Extractor\DummyInDifferentNs;
32+
use Symfony\Component\PropertyInfo\Tests\Fixtures\Extractor\DummyWithStaticGetterInDifferentNs;
3233
use Symfony\Component\PropertyInfo\Tests\Fixtures\Extractor\DummyWithTemplateAndParentInDifferentNs;
3334
use Symfony\Component\PropertyInfo\Tests\Fixtures\IFace;
3435
use Symfony\Component\PropertyInfo\Tests\Fixtures\IntRangeDummy;
@@ -928,6 +929,7 @@ public static function propertiesStaticTypeProvider(): iterable
928929
{
929930
yield [ParentDummy::class, 'propertyTypeStatic', Type::object(ParentDummy::class)];
930931
yield [Dummy::class, 'propertyTypeStatic', Type::object(Dummy::class)];
932+
yield [DummyWithStaticGetterInDifferentNs::class, 'static', Type::object(DummyWithStaticGetterInDifferentNs::class)];
931933
}
932934

933935
public function testPropertiesParentType()
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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\PropertyInfo\Tests\Fixtures;
13+
14+
class DummyWithStaticGetter
15+
{
16+
/**
17+
* @return static
18+
*/
19+
public function getStatic(): static
20+
{
21+
return $this;
22+
}
23+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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\PropertyInfo\Tests\Fixtures\Extractor;
13+
14+
use Symfony\Component\PropertyInfo\Tests\Fixtures\DummyWithStaticGetter;
15+
16+
class DummyWithStaticGetterInDifferentNs extends DummyWithStaticGetter
17+
{
18+
}

src/Symfony/Component/PropertyInfo/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"php": ">=8.2",
2727
"symfony/deprecation-contracts": "^2.5|^3",
2828
"symfony/string": "^6.4|^7.0",
29-
"symfony/type-info": "~7.3.8|^7.4.1"
29+
"symfony/type-info": "~7.3.10|^7.4.4"
3030
},
3131
"require-dev": {
3232
"symfony/serializer": "^6.4|^7.0",

src/Symfony/Component/TypeInfo/Tests/TypeContext/TypeContextFactoryTest.php

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,24 +44,24 @@ protected function setUp(): void
4444
public function testCollectClassNames()
4545
{
4646
$typeContext = $this->typeContextFactory->createFromClassName(Dummy::class, AbstractDummy::class);
47-
$this->assertSame('Dummy', $typeContext->calledClassName);
48-
$this->assertSame('AbstractDummy', $typeContext->declaringClassName);
47+
$this->assertSame(Dummy::class, $typeContext->calledClassName);
48+
$this->assertSame(AbstractDummy::class, $typeContext->declaringClassName);
4949

5050
$typeContext = $this->typeContextFactory->createFromReflection(new \ReflectionClass(Dummy::class));
51-
$this->assertSame('Dummy', $typeContext->calledClassName);
52-
$this->assertSame('Dummy', $typeContext->declaringClassName);
51+
$this->assertSame(Dummy::class, $typeContext->calledClassName);
52+
$this->assertSame(Dummy::class, $typeContext->declaringClassName);
5353

5454
$typeContext = $this->typeContextFactory->createFromReflection(new \ReflectionProperty(Dummy::class, 'id'));
55-
$this->assertSame('Dummy', $typeContext->calledClassName);
56-
$this->assertSame('Dummy', $typeContext->declaringClassName);
55+
$this->assertSame(Dummy::class, $typeContext->calledClassName);
56+
$this->assertSame(Dummy::class, $typeContext->declaringClassName);
5757

5858
$typeContext = $this->typeContextFactory->createFromReflection(new \ReflectionMethod(Dummy::class, 'getId'));
59-
$this->assertSame('Dummy', $typeContext->calledClassName);
60-
$this->assertSame('Dummy', $typeContext->declaringClassName);
59+
$this->assertSame(Dummy::class, $typeContext->calledClassName);
60+
$this->assertSame(Dummy::class, $typeContext->declaringClassName);
6161

6262
$typeContext = $this->typeContextFactory->createFromReflection(new \ReflectionParameter([Dummy::class, 'setId'], 'id'));
63-
$this->assertSame('Dummy', $typeContext->calledClassName);
64-
$this->assertSame('Dummy', $typeContext->declaringClassName);
63+
$this->assertSame(Dummy::class, $typeContext->calledClassName);
64+
$this->assertSame(Dummy::class, $typeContext->declaringClassName);
6565
}
6666

6767
public function testCollectNamespace()

src/Symfony/Component/TypeInfo/Tests/TypeContext/TypeContextTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Component\TypeInfo\Exception\LogicException;
1616
use Symfony\Component\TypeInfo\Tests\Fixtures\AbstractDummy;
17+
use Symfony\Component\TypeInfo\Tests\Fixtures\AnotherNamespace\DummyInDifferentNs;
1718
use Symfony\Component\TypeInfo\Tests\Fixtures\Dummy;
1819
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyExtendingStdClass;
1920
use Symfony\Component\TypeInfo\Tests\Fixtures\DummyWithUses;
@@ -49,6 +50,14 @@ public function testGetCalledClass()
4950
$this->assertSame(Dummy::class, (new TypeContextFactory())->createFromClassName(Dummy::class, AbstractDummy::class)->getCalledClass());
5051
}
5152

53+
public function testGetCalledClassInDifferentNamespace()
54+
{
55+
$this->assertSame(
56+
DummyInDifferentNs::class,
57+
(new TypeContextFactory())->createFromClassName(DummyInDifferentNs::class, AbstractDummy::class)->getCalledClass()
58+
);
59+
}
60+
5261
public function testGetParentClass()
5362
{
5463
$this->assertSame(AbstractDummy::class, (new TypeContextFactory())->createFromClassName(Dummy::class)->getParentClass());

src/Symfony/Component/TypeInfo/TypeContext/TypeContext.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,15 @@ public function normalize(string $name): string
7777
*/
7878
public function getDeclaringClass(): string
7979
{
80-
return $this->normalize($this->declaringClassName);
80+
return $this->declaringClassName;
8181
}
8282

8383
/**
8484
* @return class-string
8585
*/
8686
public function getCalledClass(): string
8787
{
88-
return $this->normalize($this->calledClassName);
88+
return $this->calledClassName;
8989
}
9090

9191
/**

src/Symfony/Component/TypeInfo/TypeContext/TypeContextFactory.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,19 @@ public function createFromClassName(string $calledClassName, ?string $declaringC
5353
{
5454
$declaringClassName ??= $calledClassName;
5555

56-
$calledClassPath = explode('\\', $calledClassName);
57-
$declaringClassPath = explode('\\', $declaringClassName);
58-
5956
$calledClassNameReflection = self::$reflectionClassCache[$calledClassName] ??= new \ReflectionClass($calledClassName);
6057
$declaringClassReflection = self::$reflectionClassCache[$declaringClassName] ??= new \ReflectionClass($declaringClassName);
6158

6259
$calledClassTypeContext = new TypeContext(
63-
end($calledClassPath),
64-
end($declaringClassPath),
60+
$calledClassName,
61+
$declaringClassName,
6562
trim($calledClassNameReflection->getNamespaceName(), '\\'),
6663
$this->collectUses($calledClassNameReflection),
6764
);
6865

6966
$typeContext = new TypeContext(
70-
end($calledClassPath),
71-
end($declaringClassPath),
67+
$calledClassName,
68+
$declaringClassName,
7269
trim($declaringClassReflection->getNamespaceName(), '\\'),
7370
$this->collectUses($declaringClassReflection),
7471
);
@@ -107,8 +104,8 @@ public function createFromReflection(\Reflector $reflection): ?TypeContext
107104
}
108105

109106
$typeContext = new TypeContext(
110-
$declaringClassReflection->getShortName(),
111-
$declaringClassReflection->getShortName(),
107+
$declaringClassReflection->getName(),
108+
$declaringClassReflection->getName(),
112109
$declaringClassReflection->getNamespaceName(),
113110
$this->collectUses($declaringClassReflection),
114111
);

0 commit comments

Comments
 (0)