Initial Commit
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
/**
|
||||
* Checks the cyclomatic complexity (McCabe) for functions.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_CodeSniffer
|
||||
* @author Greg Sherwood <gsherwood@squiz.net>
|
||||
* @author Marc McIntyre <mmcintyre@squiz.net>
|
||||
* @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
|
||||
* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
|
||||
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||
*/
|
||||
|
||||
/**
|
||||
* Checks the cyclomatic complexity (McCabe) for functions.
|
||||
*
|
||||
* The cyclomatic complexity (also called McCabe code metrics)
|
||||
* indicates the complexity within a function by counting
|
||||
* the different paths the function includes.
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_CodeSniffer
|
||||
* @author Johann-Peter Hartmann <hartmann@mayflower.de>
|
||||
* @author Greg Sherwood <gsherwood@squiz.net>
|
||||
* @copyright 2007 Mayflower GmbH
|
||||
* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
|
||||
* @version Release: 1.3.3
|
||||
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||
*/
|
||||
class Generic_Sniffs_Metrics_CyclomaticComplexitySniff implements PHP_CodeSniffer_Sniff
|
||||
{
|
||||
|
||||
/**
|
||||
* A complexity higher than this value will throw a warning.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $complexity = 10;
|
||||
|
||||
/**
|
||||
* A complexity higer than this value will throw an error.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $absoluteComplexity = 20;
|
||||
|
||||
|
||||
/**
|
||||
* Returns an array of tokens this test wants to listen for.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
return array(T_FUNCTION);
|
||||
|
||||
}//end register()
|
||||
|
||||
|
||||
/**
|
||||
* Processes this test, when one of its tokens is encountered.
|
||||
*
|
||||
* @param PHP_CodeSniffer_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(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
|
||||
{
|
||||
$this->currentFile = $phpcsFile;
|
||||
|
||||
$tokens = $phpcsFile->getTokens();
|
||||
|
||||
// Ignore abstract methods.
|
||||
if (isset($tokens[$stackPtr]['scope_opener']) === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Detect start and end of this function definition.
|
||||
$start = $tokens[$stackPtr]['scope_opener'];
|
||||
$end = $tokens[$stackPtr]['scope_closer'];
|
||||
|
||||
// Predicate nodes for PHP.
|
||||
$find = array(
|
||||
'T_CASE',
|
||||
'T_DEFAULT',
|
||||
'T_CATCH',
|
||||
'T_IF',
|
||||
'T_FOR',
|
||||
'T_FOREACH',
|
||||
'T_WHILE',
|
||||
'T_DO',
|
||||
'T_ELSEIF',
|
||||
);
|
||||
|
||||
$complexity = 1;
|
||||
|
||||
// Iterate from start to end and count predicate nodes.
|
||||
for ($i = ($start + 1); $i < $end; $i++) {
|
||||
if (in_array($tokens[$i]['type'], $find) === true) {
|
||||
$complexity++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($complexity > $this->absoluteComplexity) {
|
||||
$error = 'Function\'s cyclomatic complexity (%s) exceeds allowed maximum of %s';
|
||||
$data = array(
|
||||
$complexity,
|
||||
$this->absoluteComplexity,
|
||||
);
|
||||
$phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data);
|
||||
} else if ($complexity > $this->complexity) {
|
||||
$warning = 'Function\'s cyclomatic complexity (%s) exceeds %s; consider refactoring the function';
|
||||
$data = array(
|
||||
$complexity,
|
||||
$this->complexity,
|
||||
);
|
||||
$phpcsFile->addWarning($warning, $stackPtr, 'TooHigh', $data);
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
}//end process()
|
||||
|
||||
|
||||
}//end class
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
/**
|
||||
* Checks the nesting level for methods.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_CodeSniffer
|
||||
* @author Greg Sherwood <gsherwood@squiz.net>
|
||||
* @author Marc McIntyre <mmcintyre@squiz.net>
|
||||
* @copyright 2006-2011 Squiz Pty Ltd (ABN 77 084 670 600)
|
||||
* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
|
||||
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||
*/
|
||||
|
||||
/**
|
||||
* Checks the nesting level for methods.
|
||||
*
|
||||
* @category PHP
|
||||
* @package PHP_CodeSniffer
|
||||
* @author Johann-Peter Hartmann <hartmann@mayflower.de>
|
||||
* @author Greg Sherwood <gsherwood@squiz.net>
|
||||
* @copyright 2007 Mayflower GmbH
|
||||
* @license http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
|
||||
* @version Release: 1.3.3
|
||||
* @link http://pear.php.net/package/PHP_CodeSniffer
|
||||
*/
|
||||
class Generic_Sniffs_Metrics_NestingLevelSniff implements PHP_CodeSniffer_Sniff
|
||||
{
|
||||
|
||||
/**
|
||||
* A nesting level than this value will throw a warning.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $nestingLevel = 5;
|
||||
|
||||
/**
|
||||
* A nesting level than this value will throw an error.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
public $absoluteNestingLevel = 10;
|
||||
|
||||
|
||||
/**
|
||||
* Returns an array of tokens this test wants to listen for.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function register()
|
||||
{
|
||||
return array(T_FUNCTION);
|
||||
|
||||
}//end register()
|
||||
|
||||
|
||||
/**
|
||||
* Processes this test, when one of its tokens is encountered.
|
||||
*
|
||||
* @param PHP_CodeSniffer_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(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
|
||||
{
|
||||
$tokens = $phpcsFile->getTokens();
|
||||
|
||||
// Ignore abstract methods.
|
||||
if (isset($tokens[$stackPtr]['scope_opener']) === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Detect start and end of this function definition.
|
||||
$start = $tokens[$stackPtr]['scope_opener'];
|
||||
$end = $tokens[$stackPtr]['scope_closer'];
|
||||
|
||||
$nestingLevel = 0;
|
||||
|
||||
// Find the maximum nesting level of any token in the function.
|
||||
for ($i = ($start + 1); $i < $end; $i++) {
|
||||
$level = $tokens[$i]['level'];
|
||||
if ($nestingLevel < $level) {
|
||||
$nestingLevel = $level;
|
||||
}
|
||||
}
|
||||
|
||||
// We subtract the nesting level of the function itself.
|
||||
$nestingLevel = ($nestingLevel - $tokens[$stackPtr]['level'] - 1);
|
||||
|
||||
if ($nestingLevel > $this->absoluteNestingLevel) {
|
||||
$error = 'Function\'s nesting level (%s) exceeds allowed maximum of %s';
|
||||
$data = array(
|
||||
$nestingLevel,
|
||||
$this->absoluteNestingLevel,
|
||||
);
|
||||
$phpcsFile->addError($error, $stackPtr, 'MaxExceeded', $data);
|
||||
} else if ($nestingLevel > $this->nestingLevel) {
|
||||
$warning = 'Function\'s nesting level (%s) exceeds %s; consider refactoring the function';
|
||||
$data = array(
|
||||
$nestingLevel,
|
||||
$this->nestingLevel,
|
||||
);
|
||||
$phpcsFile->addWarning($warning, $stackPtr, 'TooHigh', $data);
|
||||
}
|
||||
|
||||
}//end process()
|
||||
|
||||
|
||||
}//end class
|
||||
|
||||
?>
|
||||
Reference in New Issue
Block a user