1<?php 2/** 3 * Ensures that strings are not joined using array.join(). 4 * 5 * PHP version 5 6 * 7 * @category PHP 8 * @package PHP_CodeSniffer_MySource 9 * @author Greg Sherwood <gsherwood@squiz.net> 10 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) 11 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence 12 * @link http://pear.php.net/package/PHP_CodeSniffer 13 */ 14 15/** 16 * Ensures that strings are not joined using array.join(). 17 * 18 * @category PHP 19 * @package PHP_CodeSniffer_MySource 20 * @author Greg Sherwood <gsherwood@squiz.net> 21 * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) 22 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence 23 * @version Release: @package_version@ 24 * @link http://pear.php.net/package/PHP_CodeSniffer 25 */ 26class MySource_Sniffs_Strings_JoinStringsSniff implements PHP_CodeSniffer_Sniff 27{ 28 29 /** 30 * A list of tokenizers this sniff supports. 31 * 32 * @var array 33 */ 34 public $supportedTokenizers = array('JS'); 35 36 37 /** 38 * Returns an array of tokens this test wants to listen for. 39 * 40 * @return array 41 */ 42 public function register() 43 { 44 return array(T_STRING); 45 46 }//end register() 47 48 49 /** 50 * Processes this test, when one of its tokens is encountered. 51 * 52 * @param PHP_CodeSniffer_File $phpcsFile The file being scanned. 53 * @param integer $stackPtr The position of the current token 54 * in the stack passed in $tokens. 55 * 56 * @return void 57 */ 58 public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr) 59 { 60 $tokens = $phpcsFile->getTokens(); 61 62 if ($tokens[$stackPtr]['content'] !== 'join') { 63 return; 64 } 65 66 $prev = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr - 1), null, true); 67 if ($tokens[$prev]['code'] !== T_OBJECT_OPERATOR) { 68 return; 69 } 70 71 $prev = $phpcsFile->findPrevious(PHP_CodeSniffer_Tokens::$emptyTokens, ($prev - 1), null, true); 72 if ($tokens[$prev]['code'] === T_CLOSE_SQUARE_BRACKET) { 73 $opener = $tokens[$prev]['bracket_opener']; 74 if ($tokens[($opener - 1)]['code'] !== T_STRING) { 75 // This means the array is declared inline, like x = [a,b,c].join() 76 // and not elsewhere, like x = y[a].join() 77 // The first is not allowed while the second is. 78 $error = 'Joining strings using inline arrays is not allowed; use the + operator instead'; 79 $phpcsFile->addError($error, $stackPtr, 'ArrayNotAllowed'); 80 } 81 } 82 83 }//end process() 84 85 86}//end class 87