Skip to content

Commit

Permalink
[CodeQuality] Handle class-string case insensitive on CompleteDynamic…
Browse files Browse the repository at this point in the history
…PropertiesRector (#3260)
  • Loading branch information
samsonasik committed Jan 2, 2023
1 parent cb5b012 commit 79a34f9
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace Rector\NodeTypeResolver\NodeTypeCorrector;

use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\Generic\GenericClassStringType;
Expand All @@ -26,11 +27,18 @@ public function correct(Type $mainType): Type
return $traverseCallback($traversedType);
}

if (! $this->reflectionProvider->hasClass($traversedType->getValue())) {
$value = $traversedType->getValue();
if (! $this->reflectionProvider->hasClass($value)) {
return $traverseCallback($traversedType);
}

return new GenericClassStringType(new ObjectType($traversedType->getValue()));
/** @var ClassReflection $classReflection */
$classReflection = $this->reflectionProvider->getClass($value);
if ($classReflection->getName() !== $value) {
return $traverseCallback($traversedType);
}

return new GenericClassStringType(new ObjectType($value));
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

/** No namespace on purpose to simplify demo that case insensitive string should not be marked as class-string */
class ClassStringCaseInsensitive
{
public function set()
{
$this->value = 'classStringCaseInSensitive';
}
}

?>
-----
<?php

/** No namespace on purpose to simplify demo that case insensitive string should not be marked as class-string */
class ClassStringCaseInsensitive
{
/**
* @var string
*/
public $value;
public function set()
{
$this->value = 'classStringCaseInSensitive';
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

/** No namespace on purpose to simplify demo that case sensitive string should be marked as class-string */
class ClassStringCaseSensitive
{
public function set()
{
$this->value = 'ClassStringCaseSensitive';
}
}

?>
-----
<?php

/** No namespace on purpose to simplify demo that case sensitive string should be marked as class-string */
class ClassStringCaseSensitive
{
/**
* @var class-string<\ClassStringCaseSensitive>
*/
public $value;
public function set()
{
$this->value = 'ClassStringCaseSensitive';
}
}

?>

0 comments on commit 79a34f9

Please sign in to comment.