From 838784ad6ef77f3f4e3cac5eafea109f8bac0476 Mon Sep 17 00:00:00 2001 From: webimpress Date: Mon, 6 May 2019 17:47:35 +0100 Subject: [PATCH] DisallowFqn - fixed issues when backslash was removed but there was no space --- .../Sniffs/PHP/DisallowFqnSniff.php | 49 ++++++++++++++++++- test/Sniffs/PHP/DisallowFqnUnitTest.inc | 40 +++++++++++++++ test/Sniffs/PHP/DisallowFqnUnitTest.inc.fixed | 42 ++++++++++++++++ test/Sniffs/PHP/DisallowFqnUnitTest.php | 18 +++++++ 4 files changed, 148 insertions(+), 1 deletion(-) diff --git a/src/WebimpressCodingStandard/Sniffs/PHP/DisallowFqnSniff.php b/src/WebimpressCodingStandard/Sniffs/PHP/DisallowFqnSniff.php index 55415cd7..845b993e 100644 --- a/src/WebimpressCodingStandard/Sniffs/PHP/DisallowFqnSniff.php +++ b/src/WebimpressCodingStandard/Sniffs/PHP/DisallowFqnSniff.php @@ -36,6 +36,7 @@ use const GLOB_NOSORT; use const T_BITWISE_AND; use const T_BITWISE_OR; +use const T_CASE; use const T_CATCH; use const T_CLOSE_PARENTHESIS; use const T_CLOSURE; @@ -45,17 +46,29 @@ use const T_DOC_COMMENT_TAG; use const T_DOC_COMMENT_WHITESPACE; use const T_DOUBLE_COLON; +use const T_ECHO; use const T_ELLIPSIS; use const T_EXTENDS; use const T_FUNCTION; use const T_IMPLEMENTS; +use const T_INCLUDE; +use const T_INCLUDE_ONCE; use const T_INSTANCEOF; +use const T_INSTEADOF; +use const T_LOGICAL_AND; +use const T_LOGICAL_OR; +use const T_LOGICAL_XOR; use const T_NAMESPACE; use const T_NEW; use const T_NS_SEPARATOR; use const T_NULLABLE; use const T_OPEN_PARENTHESIS; +use const T_PRINT; +use const T_REQUIRE; +use const T_REQUIRE_ONCE; +use const T_RETURN; use const T_STRING; +use const T_THROW; use const T_USE; use const T_VARIABLE; @@ -260,7 +273,17 @@ private function processString(File $phpcsFile, int $stackPtr, string $namespace true ); - if (in_array($tokens[$prev]['code'], [T_NEW, T_USE, T_EXTENDS, T_IMPLEMENTS, T_INSTANCEOF, T_NULLABLE], true) + $prevClassTokens = [ + T_NEW, + T_USE, + T_EXTENDS, + T_IMPLEMENTS, + T_INSTANCEOF, + T_INSTEADOF, + T_NULLABLE, + ]; + + if (in_array($tokens[$prev]['code'], $prevClassTokens, true) || in_array($tokens[$next]['code'], [T_VARIABLE, T_ELLIPSIS, T_DOUBLE_COLON], true) ) { $type = 'class'; @@ -465,7 +488,31 @@ private function error( if ($fix) { $tokens = $phpcsFile->getTokens(); + if (in_array($tokens[$stackPtr - 1]['code'], [ + T_NEW, + T_USE, + T_EXTENDS, + T_IMPLEMENTS, + T_INSTANCEOF, + T_INSTEADOF, + T_CASE, + T_PRINT, + T_ECHO, + T_REQUIRE, + T_REQUIRE_ONCE, + T_INCLUDE, + T_INCLUDE_ONCE, + T_RETURN, + T_LOGICAL_AND, + T_LOGICAL_OR, + T_LOGICAL_XOR, + T_THROW, + ], true)) { + $expected = ' ' . $expected; + } + $phpcsFile->fixer->beginChangeset(); + $phpcsFile->fixer->replaceToken($stackPtr, $expected); $i = $stackPtr; while (isset($tokens[++$i])) { diff --git a/test/Sniffs/PHP/DisallowFqnUnitTest.inc b/test/Sniffs/PHP/DisallowFqnUnitTest.inc index c5bdad59..393e4c96 100644 --- a/test/Sniffs/PHP/DisallowFqnUnitTest.inc +++ b/test/Sniffs/PHP/DisallowFqnUnitTest.inc @@ -104,4 +104,44 @@ class TheClass extends \ MyNamespace \ Hello \ ParentClass implements \ArrayAcce return \T_WHITESPACE + T_ELLIPSIS; } + + public function missingSpace() + { + return new class () extends\DateTime implements\Countable + { + use\MyTrait { + A::big insteadof\B; + } + + public function checkInstance($a) : bool + { + return $a instanceof\Exception; + } + + public function conditions(string $a) : ?string + { + switch ($a) { + case\DateTime::class: + return\DateTime::class; + case\Countable::class: + print\Countable::class; + echo\Countable::class; + return null; + case 'require': + require\DateTime::class.'.php'; + require_once\DateTime::class.'.php'; + include\DateTime::class.'.php'; + include_once\DateTime::class.'.php'; + case 'new': + new\DateTime(); + } + + if ($a and\DateTime::class) { + } elseif ($a or\DateTime::class) { + } elseif ($a xor\DateTime::class) {} + + throw\RuntimeException::something(); + } + }; + } } diff --git a/test/Sniffs/PHP/DisallowFqnUnitTest.inc.fixed b/test/Sniffs/PHP/DisallowFqnUnitTest.inc.fixed index ef3f3864..798b32b0 100644 --- a/test/Sniffs/PHP/DisallowFqnUnitTest.inc.fixed +++ b/test/Sniffs/PHP/DisallowFqnUnitTest.inc.fixed @@ -24,6 +24,8 @@ use const Bar\Baz\BAR_BAZ; use const Name\NAME_CONST; use const Name\CONST_IN_SWITCH; use const Name\OTHER_CONST_IN_SWITCH; +use MyTrait; +use B; use \ArrayObject as AO; @@ -127,4 +129,44 @@ class TheClass extends ParentClass implements ArrayAccess, Countable return \T_WHITESPACE + T_ELLIPSIS; } + + public function missingSpace() + { + return new class () extends DateTime implements Countable + { + use MyTrait { + A::big insteadof B; + } + + public function checkInstance($a) : bool + { + return $a instanceof Exception; + } + + public function conditions(string $a) : ?string + { + switch ($a) { + case DateTime::class: + return DateTime::class; + case Countable::class: + print Countable::class; + echo Countable::class; + return null; + case 'require': + require DateTime::class.'.php'; + require_once DateTime::class.'.php'; + include DateTime::class.'.php'; + include_once DateTime::class.'.php'; + case 'new': + new DateTime(); + } + + if ($a and DateTime::class) { + } elseif ($a or DateTime::class) { + } elseif ($a xor DateTime::class) {} + + throw RuntimeException::something(); + } + }; + } } diff --git a/test/Sniffs/PHP/DisallowFqnUnitTest.php b/test/Sniffs/PHP/DisallowFqnUnitTest.php index b7310251..f8e045a6 100644 --- a/test/Sniffs/PHP/DisallowFqnUnitTest.php +++ b/test/Sniffs/PHP/DisallowFqnUnitTest.php @@ -78,6 +78,24 @@ protected function getErrorList(string $testFile = '') : array 86 => 2, 90 => 1, 94 => 1, + 110 => 2, + 112 => 1, + 113 => 1, + 118 => 1, + 124 => 1, + 125 => 1, + 126 => 1, + 127 => 1, + 128 => 1, + 131 => 1, + 132 => 1, + 133 => 1, + 134 => 1, + 136 => 1, + 139 => 1, + 140 => 1, + 141 => 1, + 143 => 1, ]; }