diff --git a/conf/bleedingEdge.neon b/conf/bleedingEdge.neon index ecae15e4ac..9da565d6af 100644 --- a/conf/bleedingEdge.neon +++ b/conf/bleedingEdge.neon @@ -25,3 +25,4 @@ parameters: unnecessaryNullCoalesce: true finiteTypesInHaystack: true switchConditionAlwaysFalse: true + checkImportedClassNameCase: true diff --git a/conf/config.neon b/conf/config.neon index 74db379e5b..de093affa3 100644 --- a/conf/config.neon +++ b/conf/config.neon @@ -56,6 +56,7 @@ parameters: unnecessaryNullCoalesce: false finiteTypesInHaystack: false switchConditionAlwaysFalse: false + checkImportedClassNameCase: false fileExtensions: - php checkAdvancedIsset: false diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon index 953bab2437..ecbac473b4 100644 --- a/conf/parametersSchema.neon +++ b/conf/parametersSchema.neon @@ -54,6 +54,7 @@ parametersSchema: unnecessaryNullCoalesce: bool() finiteTypesInHaystack: bool() switchConditionAlwaysFalse: bool() + checkImportedClassNameCase: bool() ]) fileExtensions: listOf(string()) checkAdvancedIsset: bool() diff --git a/src/Rules/ClassCaseSensitivityCheck.php b/src/Rules/ClassCaseSensitivityCheck.php index 4962c167ad..27cfdb52db 100644 --- a/src/Rules/ClassCaseSensitivityCheck.php +++ b/src/Rules/ClassCaseSensitivityCheck.php @@ -20,6 +20,8 @@ public function __construct( private ReflectionProvider $reflectionProvider, #[AutowiredParameter] private bool $checkInternalClassCaseSensitivity, + #[AutowiredParameter(ref: '%featureToggles.checkImportedClassNameCase%')] + private bool $checkImportedClassNameCase, ) { } @@ -72,6 +74,10 @@ public function checkClassNames(array $pairs): array private function getClassNameAsWritten(ClassNameNodePair $pair): string { $className = $pair->getClassName(); + if (!$this->checkImportedClassNameCase) { + return $className; + } + $node = $pair->getNode(); if (!$node instanceof Name || $node->toString() !== $className) { return $className; diff --git a/src/Rules/FunctionDefinitionCheck.php b/src/Rules/FunctionDefinitionCheck.php index 049973c4ee..c1666ebdac 100644 --- a/src/Rules/FunctionDefinitionCheck.php +++ b/src/Rules/FunctionDefinitionCheck.php @@ -41,7 +41,9 @@ use function array_keys; use function array_map; use function array_merge; +use function array_slice; use function count; +use function implode; use function in_array; use function is_string; use function sprintf; @@ -60,6 +62,8 @@ public function __construct( private bool $checkClassCaseSensitivity, #[AutowiredParameter] private bool $checkThisOnly, + #[AutowiredParameter(ref: '%featureToggles.checkImportedClassNameCase%')] + private bool $checkImportedClassNameCase, ) { } @@ -845,12 +849,38 @@ private function getOriginalClassNamePairsFromTypeNode(Identifier|Name|ComplexTy if ($typeNode instanceof Name) { $resolvedName = $typeNode->toString(); - $nameAsWritten = ClassCaseSensitivityCheck::getNameAsWritten($typeNode); - if ($nameAsWritten === $resolvedName) { + if ($this->checkImportedClassNameCase) { + $nameAsWritten = ClassCaseSensitivityCheck::getNameAsWritten($typeNode); + if ($nameAsWritten === $resolvedName) { + return []; + } + + return [strtolower($resolvedName) => new ClassNameNodePair($nameAsWritten, $typeNode)]; + } + + $originalName = $typeNode->getAttribute('originalName'); + if (!$originalName instanceof Name) { + return []; + } + + $originalParts = $originalName->getParts(); + $resolvedParts = $typeNode->getParts(); + + $originalPartsCount = count($originalParts); + $resolvedPartsCount = count($resolvedParts); + + if ($originalPartsCount <= $resolvedPartsCount) { + $prefixParts = array_slice($resolvedParts, 0, $resolvedPartsCount - $originalPartsCount); + $originalCaseClassName = implode('\\', array_merge($prefixParts, $originalParts)); + } else { + $originalCaseClassName = $originalName->toString(); + } + + if ($originalCaseClassName === $resolvedName) { return []; } - return [strtolower($resolvedName) => new ClassNameNodePair($nameAsWritten, $typeNode)]; + return [strtolower($resolvedName) => new ClassNameNodePair($originalCaseClassName, $typeNode)]; } if ($typeNode instanceof NullableType) { diff --git a/tests/PHPStan/Rules/Classes/ClassAttributesRuleTest.php b/tests/PHPStan/Rules/Classes/ClassAttributesRuleTest.php index a9e75314f2..026661a35e 100644 --- a/tests/PHPStan/Rules/Classes/ClassAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ClassAttributesRuleTest.php @@ -55,7 +55,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ClassConstantAttributesRuleTest.php b/tests/PHPStan/Rules/Classes/ClassConstantAttributesRuleTest.php index 5e1e49d1c5..78c6df8bb9 100644 --- a/tests/PHPStan/Rules/Classes/ClassConstantAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ClassConstantAttributesRuleTest.php @@ -50,7 +50,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ClassConstantRuleTest.php b/tests/PHPStan/Rules/Classes/ClassConstantRuleTest.php index 32f74832ef..b7120a155e 100644 --- a/tests/PHPStan/Rules/Classes/ClassConstantRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ClassConstantRuleTest.php @@ -23,6 +23,8 @@ class ClassConstantRuleTest extends RuleTestCase private int $phpVersion; + private bool $checkImportedClassNameCase = false; + protected function getRule(): Rule { $reflectionProvider = self::createReflectionProvider(); @@ -40,7 +42,7 @@ protected function getRule(): Rule discoveringSymbolsTip: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: true), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: true, checkImportedClassNameCase: $this->checkImportedClassNameCase), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -569,15 +571,29 @@ public function testStringableDynamicAccess(): void ]); } - public function testBug12827(): void + public static function dataBug12827(): array + { + return [ + [true], + [false], + ]; + } + + #[DataProvider('dataBug12827')] + public function testBug12827(bool $checkImportedClassNameCase): void { $this->phpVersion = PHP_VERSION_ID; - $this->analyse([__DIR__ . '/data/bug-12827.php'], [ - [ + $this->checkImportedClassNameCase = $checkImportedClassNameCase; + + $expectedErrors = []; + if ($checkImportedClassNameCase) { + $expectedErrors[] = [ 'Class Bug12827Classes\Post referenced with incorrect case: Bug12827Classes\POST.', 25, - ], - ]); + ]; + } + + $this->analyse([__DIR__ . '/data/bug-12827.php'], $expectedErrors); } } diff --git a/tests/PHPStan/Rules/Classes/ExistingClassInClassExtendsRuleTest.php b/tests/PHPStan/Rules/Classes/ExistingClassInClassExtendsRuleTest.php index 5901eac6ad..cf85e1049e 100644 --- a/tests/PHPStan/Rules/Classes/ExistingClassInClassExtendsRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ExistingClassInClassExtendsRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule $container = self::getContainer(); return new ExistingClassInClassExtendsRule( new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ExistingClassInInstanceOfRuleTest.php b/tests/PHPStan/Rules/Classes/ExistingClassInInstanceOfRuleTest.php index 8447534ec9..cef33a873b 100644 --- a/tests/PHPStan/Rules/Classes/ExistingClassInInstanceOfRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ExistingClassInInstanceOfRuleTest.php @@ -24,7 +24,7 @@ protected function getRule(): Rule return new ExistingClassInInstanceOfRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ExistingClassInTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/ExistingClassInTraitUseRuleTest.php index 20764ec57a..a3dcd5a31e 100644 --- a/tests/PHPStan/Rules/Classes/ExistingClassInTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ExistingClassInTraitUseRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule $container = self::getContainer(); return new ExistingClassInTraitUseRule( new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ExistingClassesInClassImplementsRuleTest.php b/tests/PHPStan/Rules/Classes/ExistingClassesInClassImplementsRuleTest.php index c2e53f1bf8..429989591f 100644 --- a/tests/PHPStan/Rules/Classes/ExistingClassesInClassImplementsRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ExistingClassesInClassImplementsRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule $container = self::getContainer(); return new ExistingClassesInClassImplementsRule( new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ExistingClassesInEnumImplementsRuleTest.php b/tests/PHPStan/Rules/Classes/ExistingClassesInEnumImplementsRuleTest.php index 89eb29cbb3..9f9851a2dd 100644 --- a/tests/PHPStan/Rules/Classes/ExistingClassesInEnumImplementsRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ExistingClassesInEnumImplementsRuleTest.php @@ -24,7 +24,7 @@ protected function getRule(): Rule $container = self::getContainer(); return new ExistingClassesInEnumImplementsRule( new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ExistingClassesInInterfaceExtendsRuleTest.php b/tests/PHPStan/Rules/Classes/ExistingClassesInInterfaceExtendsRuleTest.php index c0e1c3bb9a..89fb9ac174 100644 --- a/tests/PHPStan/Rules/Classes/ExistingClassesInInterfaceExtendsRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ExistingClassesInInterfaceExtendsRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule $container = self::getContainer(); return new ExistingClassesInInterfaceExtendsRule( new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/ForbiddenNameCheckExtensionRuleTest.php b/tests/PHPStan/Rules/Classes/ForbiddenNameCheckExtensionRuleTest.php index 0c5c640b79..0a15eba1e0 100644 --- a/tests/PHPStan/Rules/Classes/ForbiddenNameCheckExtensionRuleTest.php +++ b/tests/PHPStan/Rules/Classes/ForbiddenNameCheckExtensionRuleTest.php @@ -52,7 +52,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: true), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: true, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/InstantiationRuleTest.php b/tests/PHPStan/Rules/Classes/InstantiationRuleTest.php index c26630dd27..1d83e53065 100644 --- a/tests/PHPStan/Rules/Classes/InstantiationRuleTest.php +++ b/tests/PHPStan/Rules/Classes/InstantiationRuleTest.php @@ -15,6 +15,7 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Testing\RuleTestCase; +use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\RequiresPhp; /** @@ -27,6 +28,8 @@ class InstantiationRuleTest extends RuleTestCase private bool $checkImplicitMixed = false; + private bool $checkImportedClassNameCase = false; + protected function getRule(): Rule { $reflectionProvider = self::createReflectionProvider(); @@ -56,7 +59,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: true), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: true, checkImportedClassNameCase: $this->checkImportedClassNameCase), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -739,14 +742,28 @@ public function testBug15047(): void $this->analyse([__DIR__ . '/data/bug-15047.php'], []); } - public function testBug12827(): void + public static function dataBug12827(): array { - $this->analyse([__DIR__ . '/data/bug-12827.php'], [ - [ + return [ + [true], + [false], + ]; + } + + #[DataProvider('dataBug12827')] + public function testBug12827(bool $checkImportedClassNameCase): void + { + $this->checkImportedClassNameCase = $checkImportedClassNameCase; + + $expectedErrors = []; + if ($checkImportedClassNameCase) { + $expectedErrors[] = [ 'Class Bug12827Classes\Post referenced with incorrect case: Bug12827Classes\POST.', 15, - ], - ]); + ]; + } + + $this->analyse([__DIR__ . '/data/bug-12827.php'], $expectedErrors); } } diff --git a/tests/PHPStan/Rules/Classes/LocalTypeAliasesRuleTest.php b/tests/PHPStan/Rules/Classes/LocalTypeAliasesRuleTest.php index 965595f31e..523ada511f 100644 --- a/tests/PHPStan/Rules/Classes/LocalTypeAliasesRuleTest.php +++ b/tests/PHPStan/Rules/Classes/LocalTypeAliasesRuleTest.php @@ -33,7 +33,7 @@ protected function getRule(): Rule $container->getByType(TypeNodeResolver::class), new MissingTypehintCheck(true, [], true), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/LocalTypeTraitAliasesRuleTest.php b/tests/PHPStan/Rules/Classes/LocalTypeTraitAliasesRuleTest.php index fc2ab49527..46c6a5351d 100644 --- a/tests/PHPStan/Rules/Classes/LocalTypeTraitAliasesRuleTest.php +++ b/tests/PHPStan/Rules/Classes/LocalTypeTraitAliasesRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule $container->getByType(TypeNodeResolver::class), new MissingTypehintCheck(true, [], true), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/LocalTypeTraitUseAliasesRuleTest.php b/tests/PHPStan/Rules/Classes/LocalTypeTraitUseAliasesRuleTest.php index 1fe15dc1f1..d6e21c4ad2 100644 --- a/tests/PHPStan/Rules/Classes/LocalTypeTraitUseAliasesRuleTest.php +++ b/tests/PHPStan/Rules/Classes/LocalTypeTraitUseAliasesRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule $container->getByType(TypeNodeResolver::class), new MissingTypehintCheck(true, [], true), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php b/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php index 11744b0e0c..da05b5d250 100644 --- a/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MethodTagRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): TRule new MethodTagCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php b/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php index 39e19c1f75..900fe39dc2 100644 --- a/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MethodTagTraitRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): TRule new MethodTagCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php index 7a44a8678c..417df02735 100644 --- a/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MethodTagTraitUseRuleTest.php @@ -29,7 +29,7 @@ protected function getRule(): TRule new MethodTagCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/MixinRuleTest.php b/tests/PHPStan/Rules/Classes/MixinRuleTest.php index 3917a32459..84ac634dcf 100644 --- a/tests/PHPStan/Rules/Classes/MixinRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MixinRuleTest.php @@ -29,7 +29,7 @@ protected function getRule(): Rule new MixinCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php b/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php index d5b81db981..f463047c14 100644 --- a/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MixinTraitRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): Rule new MixinCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php index ff62fca13a..7a3928b82f 100644 --- a/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/MixinTraitUseRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): Rule new MixinCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php b/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php index 78a9c6dfc5..63a46d29b2 100644 --- a/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php +++ b/tests/PHPStan/Rules/Classes/PropertyTagRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): TRule new PropertyTagCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php b/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php index 7bd77d248e..7bd699f5b8 100644 --- a/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php +++ b/tests/PHPStan/Rules/Classes/PropertyTagTraitRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): TRule new PropertyTagCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php b/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php index d83dd81496..911a3cae81 100644 --- a/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php +++ b/tests/PHPStan/Rules/Classes/PropertyTagTraitUseRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): TRule new PropertyTagCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Constants/ConstantAttributesRuleTest.php b/tests/PHPStan/Rules/Constants/ConstantAttributesRuleTest.php index a9d853a390..875f774992 100644 --- a/tests/PHPStan/Rules/Constants/ConstantAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Constants/ConstantAttributesRuleTest.php @@ -59,6 +59,7 @@ protected function getRule(): Rule new ClassCaseSensitivityCheck( $reflectionProvider, checkInternalClassCaseSensitivity: false, + checkImportedClassNameCase: true, ), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, diff --git a/tests/PHPStan/Rules/EnumCases/EnumCaseAttributesRuleTest.php b/tests/PHPStan/Rules/EnumCases/EnumCaseAttributesRuleTest.php index d2d76782cc..66c84d1dbc 100644 --- a/tests/PHPStan/Rules/EnumCases/EnumCaseAttributesRuleTest.php +++ b/tests/PHPStan/Rules/EnumCases/EnumCaseAttributesRuleTest.php @@ -51,7 +51,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Exceptions/CaughtExceptionExistenceRuleTest.php b/tests/PHPStan/Rules/Exceptions/CaughtExceptionExistenceRuleTest.php index fcde400c48..2fda0076dd 100644 --- a/tests/PHPStan/Rules/Exceptions/CaughtExceptionExistenceRuleTest.php +++ b/tests/PHPStan/Rules/Exceptions/CaughtExceptionExistenceRuleTest.php @@ -9,6 +9,7 @@ use PHPStan\Rules\RestrictedUsage\RestrictedClassNameUsageExtension; use PHPStan\Rules\Rule; use PHPStan\Testing\RuleTestCase; +use PHPUnit\Framework\Attributes\DataProvider; /** * @extends RuleTestCase @@ -16,6 +17,8 @@ class CaughtExceptionExistenceRuleTest extends RuleTestCase { + private bool $checkImportedClassNameCase = false; + protected function getRule(): Rule { $reflectionProvider = self::createReflectionProvider(); @@ -23,7 +26,7 @@ protected function getRule(): Rule return new CaughtExceptionExistenceRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, $this->checkImportedClassNameCase), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -76,14 +79,28 @@ public function testPhpstanInternalClass(): void ]); } - public function testBug12827(): void + public static function dataBug12827(): array { - $this->analyse([__DIR__ . '/data/bug-12827.php'], [ - [ + return [ + [true], + [false], + ]; + } + + #[DataProvider('dataBug12827')] + public function testBug12827(bool $checkImportedClassNameCase): void + { + $this->checkImportedClassNameCase = $checkImportedClassNameCase; + + $expectedErrors = []; + if ($checkImportedClassNameCase) { + $expectedErrors[] = [ 'Class Bug12827Exceptions\MissingRoutingReferenceException referenced with incorrect case: Bug12827Exceptions\MissingRoutingreferenceException.', 20, - ], - ]); + ]; + } + + $this->analyse([__DIR__ . '/data/bug-12827.php'], $expectedErrors); } } diff --git a/tests/PHPStan/Rules/Functions/ArrowFunctionAttributesRuleTest.php b/tests/PHPStan/Rules/Functions/ArrowFunctionAttributesRuleTest.php index 80c987474c..fbfd8e33bf 100644 --- a/tests/PHPStan/Rules/Functions/ArrowFunctionAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Functions/ArrowFunctionAttributesRuleTest.php @@ -50,7 +50,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Functions/ClosureAttributesRuleTest.php b/tests/PHPStan/Rules/Functions/ClosureAttributesRuleTest.php index ec1d69de63..83a4275b87 100644 --- a/tests/PHPStan/Rules/Functions/ClosureAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Functions/ClosureAttributesRuleTest.php @@ -50,7 +50,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRuleTest.php b/tests/PHPStan/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRuleTest.php index d1d9f60c59..0757aa9a16 100644 --- a/tests/PHPStan/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRuleTest.php +++ b/tests/PHPStan/Rules/Functions/ExistingClassesInArrowFunctionTypehintsRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule new FunctionDefinitionCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -41,6 +41,7 @@ protected function getRule(): Rule new PhpVersion($this->phpVersionId), true, false, + true, ), new PhpVersion(PHP_VERSION_ID), ); diff --git a/tests/PHPStan/Rules/Functions/ExistingClassesInClosureTypehintsRuleTest.php b/tests/PHPStan/Rules/Functions/ExistingClassesInClosureTypehintsRuleTest.php index 85105d7647..b71ee2f36a 100644 --- a/tests/PHPStan/Rules/Functions/ExistingClassesInClosureTypehintsRuleTest.php +++ b/tests/PHPStan/Rules/Functions/ExistingClassesInClosureTypehintsRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule new FunctionDefinitionCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -41,6 +41,7 @@ protected function getRule(): Rule new PhpVersion($this->phpVersionId), true, false, + true, ), ); } diff --git a/tests/PHPStan/Rules/Functions/ExistingClassesInTypehintsRuleTest.php b/tests/PHPStan/Rules/Functions/ExistingClassesInTypehintsRuleTest.php index 7d9f351074..965660f60e 100644 --- a/tests/PHPStan/Rules/Functions/ExistingClassesInTypehintsRuleTest.php +++ b/tests/PHPStan/Rules/Functions/ExistingClassesInTypehintsRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule new FunctionDefinitionCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -41,6 +41,7 @@ protected function getRule(): Rule new PhpVersion($this->phpVersionId), true, false, + true, ), ); } diff --git a/tests/PHPStan/Rules/Functions/FunctionAttributesRuleTest.php b/tests/PHPStan/Rules/Functions/FunctionAttributesRuleTest.php index 0ad877c2c3..1400a20f41 100644 --- a/tests/PHPStan/Rules/Functions/FunctionAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Functions/FunctionAttributesRuleTest.php @@ -50,7 +50,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Functions/ParamAttributesRuleTest.php b/tests/PHPStan/Rules/Functions/ParamAttributesRuleTest.php index 32747cba13..b33a196c94 100644 --- a/tests/PHPStan/Rules/Functions/ParamAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Functions/ParamAttributesRuleTest.php @@ -50,7 +50,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/ClassTemplateTypeRuleTest.php b/tests/PHPStan/Rules/Generics/ClassTemplateTypeRuleTest.php index 53efb228d7..ae5f22343c 100644 --- a/tests/PHPStan/Rules/Generics/ClassTemplateTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generics/ClassTemplateTypeRuleTest.php @@ -27,7 +27,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/FunctionTemplateTypeRuleTest.php b/tests/PHPStan/Rules/Generics/FunctionTemplateTypeRuleTest.php index 8a069c297c..84b589f780 100644 --- a/tests/PHPStan/Rules/Generics/FunctionTemplateTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generics/FunctionTemplateTypeRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/InterfaceTemplateTypeRuleTest.php b/tests/PHPStan/Rules/Generics/InterfaceTemplateTypeRuleTest.php index e677a32397..4cf401d680 100644 --- a/tests/PHPStan/Rules/Generics/InterfaceTemplateTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generics/InterfaceTemplateTypeRuleTest.php @@ -26,7 +26,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeRuleTest.php b/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeRuleTest.php index f2ca7568a4..896ee626b4 100644 --- a/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeRuleTest.php @@ -29,7 +29,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeTraitRuleTest.php b/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeTraitRuleTest.php index 9ddd6e983a..5e04032fea 100644 --- a/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeTraitRuleTest.php +++ b/tests/PHPStan/Rules/Generics/MethodTagTemplateTypeTraitRuleTest.php @@ -29,7 +29,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/MethodTemplateTypeRuleTest.php b/tests/PHPStan/Rules/Generics/MethodTemplateTypeRuleTest.php index 7db505c2de..7fcf70d95c 100644 --- a/tests/PHPStan/Rules/Generics/MethodTemplateTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generics/MethodTemplateTypeRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Generics/TraitTemplateTypeRuleTest.php b/tests/PHPStan/Rules/Generics/TraitTemplateTypeRuleTest.php index e99d6add8b..a13d66c17b 100644 --- a/tests/PHPStan/Rules/Generics/TraitTemplateTypeRuleTest.php +++ b/tests/PHPStan/Rules/Generics/TraitTemplateTypeRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php b/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php index f4d3868b15..2120d618a4 100644 --- a/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php +++ b/tests/PHPStan/Rules/Methods/CallStaticMethodsRuleTest.php @@ -53,6 +53,7 @@ protected function getRule(): Rule new ClassCaseSensitivityCheck( $reflectionProvider, checkInternalClassCaseSensitivity: true, + checkImportedClassNameCase: true, ), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, diff --git a/tests/PHPStan/Rules/Methods/ExistingClassesInTypehintsRuleTest.php b/tests/PHPStan/Rules/Methods/ExistingClassesInTypehintsRuleTest.php index b0d2d53bff..c72a20e10e 100644 --- a/tests/PHPStan/Rules/Methods/ExistingClassesInTypehintsRuleTest.php +++ b/tests/PHPStan/Rules/Methods/ExistingClassesInTypehintsRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule new FunctionDefinitionCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -41,6 +41,7 @@ protected function getRule(): Rule new PhpVersion($this->phpVersionId), true, false, + true, ), ); } diff --git a/tests/PHPStan/Rules/Methods/MethodAttributesRuleTest.php b/tests/PHPStan/Rules/Methods/MethodAttributesRuleTest.php index 0db3fedf0b..eb6e3c6f6a 100644 --- a/tests/PHPStan/Rules/Methods/MethodAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Methods/MethodAttributesRuleTest.php @@ -15,6 +15,7 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Testing\RuleTestCase; +use PHPUnit\Framework\Attributes\DataProvider; /** * @extends RuleTestCase @@ -22,6 +23,8 @@ class MethodAttributesRuleTest extends RuleTestCase { + private bool $checkImportedClassNameCase = false; + protected function getRule(): Rule { $reflectionProvider = self::createReflectionProvider(); @@ -53,6 +56,7 @@ protected function getRule(): Rule new ClassCaseSensitivityCheck( $reflectionProvider, checkInternalClassCaseSensitivity: false, + checkImportedClassNameCase: $this->checkImportedClassNameCase, ), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, @@ -83,14 +87,28 @@ public function testDeprecatedAttribute(): void $this->analyse([__DIR__ . '/data/deprecated-attribute.php'], []); } - public function testBug12827(): void + public static function dataBug12827(): array { - $this->analyse([__DIR__ . '/data/bug-12827.php'], [ - [ + return [ + [true], + [false], + ]; + } + + #[DataProvider('dataBug12827')] + public function testBug12827(bool $checkImportedClassNameCase): void + { + $this->checkImportedClassNameCase = $checkImportedClassNameCase; + + $expectedErrors = []; + if ($checkImportedClassNameCase) { + $expectedErrors[] = [ 'Class Bug12827\Post referenced with incorrect case: Bug12827\POST.', 12, - ], - ]); + ]; + } + + $this->analyse([__DIR__ . '/data/bug-12827.php'], $expectedErrors); } } diff --git a/tests/PHPStan/Rules/Methods/StaticMethodCallableRuleTest.php b/tests/PHPStan/Rules/Methods/StaticMethodCallableRuleTest.php index 68cc6f1154..f5ed300bfd 100644 --- a/tests/PHPStan/Rules/Methods/StaticMethodCallableRuleTest.php +++ b/tests/PHPStan/Rules/Methods/StaticMethodCallableRuleTest.php @@ -45,6 +45,7 @@ protected function getRule(): Rule new ClassCaseSensitivityCheck( $reflectionProvider, checkInternalClassCaseSensitivity: true, + checkImportedClassNameCase: true, ), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, diff --git a/tests/PHPStan/Rules/Namespaces/ExistingNamesInGroupUseRuleTest.php b/tests/PHPStan/Rules/Namespaces/ExistingNamesInGroupUseRuleTest.php index 5e87a88814..6702c29e5b 100644 --- a/tests/PHPStan/Rules/Namespaces/ExistingNamesInGroupUseRuleTest.php +++ b/tests/PHPStan/Rules/Namespaces/ExistingNamesInGroupUseRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule return new ExistingNamesInGroupUseRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Namespaces/ExistingNamesInUseRuleTest.php b/tests/PHPStan/Rules/Namespaces/ExistingNamesInUseRuleTest.php index 192dd38638..2cee3b3dad 100644 --- a/tests/PHPStan/Rules/Namespaces/ExistingNamesInUseRuleTest.php +++ b/tests/PHPStan/Rules/Namespaces/ExistingNamesInUseRuleTest.php @@ -23,7 +23,7 @@ protected function getRule(): Rule return new ExistingNamesInUseRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/FunctionAssertRuleTest.php b/tests/PHPStan/Rules/PhpDoc/FunctionAssertRuleTest.php index 8a2b031904..349175cf33 100644 --- a/tests/PHPStan/Rules/PhpDoc/FunctionAssertRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/FunctionAssertRuleTest.php @@ -26,7 +26,7 @@ protected function getRule(): Rule $reflectionProvider, new UnresolvableTypeHelper(), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/IncompatiblePhpDocTypeRuleTest.php b/tests/PHPStan/Rules/PhpDoc/IncompatiblePhpDocTypeRuleTest.php index 7c224a027c..c334f0c18c 100644 --- a/tests/PHPStan/Rules/PhpDoc/IncompatiblePhpDocTypeRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/IncompatiblePhpDocTypeRuleTest.php @@ -35,7 +35,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyHookPhpDocTypeRuleTest.php b/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyHookPhpDocTypeRuleTest.php index ef942fccdf..baf02b1d18 100644 --- a/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyHookPhpDocTypeRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyHookPhpDocTypeRuleTest.php @@ -35,7 +35,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRuleTest.php b/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRuleTest.php index ac5fd037f0..674aa08800 100644 --- a/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/IncompatiblePropertyPhpDocTypeRuleTest.php @@ -32,7 +32,7 @@ protected function getRule(): Rule new TemplateTypeCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/InvalidPhpDocVarTagTypeRuleTest.php b/tests/PHPStan/Rules/PhpDoc/InvalidPhpDocVarTagTypeRuleTest.php index aa3146393b..7a35c15ab2 100644 --- a/tests/PHPStan/Rules/PhpDoc/InvalidPhpDocVarTagTypeRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/InvalidPhpDocVarTagTypeRuleTest.php @@ -28,7 +28,7 @@ protected function getRule(): Rule $container->getByType(FileTypeMapper::class), $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/MethodAssertRuleTest.php b/tests/PHPStan/Rules/PhpDoc/MethodAssertRuleTest.php index b1685af852..e8e2abe2be 100644 --- a/tests/PHPStan/Rules/PhpDoc/MethodAssertRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/MethodAssertRuleTest.php @@ -26,7 +26,7 @@ protected function getRule(): Rule $reflectionProvider, new UnresolvableTypeHelper(), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionClassRuleTest.php b/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionClassRuleTest.php index 18862d28d8..56ec742736 100644 --- a/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionClassRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionClassRuleTest.php @@ -26,7 +26,7 @@ protected function getRule(): Rule new RequireExtendsCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionTraitRuleTest.php b/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionTraitRuleTest.php index 6f4b957c84..704642bc5e 100644 --- a/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionTraitRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/RequireExtendsDefinitionTraitRuleTest.php @@ -27,7 +27,7 @@ protected function getRule(): Rule new RequireExtendsCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/RequireImplementsDefinitionTraitRuleTest.php b/tests/PHPStan/Rules/PhpDoc/RequireImplementsDefinitionTraitRuleTest.php index aec90d4ffa..913ccd7be5 100644 --- a/tests/PHPStan/Rules/PhpDoc/RequireImplementsDefinitionTraitRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/RequireImplementsDefinitionTraitRuleTest.php @@ -25,7 +25,7 @@ protected function getRule(): Rule return new RequireImplementsDefinitionTraitRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/PhpDoc/SealedDefinitionClassRuleTest.php b/tests/PHPStan/Rules/PhpDoc/SealedDefinitionClassRuleTest.php index fae52e4c7b..92a409fd91 100644 --- a/tests/PHPStan/Rules/PhpDoc/SealedDefinitionClassRuleTest.php +++ b/tests/PHPStan/Rules/PhpDoc/SealedDefinitionClassRuleTest.php @@ -25,7 +25,7 @@ protected function getRule(): Rule return new SealedDefinitionClassRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Properties/AccessStaticPropertiesInAssignRuleTest.php b/tests/PHPStan/Rules/Properties/AccessStaticPropertiesInAssignRuleTest.php index 2fc183a83e..f230eaf133 100644 --- a/tests/PHPStan/Rules/Properties/AccessStaticPropertiesInAssignRuleTest.php +++ b/tests/PHPStan/Rules/Properties/AccessStaticPropertiesInAssignRuleTest.php @@ -37,7 +37,7 @@ protected function getRule(): Rule discoveringSymbolsTip: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck(self::getContainer()->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, self::getContainer()->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Properties/AccessStaticPropertiesRuleTest.php b/tests/PHPStan/Rules/Properties/AccessStaticPropertiesRuleTest.php index 8b504125fa..56c2a01fd4 100644 --- a/tests/PHPStan/Rules/Properties/AccessStaticPropertiesRuleTest.php +++ b/tests/PHPStan/Rules/Properties/AccessStaticPropertiesRuleTest.php @@ -37,7 +37,7 @@ protected function getRule(): Rule discoveringSymbolsTip: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck(self::getContainer()->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, self::getContainer()->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Properties/ExistingClassesInPropertiesRuleTest.php b/tests/PHPStan/Rules/Properties/ExistingClassesInPropertiesRuleTest.php index 369e071b7e..cab1e94ed5 100644 --- a/tests/PHPStan/Rules/Properties/ExistingClassesInPropertiesRuleTest.php +++ b/tests/PHPStan/Rules/Properties/ExistingClassesInPropertiesRuleTest.php @@ -29,7 +29,7 @@ protected function getRule(): Rule return new ExistingClassesInPropertiesRule( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Properties/ExistingClassesInPropertyHookTypehintsRuleTest.php b/tests/PHPStan/Rules/Properties/ExistingClassesInPropertyHookTypehintsRuleTest.php index 59d38242a5..8390efc95f 100644 --- a/tests/PHPStan/Rules/Properties/ExistingClassesInPropertyHookTypehintsRuleTest.php +++ b/tests/PHPStan/Rules/Properties/ExistingClassesInPropertyHookTypehintsRuleTest.php @@ -29,7 +29,7 @@ protected function getRule(): Rule new FunctionDefinitionCheck( $reflectionProvider, new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, true), + new ClassCaseSensitivityCheck($reflectionProvider, true, true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), @@ -38,6 +38,7 @@ protected function getRule(): Rule new PhpVersion(PHP_VERSION_ID), true, false, + true, ), ); } diff --git a/tests/PHPStan/Rules/Properties/PropertyAttributesRuleTest.php b/tests/PHPStan/Rules/Properties/PropertyAttributesRuleTest.php index a35a951753..8b1c56aa1c 100644 --- a/tests/PHPStan/Rules/Properties/PropertyAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Properties/PropertyAttributesRuleTest.php @@ -52,7 +52,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Properties/PropertyHookAttributesRuleTest.php b/tests/PHPStan/Rules/Properties/PropertyHookAttributesRuleTest.php index 385ff733bf..7b00b3faaf 100644 --- a/tests/PHPStan/Rules/Properties/PropertyHookAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Properties/PropertyHookAttributesRuleTest.php @@ -50,7 +50,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class), diff --git a/tests/PHPStan/Rules/Traits/TraitAttributesRuleTest.php b/tests/PHPStan/Rules/Traits/TraitAttributesRuleTest.php index 68fea35dcd..086984256f 100644 --- a/tests/PHPStan/Rules/Traits/TraitAttributesRuleTest.php +++ b/tests/PHPStan/Rules/Traits/TraitAttributesRuleTest.php @@ -57,7 +57,7 @@ protected function getRule(): Rule checkMissingTypehints: true, ), new ClassNameCheck( - new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false), + new ClassCaseSensitivityCheck($reflectionProvider, checkInternalClassCaseSensitivity: false, checkImportedClassNameCase: true), new ClassForbiddenNameCheck($container->getExtensionsCollection(ForbiddenClassNameExtension::class)), $reflectionProvider, $container->getExtensionsCollection(RestrictedClassNameUsageExtension::class),