1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
<?php
/**
* Generic_Sniffs_Debug_ClosureLinterSniff.
*
* PHP version 5
*
* @category PHP
* @package PHP_CodeSniffer
* @author Greg Sherwood <gsherwood@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
*/
/**
* Generic_Sniffs_Debug_ClosureLinterSniff.
*
* Runs gjslint on the file.
*
* @category PHP
* @package PHP_CodeSniffer
* @author Greg Sherwood <gsherwood@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
* @version Release: 1.3.4
* @link http://pear.php.net/package/PHP_CodeSniffer
*/
class Generic_Sniffs_Debug_ClosureLinterSniff implements PHP_CodeSniffer_Sniff
{
/**
* A list of error codes that should show errors.
*
* All other error codes will show warnings.
*
* @var int
*/
public $errorCodes = array();
/**
* A list of error codes to ignore.
*
* @var int
*/
public $ignoreCodes = array();
/**
* A list of tokenizers this sniff supports.
*
* @var array
*/
public $supportedTokenizers = array('JS');
/**
* Returns the token types that this sniff is interested in.
*
* @return array(int)
*/
public function register()
{
return array(T_OPEN_TAG);
}//end register()
/**
* Processes the tokens that this sniff is interested in.
*
* @param PHP_CodeSniffer_File $phpcsFile The file where the token was found.
* @param int $stackPtr The position in the stack where
* the token was found.
*
* @return void
* @throws PHP_CodeSniffer_Exception If jslint.js could not be run
*/
public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
{
$fileName = $phpcsFile->getFilename();
$lintPath = PHP_CodeSniffer::getConfigData('gjslint_path');
if ($lintPath === null) {
return;
}
$cmd = "$lintPath --nosummary --notime --unix_mode \"$fileName\"";
$msg = exec($cmd, $output, $retval);
if (is_array($output) === false) {
return;
}
$tokens = $phpcsFile->getTokens();
foreach ($output as $finding) {
$matches = array();
$numMatches = preg_match('/^(.*):([0-9]+):\(.*?([0-9]+)\)(.*)$/', $finding, $matches);
if ($numMatches === 0) {
continue;
}
// Skip error codes we are ignoring.
$code = $matches[3];
if (in_array($code, $this->ignoreCodes) === true) {
continue;
}
$line = (int) $matches[2];
$error = trim($matches[4]);
// Find the token at the start of the line.
$lineToken = null;
foreach ($tokens as $ptr => $info) {
if ($info['line'] === $line) {
$lineToken = $ptr;
break;
}
}
if ($lineToken !== null) {
$message = 'gjslint says: (%s) %s';
$data = array(
$code,
$error,
);
if (in_array($code, $this->errorCodes) === true) {
$phpcsFile->addError($message, $lineToken, 'ExternalToolError', $data);
} else {
$phpcsFile->addWarning($message, $lineToken, 'ExternalTool', $data);
}
}
}//end foreach
}//end process()
}//end class
?>
|