Skip to content

Commit 03a630e

Browse files
committed
Fixed getting constant on self:: with duplicate classes
1 parent 3a2a666 commit 03a630e

3 files changed

Lines changed: 29 additions & 5 deletions

File tree

src/Rules/Classes/ClassConstantRule.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\Type\ErrorType;
1414
use PHPStan\Type\ObjectType;
1515
use PHPStan\Type\StringType;
16+
use PHPStan\Type\ThisType;
1617
use PHPStan\Type\Type;
1718
use PHPStan\Type\TypeCombinator;
1819
use PHPStan\Type\VerbosityLevel;
@@ -106,7 +107,11 @@ public function processNode(Node $node, Scope $scope): array
106107
$className = $this->reflectionProvider->getClass($className)->getName();
107108
}
108109

109-
$classType = new ObjectType($className);
110+
if ($scope->isInClass() && $scope->getClassReflection()->getName() === $className) {
111+
$classType = new ThisType($scope->getClassReflection());
112+
} else {
113+
$classType = new ObjectType($className);
114+
}
110115
} else {
111116
$classTypeResult = $this->ruleLevelHelper->findTypeToCheck(
112117
$scope,
@@ -127,6 +132,9 @@ static function (Type $type) use ($constantName): bool {
127132
}
128133

129134
$typeForDescribe = $classType;
135+
if ($classType instanceof ThisType) {
136+
$typeForDescribe = $classType->getStaticObjectType();
137+
}
130138
$classType = TypeCombinator::remove($classType, new StringType());
131139

132140
if (!$classType->canAccessConstants()->yes()) {

tests/PHPStan/Analyser/AnalyserIntegrationTest.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,18 +208,22 @@ public function testBug2823(): void
208208
public function testTwoSameClassesInSingleFile(): void
209209
{
210210
$errors = $this->runAnalyse(__DIR__ . '/data/two-same-classes.php');
211-
$this->assertCount(3, $errors);
211+
$this->assertCount(4, $errors);
212212
$error = $errors[0];
213213
$this->assertSame('Property TwoSame\Foo::$prop (string) does not accept default value of type int.', $error->getMessage());
214214
$this->assertSame(9, $error->getLine());
215215

216216
$error = $errors[1];
217-
$this->assertSame('Property TwoSame\Foo::$prop (int) does not accept default value of type string.', $error->getMessage());
218-
$this->assertSame(18, $error->getLine());
217+
$this->assertSame('Access to undefined constant TwoSame\Foo::FOO_CONST.', $error->getMessage());
218+
$this->assertSame(13, $error->getLine());
219219

220220
$error = $errors[2];
221+
$this->assertSame('Property TwoSame\Foo::$prop (int) does not accept default value of type string.', $error->getMessage());
222+
$this->assertSame(25, $error->getLine());
223+
224+
$error = $errors[3];
221225
$this->assertSame('Property TwoSame\Foo::$prop2 (int) does not accept default value of type string.', $error->getMessage());
222-
$this->assertSame(21, $error->getLine());
226+
$this->assertSame(28, $error->getLine());
223227
}
224228

225229
public function testBug3405(): void

tests/PHPStan/Analyser/data/two-same-classes.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,29 @@ class Foo
88
/** @var string */
99
private $prop = 1;
1010

11+
public function doFoo(): void
12+
{
13+
echo self::FOO_CONST;
14+
}
15+
1116
}
1217

1318
if (rand(0, 0)) {
1419
class Foo
1520
{
1621

22+
private const FOO_CONST = 'foo';
23+
1724
/** @var int */
1825
private $prop = 'str';
1926

2027
/** @var int */
2128
private $prop2 = 'str';
2229

30+
public function doFoo(): void
31+
{
32+
echo self::FOO_CONST;
33+
}
34+
2335
}
2436
}

0 commit comments

Comments
 (0)