Найти строковое правило в PHP_CodeSniffer
Я хочу сканировать файлы на наличие строки Firebug, но этого не достаточно. Я также хотел бы сделать различие между статическими методами QFirebug::log и QFirebug::error.
Как я могу извлечь имя метода после имени класса?
public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
{
$tokens = $phpcsFile->getTokens();
echo $tokens[$stackPtr]['content'];
if ($tokens[$stackPtr]['content'] === 'Firebug') {
$error = 'found ' . $tokens[$stackPtr]['content'];
$data = array(trim($tokens[$stackPtr]['content']));
$phpcsFile->addError($error, $stackPtr, 'Found', $data);
}
}//end process()
1 ответ
Если вы запустите phpcs с -vv
В аргументе командной строки вы можете увидеть список токенов, на которые разбит PHP-файл. Для строки, как Firebug::error();
ты получаешь:
Process token 1 on line 2 [lvl:0;]: T_STRING => Firebug
Process token 2 on line 2 [lvl:0;]: T_DOUBLE_COLON => ::
Process token 3 on line 2 [lvl:0;]: T_STRING => error
Process token 4 on line 2 [lvl:0;]: T_OPEN_PARENTHESIS => (
Process token 5 on line 2 [lvl:0;]: T_CLOSE_PARENTHESIS => )
Process token 6 on line 2 [lvl:0;]: T_SEMICOLON => ;
Вы не показываете весь свой снифф, но я предполагаю, что вы ищете токен T_STRING. В этом случае, как только вы определили, что $stackPtr указывает на строку "Firebug", просто подтвердите, что это статический вызов, а затем захватите следующий строковый токен:
if ($tokens[$stackPtr]['content'] === 'Firebug'
&& $tokens[($stackPtr + 1)]['code'] === T_DOUBLE_COLON
) {
// This is a static call to a Firebug class method.
$methodName = $tokens[($stackPtr + 2)]['content'];
/* your error code here */
}
Или, если вы думаете, что люди собираются ставить пробелы между двойными двоеточиями, как Firebug :: error()
тогда вы можете сделать что-то вроде этого:
if ($tokens[$stackPtr]['content'] === 'Firebug') {
// Find the next non-whitespace token.
$colon = $phpcsFile->findNext(PHP_CodeSniffer_Tokens::$emptyTokens, ($stackPtr + 1), null, true);
if ($tokens[$colon]['code'] === T_DOUBLE_COLON) {
// This is a static call to a Firebug class method.
$methodName = $phpcsFile->findNext(T_STRING, ($colon + 1));
/* your error code here */
}
}
Если вы хотите пойти еще дальше, вы можете найти токены T_OPEN_PARENTHESIS и T_CLOSE_PARENTHESIS, чтобы подтвердить, что это вызов функции, но это зависит от класса, который вы используете.
Надеюсь, это поможет.