private static function _createTokenMap(&$tokens, $tokenizer, $eolChar)
{
if (PHP_CODESNIFFER_VERBOSITY > 1) {
echo "\t*** START TOKEN MAP ***" . PHP_EOL;
}
$squareOpeners = array();
$curlyOpeners = array();
$numTokens = count($tokens);
$openers = array();
$openOwner = null;
for ($i = 0; $i < $numTokens; $i++) {
/*
Parenthesis mapping.
*/
if (isset(PHP_CodeSniffer_Tokens::$parenthesisOpeners[$tokens[$i]['code']]) === true) {
$tokens[$i]['parenthesis_opener'] = null;
$tokens[$i]['parenthesis_closer'] = null;
$tokens[$i]['parenthesis_owner'] = $i;
$openOwner = $i;
} else {
if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS) {
$openers[] = $i;
$tokens[$i]['parenthesis_opener'] = $i;
if ($openOwner !== null) {
$tokens[$openOwner]['parenthesis_opener'] = $i;
$tokens[$i]['parenthesis_owner'] = $openOwner;
$openOwner = null;
}
} else {
if ($tokens[$i]['code'] === T_CLOSE_PARENTHESIS) {
// Did we set an owner for this set of parenthesis?
$numOpeners = count($openers);
if ($numOpeners !== 0) {
$opener = array_pop($openers);
if (isset($tokens[$opener]['parenthesis_owner']) === true) {
$owner = $tokens[$opener]['parenthesis_owner'];
$tokens[$owner]['parenthesis_closer'] = $i;
$tokens[$i]['parenthesis_owner'] = $owner;
}
$tokens[$i]['parenthesis_opener'] = $opener;
$tokens[$i]['parenthesis_closer'] = $i;
$tokens[$opener]['parenthesis_closer'] = $i;
}
}
}
}
//end if
/*
Bracket mapping.
*/
switch ($tokens[$i]['code']) {
case T_OPEN_SQUARE_BRACKET:
$squareOpeners[] = $i;
if (PHP_CODESNIFFER_VERBOSITY > 1) {
echo str_repeat("\t", count($squareOpeners));
echo str_repeat("\t", count($curlyOpeners));
echo "=> Found square bracket opener at {$i}" . PHP_EOL;
}
break;
case T_OPEN_CURLY_BRACKET:
if (isset($tokens[$i]['scope_closer']) === false) {
$curlyOpeners[] = $i;
if (PHP_CODESNIFFER_VERBOSITY > 1) {
echo str_repeat("\t", count($squareOpeners));
echo str_repeat("\t", count($curlyOpeners));
echo "=> Found curly bracket opener at {$i}" . PHP_EOL;
}
}
break;
case T_CLOSE_SQUARE_BRACKET:
if (empty($squareOpeners) === false) {
$opener = array_pop($squareOpeners);
$tokens[$i]['bracket_opener'] = $opener;
$tokens[$i]['bracket_closer'] = $i;
$tokens[$opener]['bracket_opener'] = $opener;
$tokens[$opener]['bracket_closer'] = $i;
if (PHP_CODESNIFFER_VERBOSITY > 1) {
echo str_repeat("\t", count($squareOpeners));
echo str_repeat("\t", count($curlyOpeners));
echo "\t=> Found square bracket closer at {$i} for {$opener}" . PHP_EOL;
}
}
break;
case T_CLOSE_CURLY_BRACKET:
if (empty($curlyOpeners) === false && isset($tokens[$i]['scope_opener']) === false) {
$opener = array_pop($curlyOpeners);
$tokens[$i]['bracket_opener'] = $opener;
$tokens[$i]['bracket_closer'] = $i;
$tokens[$opener]['bracket_opener'] = $opener;
$tokens[$opener]['bracket_closer'] = $i;
if (PHP_CODESNIFFER_VERBOSITY > 1) {
echo str_repeat("\t", count($squareOpeners));
echo str_repeat("\t", count($curlyOpeners));
echo "\t=> Found curly bracket closer at {$i} for {$opener}" . PHP_EOL;
}
}
break;
default:
continue;
}
//end switch
}
//end for
// Cleanup for any openers that we didn't find closers for.
// This typically means there was a syntax error breaking things.
foreach ($openers as $opener) {
unset($tokens[$opener]['parenthesis_opener']);
unset($tokens[$opener]['parenthesis_owner']);
}
if (PHP_CODESNIFFER_VERBOSITY > 1) {
echo "\t*** END TOKEN MAP ***" . PHP_EOL;
}
}