diff --git a/Readme.rst b/Readme.rst index b17e026..9955444 100644 --- a/Readme.rst +++ b/Readme.rst @@ -51,6 +51,8 @@ new ones like ``\TYPO3\Extbase\...``. This is done for: - Typehints in methods and function like injects. +- ``instanceof`` checks. + - Inline comments for IDEs, e.g. ``/* @var $configurationManager Tx_Extbase_Configuration_ConfigurationManager */`` @@ -83,3 +85,23 @@ What does it look like? ---------------------------------------------------------------------- Time: 35ms; Memory: 5Mb + +Configuration +============= + +Configuration is done through PHPCS Standards, e.g. provide a custom ``ruleset.xml`` or customize +the provided one. + +``legacyExtensions`` + Configures which extension names are legacy. Used to provide further checks and warnings about + possible legacy code. E.g. inside of non auto migrated situations. + + Example: + +.. code:: xml + + + + + + diff --git a/composer.json b/composer.json index f72a287..7807b71 100644 --- a/composer.json +++ b/composer.json @@ -7,9 +7,6 @@ "Typo3Update\\": "src/Standards/Typo3Update/" } }, - "require-dev": { - "psy/psysh": "~0.8" - }, "require": { "squizlabs/php_codesniffer_tests": "^2.0" }, diff --git a/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php index f3c7010..8d7f6a7 100644 --- a/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php +++ b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php @@ -33,6 +33,16 @@ trait ClassnameCheckerTrait */ private $legacyClassnames = []; + /** + * A list of extension names that might contain legacy class names. + * Used to check clas names for warnings. + * + * Configure through ruleset.xml. + * + * @var array + */ + public $legacyExtensions = ['Extbase', 'Fluid']; + /** * @param string $mappingFile File containing php array for mapping. */ @@ -59,6 +69,31 @@ trait ClassnameCheckerTrait return isset($this->legacyClassnames[strtolower($classname)]); } + /** + * Guesses whether the given classname is legacy. Will not check + * isLegacyClassname + * + * @param string $classname + * @return bool + */ + private function isMaybeLegacyClassname($classname) + { + if (strpos($classname, 'Tx_') === false) { + return false; + } + + $extensionName = call_user_func(function ($classname) { + $nameParts = explode('_', $classname); + return $nameParts[1]; + }, $classname); + + if (!in_array($extensionName, $this->legacyExtensions)) { + return false; + } + + return true; + } + /** * @param string $classname * @return string @@ -78,6 +113,8 @@ trait ClassnameCheckerTrait */ public function addFixableError(PhpcsFile $phpcsFile, $classnamePosition, $classname) { + $this->addMaybeWarning($phpcsFile, $classnamePosition, $classname); + if ($this->isLegacyClassname($classname) === false) { return; } @@ -97,6 +134,27 @@ trait ClassnameCheckerTrait } } + /** + * Add an warning if given $classname is maybe legacy. + * + * @param PhpcsFile $phpcsFile + * @param int $classnamePosition + * @param string $classname + */ + private function addMaybeWarning(PhpcsFile $phpcsFile, $classnamePosition, $classname) + { + if ($this->isLegacyClassname($classname) || $this->isMaybeLegacyClassname($classname) === false) { + return; + } + + $phpcsFile->addWarning( + 'Legacy classes are not allowed; found %s that might be a legacy class that does not exist anymore', + $classnamePosition, + 'mightBeLegacyClassname', + [$classname] + ); + } + /** * String to use for replacing / fixing the token. * Default is class name itself, can be overwritten in sniff for special behaviour. @@ -104,7 +162,7 @@ trait ClassnameCheckerTrait * @param string $classname * @return string */ - private function getTokenForReplacement($classname) + protected function getTokenForReplacement($classname) { return $classname; } diff --git a/src/Standards/Typo3Update/Sniffs/LegacyClassnames/DocCommentSniff.php b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/DocCommentSniff.php index f2c1792..1f18228 100644 --- a/src/Standards/Typo3Update/Sniffs/LegacyClassnames/DocCommentSniff.php +++ b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/DocCommentSniff.php @@ -83,7 +83,7 @@ class Typo3Update_Sniffs_LegacyClassnames_DocCommentSniff implements PHP_CodeSni * @param string $classname * @return string */ - public function getTokenForReplacement($classname) + protected function getTokenForReplacement($classname) { $token = explode(' ', $this->originalTokenContent); $token[0] = $classname; diff --git a/src/Standards/Typo3Update/Sniffs/LegacyClassnames/InstanceofSniff.php b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/InstanceofSniff.php new file mode 100644 index 0000000..05cf416 --- /dev/null +++ b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/InstanceofSniff.php @@ -0,0 +1,61 @@ + + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/** + * Detect and migrate extend and implement of old legacy classnames. + */ +class Typo3Update_Sniffs_LegacyClassnames_InstanceofSniff implements PHP_CodeSniffer_Sniff +{ + use \Typo3Update\Sniffs\LegacyClassnames\ClassnameCheckerTrait; + + /** + * Returns the token types that this sniff is interested in. + * + * @return array + */ + public function register() + { + return [ + T_INSTANCEOF, + ]; + } + + /** + * Processes the tokens that this sniff is interested in. + * + * @param PHP_CodeSniffer_File $phpcsFile The file where the token was found. + * @param int $stackPtr The position in the stack where + * the token was found. + * + * @return void + */ + public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) + { + $tokens = $phpcsFile->getTokens(); + $classnamePosition = $phpcsFile->findNext(T_STRING, $stackPtr); + if ($classnamePosition === false) { + return; + } + $classname = $tokens[$classnamePosition]['content']; + + $this->addFixableError($phpcsFile, $classnamePosition, $classname); + } +} diff --git a/src/Standards/Typo3Update/ruleset.xml b/src/Standards/Typo3Update/ruleset.xml index b44e6e2..b067e1d 100644 --- a/src/Standards/Typo3Update/ruleset.xml +++ b/src/Standards/Typo3Update/ruleset.xml @@ -1,4 +1,10 @@ Provides sniffs and fixes for TYPO3 Updates. + + + + + +