Skip to content

Commit

Permalink
Merge pull request #8468 from kkmuffme/class-alias-should-not-be-case…
Browse files Browse the repository at this point in the history
…-insensitive

classlike_alias incorrect casing not handled correctly
  • Loading branch information
orklah committed Sep 8, 2022
2 parents eba63a3 + 4c6abcc commit 5cf6fb3
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 23 deletions.
4 changes: 2 additions & 2 deletions src/Psalm/Codebase.php
Expand Up @@ -793,9 +793,9 @@ public function interfaceHasCorrectCasing(string $fq_interface_name): bool
return $this->classlikes->interfaceHasCorrectCasing($fq_interface_name);
}

public function traitHasCorrectCase(string $fq_trait_name): bool
public function traitHasCorrectCasing(string $fq_trait_name): bool
{
return $this->classlikes->traitHasCorrectCase($fq_trait_name);
return $this->classlikes->traitHasCorrectCasing($fq_trait_name);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/Psalm/Internal/Analyzer/ClassAnalyzer.php
Expand Up @@ -1370,7 +1370,7 @@ private function analyzeTraitUse(
return false;
}

if (!$codebase->traitHasCorrectCase($fq_trait_name)) {
if (!$codebase->traitHasCorrectCasing($fq_trait_name)) {
if (IssueBuffer::accepts(
new UndefinedTrait(
'Trait ' . $fq_trait_name . ' has wrong casing',
Expand Down
25 changes: 14 additions & 11 deletions src/Psalm/Internal/Codebase/ClassLikes.php
Expand Up @@ -131,7 +131,12 @@ class ClassLikes
/**
* @var array<lowercase-string, string>
*/
private $classlike_aliases = [];
private $classlike_aliases_map = [];

/**
* @var array<string, bool>
*/
private $existing_classlike_aliases = [];

/**
* @var array<string, PhpParser\Node\Stmt\Trait_>
Expand Down Expand Up @@ -750,7 +755,7 @@ public function classHasCorrectCasing(string $fq_class_name): bool
return true;
}

if (isset($this->classlike_aliases[strtolower($fq_class_name)])) {
if (isset($this->existing_classlike_aliases[$fq_class_name])) {
return true;
}

Expand All @@ -759,7 +764,7 @@ public function classHasCorrectCasing(string $fq_class_name): bool

public function interfaceHasCorrectCasing(string $fq_interface_name): bool
{
if (isset($this->classlike_aliases[strtolower($fq_interface_name)])) {
if (isset($this->existing_classlike_aliases[$fq_interface_name])) {
return true;
}

Expand All @@ -768,16 +773,16 @@ public function interfaceHasCorrectCasing(string $fq_interface_name): bool

public function enumHasCorrectCasing(string $fq_enum_name): bool
{
if (isset($this->classlike_aliases[strtolower($fq_enum_name)])) {
if (isset($this->existing_classlike_aliases[$fq_enum_name])) {
return true;
}

return isset($this->existing_enums[$fq_enum_name]);
}

public function traitHasCorrectCase(string $fq_trait_name): bool
public function traitHasCorrectCasing(string $fq_trait_name): bool
{
if (isset($this->classlike_aliases[strtolower($fq_trait_name)])) {
if (isset($this->existing_classlike_aliases[$fq_trait_name])) {
return true;
}

Expand Down Expand Up @@ -820,12 +825,10 @@ public function getTraitNode(string $fq_trait_name): PhpParser\Node\Stmt\Trait_
throw new UnexpectedValueException('Could not locate trait statement');
}

/**
* @param lowercase-string $alias_name
*/
public function addClassAlias(string $fq_class_name, string $alias_name): void
{
$this->classlike_aliases[$alias_name] = $fq_class_name;
$this->classlike_aliases_map[strtolower($alias_name)] = $fq_class_name;
$this->existing_classlike_aliases[$alias_name] = true;
}

public function getUnAliasedName(string $alias_name): string
Expand All @@ -835,7 +838,7 @@ public function getUnAliasedName(string $alias_name): string
return $alias_name;
}

$result = $this->classlike_aliases[$alias_name_lc] ?? $alias_name;
$result = $this->classlike_aliases_map[$alias_name_lc] ?? $alias_name;
if ($result === $alias_name) {
return $result;
}
Expand Down
4 changes: 2 additions & 2 deletions src/Psalm/Internal/Codebase/Scanner.php
Expand Up @@ -605,7 +605,7 @@ private function scanFile(
}

foreach ($file_storage->classlikes_in_file as $fq_classlike_name) {
$this->codebase->exhumeClassLikeStorage(strtolower($fq_classlike_name), $file_path);
$this->codebase->exhumeClassLikeStorage($fq_classlike_name, $file_path);
}

foreach ($file_storage->required_classes as $fq_classlike_name) {
Expand Down Expand Up @@ -736,7 +736,7 @@ function () use ($fq_class_name): ?ReflectionClass {
$new_fq_class_name_lc = strtolower($new_fq_class_name);

if ($new_fq_class_name_lc !== $fq_class_name_lc) {
$classlikes->addClassAlias($new_fq_class_name, $fq_class_name_lc);
$classlikes->addClassAlias($new_fq_class_name, $fq_class_name);
$fq_class_name_lc = $new_fq_class_name_lc;
}

Expand Down
2 changes: 0 additions & 2 deletions src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php
Expand Up @@ -257,8 +257,6 @@ private static function registerClassMapFunctionCall(
$second_arg_value = substr($second_arg_value, 1);
}

$second_arg_value = strtolower($second_arg_value);

$codebase->classlikes->addClassAlias(
$first_arg_value,
$second_arg_value
Expand Down
2 changes: 1 addition & 1 deletion src/Psalm/Storage/FileStorage.php
Expand Up @@ -86,7 +86,7 @@ class FileStorage
public $type_aliases = [];

/**
* @var array<lowercase-string, string>
* @var array<string, string>
*/
public $classlike_aliases = [];

Expand Down
8 changes: 4 additions & 4 deletions tests/Internal/Codebase/ClassLikesTest.php
Expand Up @@ -30,7 +30,7 @@ public function setUp(): void

public function testWillDetectClassImplementingAliasedInterface(): void
{
$this->classlikes->addClassAlias('Foo', 'bar');
$this->classlikes->addClassAlias('Foo', 'Bar');

$classStorage = new ClassLikeStorage('Baz');
$classStorage->class_implements['bar'] = 'Bar';
Expand All @@ -42,9 +42,9 @@ public function testWillDetectClassImplementingAliasedInterface(): void

public function testWillResolveAliasedAliases(): void
{
$this->classlikes->addClassAlias('Foo', 'bar');
$this->classlikes->addClassAlias('Bar', 'baz');
$this->classlikes->addClassAlias('Baz', 'qoo');
$this->classlikes->addClassAlias('Foo', 'Bar');
$this->classlikes->addClassAlias('Bar', 'Baz');
$this->classlikes->addClassAlias('Baz', 'Qoo');

self::assertSame('Foo', $this->classlikes->getUnAliasedName('Qoo'));
}
Expand Down

0 comments on commit 5cf6fb3

Please sign in to comment.