Mercurial > hg > isophonics-drupal-site
view vendor/drupal/coder/coder_sniffer/DrupalPractice/Sniffs/Objects/GlobalFunctionSniff.php @ 19:fa3358dc1485 tip
Add ndrum files
author | Chris Cannam |
---|---|
date | Wed, 28 Aug 2019 13:14:47 +0100 |
parents | 129ea1e6d783 |
children |
line wrap: on
line source
<?php /** * \DrupalPractice\Sniffs\Objects\GlobalFunctionSniff. * * @category PHP * @package PHP_CodeSniffer * @link http://pear.php.net/package/PHP_CodeSniffer */ namespace DrupalPractice\Sniffs\Objects; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; use DrupalPractice\Sniffs\Objects\GlobalDrupalSniff; use DrupalPractice\Project; /** * Checks that global functions like t() are not used in forms or controllers. * * @category PHP * @package PHP_CodeSniffer * @link http://pear.php.net/package/PHP_CodeSniffer */ class GlobalFunctionSniff implements Sniff { /** * List of global functions that should not be called. * * @var string[] */ protected $functions = array( 'drupal_get_destination' => 'the "redirect.destination" service', 'drupal_render' => 'the "renderer" service', 'entity_load' => 'the "entity_type.manager" service', 'file_load' => 'the "entity_type.manager" service', 'format_date' => 'the "date.formatter" service', 'node_load' => 'the "entity_type.manager" service', 'node_load_multiple' => 'the "entity_type.manager" service', 'node_type_load' => 'the "entity_type.manager" service', 't' => '$this->t()', 'taxonomy_term_load' => 'the "entity_type.manager" service', 'taxonomy_vocabulary_load' => 'the "entity_type.manager" service', 'user_load' => 'the "entity_type.manager" service', 'user_role_load' => 'the "entity_type.manager" service', ); /** * Returns an array of tokens this test wants to listen for. * * @return array */ public function register() { return array(T_STRING); }//end register() /** * Processes this test, when one of its tokens is encountered. * * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. * @param int $stackPtr The position of the current token * in the stack passed in $tokens. * * @return void */ public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); // We are only interested in function calls, which are not in the global // scope. if (isset($this->functions[$tokens[$stackPtr]['content']]) === false || isset($tokens[($stackPtr + 1)]) === false || $tokens[($stackPtr + 1)]['code'] !== T_OPEN_PARENTHESIS || empty($tokens[$stackPtr]['conditions']) === true ) { return; } // If there is an object operator before the call then this is a method // invocation, not a function call. $previous = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); if ($tokens[$previous]['code'] === T_OBJECT_OPERATOR) { return; } // Check that this statement is not in a static function. foreach ($tokens[$stackPtr]['conditions'] as $conditionPtr => $conditionCode) { if ($conditionCode === T_FUNCTION && $phpcsFile->getMethodProperties($conditionPtr)['is_static'] === true) { return; } } // Check if the class extends another class and get the name of the class // that is extended. $classPtr = key($tokens[$stackPtr]['conditions']); $extendsName = $phpcsFile->findExtendedClassName($classPtr); if (($extendsName === false || in_array($extendsName, GlobalDrupalSniff::$baseClasses) === false) && Project::isServiceClass($phpcsFile, $classPtr) === false ) { return; } $warning = '%s() calls should be avoided in classes, use dependency injection and %s instead'; $data = array( $tokens[$stackPtr]['content'], $this->functions[$tokens[$stackPtr]['content']], ); $phpcsFile->addWarning($warning, $stackPtr, 'GlobalFunction', $data); }//end process() }//end class