3
* This file is part of the CodeAnalysis addon for PHP_CodeSniffer.
8
* @package PHP_CodeSniffer
9
* @author Greg Sherwood <gsherwood@squiz.net>
10
* @author Manuel Pichler <mapi@manuel-pichler.de>
11
* @copyright 2007-2014 Manuel Pichler. All rights reserved.
12
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
13
* @link http://pear.php.net/package/PHP_CodeSniffer
17
* Detects for-loops that can be simplified to a while-loop.
19
* This rule is based on the PMD rule catalog. Detects for-loops that can be
20
* simplified as a while-loop.
25
* public function bar($x)
27
* for (;true;) true; // No Init or Update part, may as well be: while (true)
33
* @package PHP_CodeSniffer
34
* @author Manuel Pichler <mapi@manuel-pichler.de>
35
* @copyright 2007-2014 Manuel Pichler. All rights reserved.
36
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
37
* @version Release: 1.5.5
38
* @link http://pear.php.net/package/PHP_CodeSniffer
40
class Generic_Sniffs_CodeAnalysis_ForLoopShouldBeWhileLoopSniff implements PHP_CodeSniffer_Sniff
45
* Registers the tokens that this sniff wants to listen for.
49
public function register()
57
* Processes this test, when one of its tokens is encountered.
59
* @param PHP_CodeSniffer_File $phpcsFile The file being scanned.
60
* @param int $stackPtr The position of the current token
61
* in the stack passed in $tokens.
65
public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
67
$tokens = $phpcsFile->getTokens();
68
$token = $tokens[$stackPtr];
70
// Skip invalid statement.
71
if (isset($token['parenthesis_opener']) === false) {
75
$next = ++$token['parenthesis_opener'];
76
$end = --$token['parenthesis_closer'];
85
for (; $next <= $end; ++$next) {
86
$code = $tokens[$next]['code'];
87
if ($code === T_SEMICOLON) {
89
} else if (in_array($code, PHP_CodeSniffer_Tokens::$emptyTokens) === false) {
94
if ($parts[0] === 0 && $parts[2] === 0 && $parts[1] > 0) {
95
$error = 'This FOR loop can be simplified to a WHILE loop';
96
$phpcsFile->addWarning($error, $stackPtr, 'CanSimplify');