diff --git a/src/Psalm/Codebase.php b/src/Psalm/Codebase.php index 1de35369467..c74ba4637ae 100644 --- a/src/Psalm/Codebase.php +++ b/src/Psalm/Codebase.php @@ -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); } /** diff --git a/src/Psalm/Internal/Analyzer/ClassAnalyzer.php b/src/Psalm/Internal/Analyzer/ClassAnalyzer.php index cb4e63491ba..f55fbaaa90d 100644 --- a/src/Psalm/Internal/Analyzer/ClassAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/ClassAnalyzer.php @@ -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', diff --git a/src/Psalm/Internal/Codebase/ClassLikes.php b/src/Psalm/Internal/Codebase/ClassLikes.php index f81e888620f..85abeeb0912 100644 --- a/src/Psalm/Internal/Codebase/ClassLikes.php +++ b/src/Psalm/Internal/Codebase/ClassLikes.php @@ -131,7 +131,12 @@ class ClassLikes /** * @var array */ - private $classlike_aliases = []; + private $classlike_aliases_map = []; + + /** + * @var array + */ + private $existing_classlike_aliases = []; /** * @var array @@ -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; } @@ -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; } @@ -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; } @@ -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 @@ -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; } diff --git a/src/Psalm/Internal/Codebase/Scanner.php b/src/Psalm/Internal/Codebase/Scanner.php index fb6e1bf5c63..b45044a0431 100644 --- a/src/Psalm/Internal/Codebase/Scanner.php +++ b/src/Psalm/Internal/Codebase/Scanner.php @@ -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) { @@ -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; } diff --git a/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php b/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php index 2a6dbf71eb9..3cc4bd7350b 100644 --- a/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php +++ b/src/Psalm/Internal/PhpVisitor/Reflector/ExpressionScanner.php @@ -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 diff --git a/src/Psalm/Storage/FileStorage.php b/src/Psalm/Storage/FileStorage.php index df09117dbea..fcde3b3a6ad 100644 --- a/src/Psalm/Storage/FileStorage.php +++ b/src/Psalm/Storage/FileStorage.php @@ -86,7 +86,7 @@ class FileStorage public $type_aliases = []; /** - * @var array + * @var array */ public $classlike_aliases = []; diff --git a/tests/Internal/Codebase/ClassLikesTest.php b/tests/Internal/Codebase/ClassLikesTest.php index b04beb38f41..8168d17a875 100644 --- a/tests/Internal/Codebase/ClassLikesTest.php +++ b/tests/Internal/Codebase/ClassLikesTest.php @@ -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'; @@ -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')); }