Mercurial > hg > isophonics-drupal-site
diff vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php @ 17:129ea1e6d783
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:21:36 +0000 |
parents | |
children | af1871eacc83 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/squizlabs/php_codesniffer/src/Sniffs/AbstractArraySniff.php Thu Feb 28 13:21:36 2019 +0000 @@ -0,0 +1,234 @@ +<?php +/** + * Processes single and mutli-line arrays. + * + * @author Greg Sherwood <gsherwood@squiz.net> + * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) + * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence + */ + +namespace PHP_CodeSniffer\Sniffs; + +use PHP_CodeSniffer\Files\File; +use PHP_CodeSniffer\Util\Tokens; + +abstract class AbstractArraySniff implements Sniff +{ + + + /** + * Returns an array of tokens this test wants to listen for. + * + * @return array + */ + final public function register() + { + return [ + T_ARRAY, + T_OPEN_SHORT_ARRAY, + ]; + + }//end register() + + + /** + * 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]['code'] === T_ARRAY) { + $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'no'); + + $arrayStart = $tokens[$stackPtr]['parenthesis_opener']; + if (isset($tokens[$arrayStart]['parenthesis_closer']) === false) { + // Incomplete array. + return; + } + + $arrayEnd = $tokens[$arrayStart]['parenthesis_closer']; + } else { + $phpcsFile->recordMetric($stackPtr, 'Short array syntax used', 'yes'); + $arrayStart = $stackPtr; + $arrayEnd = $tokens[$stackPtr]['bracket_closer']; + } + + $lastContent = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($arrayEnd - 1), null, true); + if ($tokens[$lastContent]['code'] === T_COMMA) { + // Last array item ends with a comma. + $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'yes'); + $lastArrayToken = $lastContent; + } else { + $phpcsFile->recordMetric($stackPtr, 'Array end comma', 'no'); + $lastArrayToken = $arrayEnd; + } + + if ($tokens[$stackPtr]['code'] === T_ARRAY) { + $lastToken = $tokens[$stackPtr]['parenthesis_opener']; + } else { + $lastToken = $stackPtr; + } + + $keyUsed = false; + $indices = []; + + for ($checkToken = ($stackPtr + 1); $checkToken <= $lastArrayToken; $checkToken++) { + // Skip bracketed statements, like function calls. + if ($tokens[$checkToken]['code'] === T_OPEN_PARENTHESIS + && (isset($tokens[$checkToken]['parenthesis_owner']) === false + || $tokens[$checkToken]['parenthesis_owner'] !== $stackPtr) + ) { + $checkToken = $tokens[$checkToken]['parenthesis_closer']; + continue; + } + + if ($tokens[$checkToken]['code'] === T_ARRAY + || $tokens[$checkToken]['code'] === T_OPEN_SHORT_ARRAY + || $tokens[$checkToken]['code'] === T_CLOSURE + ) { + // Let subsequent calls of this test handle nested arrays. + if ($tokens[$lastToken]['code'] !== T_DOUBLE_ARROW) { + $indices[] = ['value_start' => $checkToken]; + $lastToken = $checkToken; + } + + if ($tokens[$checkToken]['code'] === T_ARRAY) { + $checkToken = $tokens[$tokens[$checkToken]['parenthesis_opener']]['parenthesis_closer']; + } else if ($tokens[$checkToken]['code'] === T_OPEN_SHORT_ARRAY) { + $checkToken = $tokens[$checkToken]['bracket_closer']; + } else { + // T_CLOSURE. + $checkToken = $tokens[$checkToken]['scope_closer']; + } + + $checkToken = $phpcsFile->findNext(T_WHITESPACE, ($checkToken + 1), null, true); + $lastToken = $checkToken; + if ($tokens[$checkToken]['code'] !== T_COMMA) { + $checkToken--; + } + + continue; + }//end if + + if ($tokens[$checkToken]['code'] !== T_DOUBLE_ARROW + && $tokens[$checkToken]['code'] !== T_COMMA + && $checkToken !== $arrayEnd + ) { + continue; + } + + if ($tokens[$checkToken]['code'] === T_COMMA + || $checkToken === $arrayEnd + ) { + $stackPtrCount = 0; + if (isset($tokens[$stackPtr]['nested_parenthesis']) === true) { + $stackPtrCount = count($tokens[$stackPtr]['nested_parenthesis']); + } + + $commaCount = 0; + if (isset($tokens[$checkToken]['nested_parenthesis']) === true) { + $commaCount = count($tokens[$checkToken]['nested_parenthesis']); + if ($tokens[$stackPtr]['code'] === T_ARRAY) { + // Remove parenthesis that are used to define the array. + $commaCount--; + } + } + + if ($commaCount > $stackPtrCount) { + // This comma is inside more parenthesis than the ARRAY keyword, + // so it is actually a comma used to do things like + // separate arguments in a function call. + continue; + } + + if ($keyUsed === false) { + $valueContent = $phpcsFile->findNext( + Tokens::$emptyTokens, + ($lastToken + 1), + $checkToken, + true + ); + + $indices[] = ['value_start' => $valueContent]; + } + + $lastToken = $checkToken; + $keyUsed = false; + continue; + }//end if + + if ($tokens[$checkToken]['code'] === T_DOUBLE_ARROW) { + $keyUsed = true; + + // Find the start of index that uses this double arrow. + $indexEnd = $phpcsFile->findPrevious(T_WHITESPACE, ($checkToken - 1), $arrayStart, true); + $indexStart = $phpcsFile->findStartOfStatement($indexEnd); + + // Find the value of this index. + $nextContent = $phpcsFile->findNext( + Tokens::$emptyTokens, + ($checkToken + 1), + $arrayEnd, + true + ); + + $indices[] = [ + 'index_start' => $indexStart, + 'index_end' => $indexEnd, + 'arrow' => $checkToken, + 'value_start' => $nextContent, + ]; + + $lastToken = $checkToken; + }//end if + }//end for + + if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { + $this->processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); + } else { + $this->processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); + } + + }//end process() + + + /** + * Processes a single-line array definition. + * + * @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. + * @param int $arrayStart The token that starts the array definition. + * @param int $arrayEnd The token that ends the array definition. + * @param array $indices An array of token positions for the array keys, + * double arrows, and values. + * + * @return void + */ + abstract protected function processSingleLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); + + + /** + * Processes a multi-line array definition. + * + * @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. + * @param int $arrayStart The token that starts the array definition. + * @param int $arrayEnd The token that ends the array definition. + * @param array $indices An array of token positions for the array keys, + * double arrows, and values. + * + * @return void + */ + abstract protected function processMultiLineArray($phpcsFile, $stackPtr, $arrayStart, $arrayEnd, $indices); + + +}//end class