diff --git a/Readme.rst b/Readme.rst index 8cda268..429d553 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. + - Instantiation through ``new``. - Instantiation through ``makeInstance``. @@ -84,3 +86,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/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php index 5537b0f..a32c574 100644 --- a/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php +++ b/src/Standards/Typo3Update/Sniffs/LegacyClassnames/ClassnameCheckerTrait.php @@ -34,6 +34,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. */ @@ -60,6 +70,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 @@ -79,6 +114,8 @@ trait ClassnameCheckerTrait */ public function addFixableError(PhpcsFile $phpcsFile, $classnamePosition, $classname) { + $this->addMaybeWarning($phpcsFile, $classnamePosition, $classname); + if ($this->isLegacyClassname($classname) === false) { return; } @@ -98,6 +135,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. 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. + + + + + +