|
<?php |
|
|
|
namespace PHP_CodeSniffer\Standards\Mdoq\Sniffs\Functions; |
|
|
|
use PHP_CodeSniffer\Sniffs\Sniff; |
|
use PHP_CodeSniffer\Files\File; |
|
|
|
class DisallowPrintRSniff implements Sniff |
|
{ |
|
public const METHOD_NAME = 'print_r'; |
|
|
|
/** |
|
* Returns the token types that this sniff is interested in. |
|
* see vendor/squizlabs/php_codesniffer/src/Util/Tokens.php |
|
* @return array(int) |
|
*/ |
|
public function register() |
|
{ |
|
return [ |
|
T_STRING, |
|
]; |
|
|
|
} |
|
|
|
/** |
|
* Processes this sniff, when one of its tokens is encountered. |
|
* |
|
* @param \PHP_CodeSniffer\Files\File $phpcsFile The current file being checked. |
|
* @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(); |
|
if ($tokens[$stackPtr]['content'] == self::METHOD_NAME |
|
&& !$this->isObjectMethodCall($tokens, $stackPtr) |
|
&& !$this->outputIsReturned($tokens, $stackPtr) |
|
) { |
|
$error = 'Using "'.self::METHOD_NAME.'" is prohibited'; |
|
$data = array(trim($tokens[$stackPtr]['content'])); |
|
$phpcsFile->addError($error, $stackPtr, 'Found', $data); |
|
} |
|
|
|
} |
|
|
|
/** |
|
* return true if $this->print_r(blaha) |
|
* or $object->print_r(foooo) |
|
*/ |
|
protected function isObjectMethodCall($tokens, $ptr) |
|
{ |
|
return isset($tokens[($ptr - 1)]) && $tokens[($ptr - 1)]['code'] == T_OBJECT_OPERATOR; |
|
} |
|
|
|
/** |
|
* return true, if the second argument is true |
|
*/ |
|
protected function outputIsReturned($tokens, $ptr) |
|
{ |
|
$arguments = $this->getArgruments($tokens, $ptr); |
|
return isset($arguments[1], $arguments[1][0]) |
|
&& $arguments[1][0]['code'] == T_TRUE; |
|
} |
|
|
|
protected function getArgruments($tokens, $ptr) |
|
{ |
|
$depth = 0; |
|
$arguments = []; |
|
$argumentIndex = 0; |
|
|
|
for($x = $ptr; $x < count($tokens); $x++){ |
|
if($depth === 0){ |
|
if($tokens[$x]['code'] == T_OPEN_PARENTHESIS){ |
|
$depth++; |
|
$arguments[$argumentIndex] = []; |
|
} |
|
}elseif($depth == 1){ |
|
switch($tokens[$x]['code']){ |
|
case T_COMMA: |
|
$argumentIndex++; |
|
break; |
|
case T_WHITESPACE: |
|
break; |
|
case T_CLOSE_PARENTHESIS: |
|
$depth--; |
|
break 2; |
|
case T_OPEN_PARENTHESIS: |
|
$depth++; |
|
default: |
|
$arguments[$argumentIndex][] = $tokens[$x]; |
|
} |
|
}else{ |
|
switch($tokens[$x]['code']){ |
|
case T_WHITESPACE: |
|
break; |
|
case T_OPEN_PARENTHESIS: |
|
$depth++; |
|
case T_CLOSE_PARENTHESIS: |
|
$depth--; |
|
default: |
|
$arguments[$argumentIndex][] = $tokens[$x]; |
|
} |
|
} |
|
} |
|
|
|
return $arguments; |
|
} |
|
} |
|
|
|
?> |