diff --git a/CHANGELOG.md b/CHANGELOG.md index 5af8a926..7594564e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ All notable changes to this project will be documented in this file, in reverse - [#7](https://github.com/webimpress/coding-standard/pull/7) `Commenting\DocComment` - fixes false-positive when new line was required before doc-block +- [#8](https://github.com/webimpress/coding-standard/pull/8) `Formatting\StringClassReference` - fixes checking if string is a valid class name before check if class/interface/trait exists + ## 1.0.0 - 2019-03-07 Initial release. diff --git a/src/WebimpressCodingStandard/Sniffs/Formatting/StringClassReferenceSniff.php b/src/WebimpressCodingStandard/Sniffs/Formatting/StringClassReferenceSniff.php index 438fd70f..5186a5d4 100644 --- a/src/WebimpressCodingStandard/Sniffs/Formatting/StringClassReferenceSniff.php +++ b/src/WebimpressCodingStandard/Sniffs/Formatting/StringClassReferenceSniff.php @@ -10,10 +10,11 @@ use function class_exists; use function interface_exists; use function ltrim; -use function str_replace; +use function preg_match; use function strpos; +use function strtr; +use function substr; use function trait_exists; -use function trim; use const T_CONSTANT_ENCAPSED_STRING; @@ -37,7 +38,20 @@ public function process(File $phpcsFile, $stackPtr) return; } - $name = trim(str_replace(['"', "'"], '', $tokens[$stackPtr]['content'])); + $name = strtr($tokens[$stackPtr]['content'], [ + '"' => '', + "'" => '', + '\\\\' => '\\', + ]); + + if (strpos($name, '\\\\') !== false + || preg_match('/[^\\a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]/', $name) + || substr($name, -1) === '\\' + || ltrim($name, '\\') === '' + ) { + return; + } + if (class_exists($name) || interface_exists($name) || trait_exists($name)) { $error = 'String "%s" contains class reference, use ::class instead'; $data = [$name]; diff --git a/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc b/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc index 2352e41d..4309c667 100644 --- a/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc +++ b/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc @@ -11,3 +11,15 @@ $trait = 'WebimpressCodingStandard\Helper\NamespacesTrait'; $nonExistingClass = 'MyNamespace\ClassDoesNotExist'; $nonSlash = 'DateTime'; + +$doubleNamespaceSeparator = 'WebimpressCodingStandardTest\\Ruleset'; +$fourBackslashes = 'WebimpressCodingStandardTest\\\\Ruleset'; +$spaceInTheName = 'WebimpressCodingStandardTest Ruleset'; +$newLineInTheName = 'WebimpressCodingStandardTest + Ruleset'; + +$spaceAtTheBeginning = ' WebimpressCodingStandardTest\\Ruleset'; +$spaceAtTheEnd = ' WebimpressCodingStandardTest\\Ruleset '; + +$namespaceSeparatorAtTheEnd = 'WebimpressCodingStandardTest\\Ruleset\\'; +$justNamespaceSeparator = '\\'; diff --git a/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc.fixed b/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc.fixed index 37a86606..63d387cf 100644 --- a/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc.fixed +++ b/test/Sniffs/Formatting/StringClassReferenceUnitTest.inc.fixed @@ -11,3 +11,15 @@ $trait = \WebimpressCodingStandard\Helper\NamespacesTrait::class; $nonExistingClass = 'MyNamespace\ClassDoesNotExist'; $nonSlash = 'DateTime'; + +$doubleNamespaceSeparator = \WebimpressCodingStandardTest\Ruleset::class; +$fourBackslashes = 'WebimpressCodingStandardTest\\\\Ruleset'; +$spaceInTheName = 'WebimpressCodingStandardTest Ruleset'; +$newLineInTheName = 'WebimpressCodingStandardTest + Ruleset'; + +$spaceAtTheBeginning = ' WebimpressCodingStandardTest\\Ruleset'; +$spaceAtTheEnd = ' WebimpressCodingStandardTest\\Ruleset '; + +$namespaceSeparatorAtTheEnd = 'WebimpressCodingStandardTest\\Ruleset\\'; +$justNamespaceSeparator = '\\'; diff --git a/test/Sniffs/Formatting/StringClassReferenceUnitTest.php b/test/Sniffs/Formatting/StringClassReferenceUnitTest.php index 12620979..5621e666 100644 --- a/test/Sniffs/Formatting/StringClassReferenceUnitTest.php +++ b/test/Sniffs/Formatting/StringClassReferenceUnitTest.php @@ -16,6 +16,7 @@ protected function getErrorList(string $testFile = '') : array 7 => 1, 8 => 1, 10 => 1, + 15 => 1, ]; }