Source for file JS.php
Documentation is available at JS.php
* @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\Tokenizers;
use PHP_CodeSniffer\Util;
use PHP_CodeSniffer\Exceptions\TokenizerException;
use PHP_CodeSniffer\Config;
class JS extends Tokenizer
* A list of tokens that are allowed to open a scope.
* This array also contains information about what kind of token the scope
* opener uses to open and close the scope, if the token strictly requires
* an opener, if the token can share a scope closer, and who it can be shared
* with. An example of a token that shares a scope closer is a CASE scope.
public $scopeOpeners = array (
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET ),
'end' => array (T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ),
'start' => array (T_COLON => T_COLON ),
T_CONTINUE => T_CONTINUE ,
'start' => array (T_COLON => T_COLON ),
T_CONTINUE => T_CONTINUE ,
* A list of tokens that end the scope.
* This array is just a unique collection of the end tokens
* from the _scopeOpeners array. The data is duplicated here to
* save time during parsing of the file.
public $endScopeTokens = array (
T_CLOSE_CURLY_BRACKET => T_CLOSE_CURLY_BRACKET ,
* A list of special JS tokens and their types.
protected $tokenValues = array (
'function' => 'T_FUNCTION',
'prototype' => 'T_PROTOTYPE',
'continue' => 'T_CONTINUE',
'default' => 'T_DEFAULT',
'(' => 'T_OPEN_PARENTHESIS',
')' => 'T_CLOSE_PARENTHESIS',
'{' => 'T_OPEN_CURLY_BRACKET',
'}' => 'T_CLOSE_CURLY_BRACKET',
'[' => 'T_OPEN_SQUARE_BRACKET',
']' => 'T_CLOSE_SQUARE_BRACKET',
'.' => 'T_OBJECT_OPERATOR',
'<=' => 'T_IS_SMALLER_OR_EQUAL',
'>=' => 'T_IS_GREATER_OR_EQUAL',
'=>' => 'T_DOUBLE_ARROW',
'!=' => 'T_IS_NOT_EQUAL',
'!==' => 'T_IS_NOT_IDENTICAL',
'===' => 'T_IS_IDENTICAL',
'/**' => 'T_DOC_COMMENT',
* A list string delimiters.
protected $stringTokens = array (
* A list tokens that start and end comments.
protected $commentTokens = array (
* Initialise the tokenizer.
* Pre-checks the content to see if it looks minified.
* @param string $content The content to tokenize,
* @param \PHP_CodeSniffer\Config $config The config data for the run.
* @param string $eolChar The EOL char used in the content.
* @throws TokenizerException If the file appears to be minified.
public function __construct ($content, Config $config, $eolChar= '\n')
if ($this->isMinifiedContent ($content, $eolChar) === true ) {
throw new TokenizerException ('File appears to be minified and cannot be processed');
return parent ::__construct ($content, $config, $eolChar);
* Creates an array of tokens when given some JS code.
* @param string $string The string to tokenize.
public function tokenize ($string)
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t*** START JS TOKENIZING ***".PHP_EOL;
foreach ($this->tokenValues as $token => $values) {
if (strlen($token) > $maxTokenLength) {
$maxTokenLength = strlen($token);
$commentTokenizer = new Comment ();
// Convert newlines to single characters for ease of
// processing. We will change them back later.
$numChars = count($chars);
for ($i = 0; $i < $numChars; $i++ ) {
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($char);
$bufferContent = Util\Common ::prepareForOutput ($buffer);
echo " \tProcess char $i => $content (buffer: $bufferContent)".PHP_EOL;
if ($inString === '' && $inComment === '' && $buffer !== '') {
// If the buffer only has whitespace and we are about to
// add a character, store the whitespace first.
if (trim($char) !== '' && trim($buffer) === '') {
'type' => 'T_WHITESPACE',
'content' => str_replace("\n", $this->eolChar, $buffer),
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($buffer);
echo " \t=> Added token T_WHITESPACE ($content)".PHP_EOL;
// If the buffer is not whitespace and we are about to
// add a whitespace character, store the content first.
'content' => str_replace("\n", $this->eolChar, $buffer),
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($buffer);
echo " \t=> Added token T_STRING ($content)".PHP_EOL;
if ($inComment === '' && isset ($this->stringTokens[$char]) === true ) {
if ($inString === $char) {
// This could be the end of the string, but make sure it
for ($x = ($i - 1 ); $x >= 0; $x-- ) {
if ($chars[$x] !== '\\') {
if ($escapes === 0 || ($escapes % 2 ) === 0 ) {
// There is an even number escape chars,
// so this is not escaped, it is the end of the string.
'code' => T_CONSTANT_ENCAPSED_STRING ,
'type' => 'T_CONSTANT_ENCAPSED_STRING',
'content' => str_replace("\n", $this->eolChar, $buffer). $char,
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* found end of string *".PHP_EOL;
$content = Util\Common ::prepareForOutput ($buffer. $char);
echo " \t=> Added token T_CONSTANT_ENCAPSED_STRING ($content)".PHP_EOL;
} else if ($inString === '') {
$preStringBuffer = $buffer;
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* looking for string closer *".PHP_EOL;
if ($inString !== '' && $char === "\n") {
// Unless this newline character is escaped, the string did not
// end before the end of the line, which means it probably
// wasn't a string at all (maybe a regex).
if ($chars[($i - 1 )] !== '\\') {
$buffer = $preStringBuffer;
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* found newline before end of string, bailing *".PHP_EOL;
// We don't look for special tokens inside strings,
// so if we are in a string, we can continue here now
// that the current char is in the buffer.
// Special case for T_DIVIDE which can actually be
// the start of a regular expression.
if ($buffer === $char && $char === '/' && $chars[($i + 1 )] !== '*') {
$regex = $this->getRegexToken (
'type' => 'T_REGULAR_EXPRESSION',
'content' => $regex['content'],
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($regex['content']);
echo " \t=> Added token T_REGULAR_EXPRESSION ($content)".PHP_EOL;
// Check for known tokens, but ignore tokens found that are not at
// the end of a string, like FOR and this.FORmat.
if (isset ($this->tokenValues[strtolower($buffer)]) === true
|| isset ($chars[($i + 1 )]) === false
|| preg_match('|[a-zA-z0-9_]|', $chars[($i + 1 )]) === 0 )
$lookAheadLength = ($maxTokenLength - strlen($buffer));
if ($lookAheadLength > 0 ) {
// The buffer contains a token type, but we need
// to look ahead at the next chars to see if this is
// actually part of a larger token. For example,
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t\t* buffer possibly contains token, looking ahead $lookAheadLength chars *".PHP_EOL;
for ($x = 1; $x <= $lookAheadLength; $x++ ) {
if (isset ($chars[($i + $x)]) === false ) {
$charBuffer .= $chars[($i + $x)];
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($charBuffer);
echo " \t\t=> Looking ahead $x chars => $content".PHP_EOL;
if (isset ($this->tokenValues[strtolower($charBuffer)]) === true ) {
// We've found something larger that matches
// so we can ignore this char. Except for 1 very specific
// case where a comment like /**/ needs to tokenize as
// T_COMMENT and not T_DOC_COMMENT.
$oldType = $this->tokenValues[strtolower($buffer)];
$newType = $this->tokenValues[strtolower($charBuffer)];
if ($oldType === 'T_COMMENT'
&& $newType === 'T_DOC_COMMENT'
&& $chars[($i + $x + 1 )] === '/'
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* look ahead ignored T_DOC_COMMENT, continuing *".PHP_EOL;
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t\t* look ahead found more specific token ($newType), ignoring $i *".PHP_EOL;
if ($matchedToken === false ) {
if (PHP_CODESNIFFER_VERBOSITY > 1 && $lookAheadLength > 0 ) {
echo "\t\t* look ahead found nothing *".PHP_EOL;
if ($value === 'T_FUNCTION' && $buffer !== 'function') {
// The function keyword needs to be all lowercase or else
// it is just a function called "Function".
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($buffer);
echo " \t=> Added token $value ($content)".PHP_EOL;
} else if (isset ($this->tokenValues[strtolower($char)]) === true ) {
// No matter what token we end up using, we don't
// need the content in the buffer any more because we have
if ($newContent !== '') {
'content' => $newContent,
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput (substr($buffer, 0 , -1 ));
echo " \t=> Added token T_STRING ($content)".PHP_EOL;
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* char is token, looking ahead ". ($maxTokenLength - 1 ). ' chars *'.PHP_EOL;
// The char is a token type, but we need to look ahead at the
// next chars to see if this is actually part of a larger token.
// For example, = and ===.
for ($x = 1; $x <= $maxTokenLength; $x++ ) {
if (isset ($chars[($i + $x)]) === false ) {
$charBuffer .= $chars[($i + $x)];
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($charBuffer);
echo " \t\t=> Looking ahead $x chars => $content".PHP_EOL;
if (isset ($this->tokenValues[strtolower($charBuffer)]) === true ) {
// We've found something larger that matches
// so we can ignore this char.
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$type = $this->tokenValues[strtolower($charBuffer)];
echo " \t\t* look ahead found more specific token ($type), ignoring $i *".PHP_EOL;
if ($matchedToken === false ) {
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* look ahead found nothing *".PHP_EOL;
$content = Util\Common ::prepareForOutput ($char);
echo " \t=> Added token $value ($content)".PHP_EOL;
// Keep track of content inside comments.
// This is not really a comment if the content
// looks like \// (i.e., it is escaped).
if (isset ($chars[($i - 2 )]) === true && $chars[($i - 2 )] === '\\') {
$lastContent = $lastToken['content'];
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$value = $this->tokenValues[strtolower($lastContent)];
$content = Util\Common ::prepareForOutput ($lastContent);
echo " \t=> Removed token $value ($content)".PHP_EOL;
$lastNumChars = count($lastChars);
for ($x = 0; $x < $lastNumChars; $x++ ) {
$lastChar = $lastChars[$x];
$value = $this->tokenValues[strtolower($lastChar)];
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($lastChar);
echo " \t=> Added token $value ($content)".PHP_EOL;
// We have started a comment.
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* looking for end of comment *".PHP_EOL;
} else if ($inComment !== '') {
if ($this->commentTokens[$inComment] === null ) {
// Comment ends at the next newline.
if (strpos($buffer, "\n") !== false ) {
if ($this->commentTokens[$inComment] === $buffer) {
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t\t* found end of comment *".PHP_EOL;
if ($inComment === '' && $cleanBuffer === false ) {
'content' => str_replace("\n", $this->eolChar, $buffer),
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($buffer);
echo " \t=> Added token T_STRING ($content)".PHP_EOL;
if ($cleanBuffer === true ) {
if (empty ($buffer) === false ) {
// Buffer contains whitespace from the end of the file.
'type' => 'T_WHITESPACE',
'content' => str_replace("\n", $this->eolChar, $buffer),
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$content = Util\Common ::prepareForOutput ($buffer);
echo " \t=> Added token T_WHITESPACE ($content)".PHP_EOL;
Now that we have done some basic tokenizing, we need to
modify the tokens to join some together and split some apart
so they match what the PHP tokenizer does.
$numTokens = count($tokens);
for ($stackPtr = 0; $stackPtr < $numTokens; $stackPtr++ ) {
$token = $tokens[$stackPtr];
Look for comments and join the tokens together.
if ($token['code'] === T_COMMENT || $token['code'] === T_DOC_COMMENT ) {
$tokenContent = $token['content'];
if (isset ($this->commentTokens[$tokenContent]) === true ) {
$endContent = $this->commentTokens[$tokenContent];
while ($tokenContent !== $endContent) {
&& strpos($tokenContent, $this->eolChar) !== false
// A null end token means the comment ends at the end of
// the line so we look for newlines and split the token.
$tokens[$stackPtr]['content'] = substr(
(strpos($tokenContent, $this->eolChar) + strlen($this->eolChar))
(strpos($tokenContent, $this->eolChar) + strlen($this->eolChar))
// If the substr failed, skip the token as the content
if ($tokens[$stackPtr]['content'] !== false
&& $tokens[$stackPtr]['content'] !== ''
$newContent .= $tokenContent;
if (isset ($tokens[$stackPtr]) === false ) {
$tokenContent = $tokens[$stackPtr]['content'];
if ($token['code'] === T_DOC_COMMENT ) {
$commentTokens = $commentTokenizer->tokenizeString ($newContent. $tokenContent, $this->eolChar, $newStackPtr);
foreach ($commentTokens as $commentToken) {
$finalTokens[$newStackPtr] = $commentToken;
// Save the new content in the current token so
// the code below can chop it up on newlines.
$token['content'] = $newContent. $tokenContent;
If this token has newlines in its content, split each line up
and create a new token for each line. We do this so it's easier
to ascertain where errors occur on a line.
Note that $token[1] is the token's content.
if (strpos($token['content'], $this->eolChar) !== false ) {
$tokenLines = explode($this->eolChar, $token['content']);
$numLines = count($tokenLines);
for ($i = 0; $i < $numLines; $i++ ) {
$newToken['content'] = $tokenLines[$i];
if ($i === ($numLines - 1 )) {
if ($tokenLines[$i] === '') {
$newToken['content'] .= $this->eolChar;
$newToken['type'] = $token['type'];
$newToken['code'] = $token['code'];
$finalTokens[$newStackPtr] = $newToken;
$finalTokens[$newStackPtr] = $token;
// Convert numbers, including decimals.
if ($token['code'] === T_STRING
|| $token['code'] === T_OBJECT_OPERATOR
$oldStackPtr = $stackPtr;
while (preg_match('|^[0-9\.]+$|', $tokens[$stackPtr]['content']) !== 0 ) {
$newContent .= $tokens[$stackPtr]['content'];
if ($newContent !== '' && $newContent !== '.') {
$finalTokens[($newStackPtr - 1 )]['content'] = $newContent;
$finalTokens[($newStackPtr - 1 )]['code'] = constant('T_LNUMBER');
$finalTokens[($newStackPtr - 1 )]['type'] = 'T_LNUMBER';
$finalTokens[($newStackPtr - 1 )]['code'] = constant('T_DNUMBER');
$finalTokens[($newStackPtr - 1 )]['type'] = 'T_DNUMBER';
$stackPtr = $oldStackPtr;
// Convert the token after an object operator into a string, in most cases.
if ($token['code'] === T_OBJECT_OPERATOR ) {
for ($i = ($stackPtr + 1 ); $i < $numTokens; $i++ ) {
if (isset (Util\Tokens ::$emptyTokens[$tokens[$i]['code']]) === true ) {
&& $tokens[$i]['code'] !== T_LNUMBER
&& $tokens[$i]['code'] !== T_DNUMBER
$tokens[$i]['code'] = T_STRING;
$tokens[$i]['type'] = 'T_STRING';
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t*** END TOKENIZING ***".PHP_EOL;
* Tokenizes a regular expression if one is found.
* If a regular expression is not found, NULL is returned.
* @param string $char The index of the possible regex start character.
* @param string $string The complete content of the string being tokenized.
* @param string $chars An array of characters being tokenized.
* @param string $tokens The current array of tokens found in the string.
public function getRegexToken ($char, $string, $chars, $tokens)
T_IS_NOT_IDENTICAL => true ,
// Find the last non-whitespace token that was added
$numTokens = count($tokens);
for ($prev = ($numTokens - 1 ); $prev >= 0; $prev-- ) {
if (isset (Util\Tokens ::$emptyTokens[$tokens[$prev]['code']]) === false ) {
if (isset ($beforeTokens[$tokens[$prev]['code']]) === false ) {
// This is probably a regular expression, so look for the end of it.
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t* token possibly starts a regular expression *".PHP_EOL;
$numChars = count($chars);
for ($next = ($char + 1 ); $next < $numChars; $next++ ) {
if ($chars[$next] === '/') {
// Just make sure this is not escaped first.
if ($chars[($next - 1 )] !== '\\') {
// In the simple form: /.../ so we found the end.
} else if ($chars[($next - 2 )] === '\\') {
// In the form: /...\\/ so we found the end.
$possibleEolChar = substr($string, $next, strlen($this->eolChar));
if ($possibleEolChar === $this->eolChar) {
// This is the last token on the line and regular
// expressions need to be defined on a single line,
// so this is not a regular expression.
if ($chars[$next] !== '/') {
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t* could not find end of regular expression *".PHP_EOL;
while (preg_match('|[a-zA-Z]|', $chars[($next + 1 )]) !== 0 ) {
// The token directly after the end of the regex can
// be modifiers like global and case insensitive
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t* found end of regular expression at token $regexEnd *".PHP_EOL;
for ($next = ($next + 1 ); $next < $numChars; $next++ ) {
if ($chars[$next] !== ' ') {
$possibleEolChar = substr($string, $next, strlen($this->eolChar));
if ($possibleEolChar === $this->eolChar) {
// This is the last token on the line.
if (isset ($afterTokens[$chars[$next]]) === false ) {
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t* tokens after regular expression do not look correct *".PHP_EOL;
// This is a regular expression, so join all the tokens together.
for ($x = $char; $x <= $regexEnd; $x++ ) {
* Performs additional processing after main tokenizing.
* This additional processing looks for properties, closures, labels and objects.
public function processAdditional ()
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t*** START ADDITIONAL JS PROCESSING ***".PHP_EOL;
$numTokens = count($this->tokens);
for ($i = 0; $i < $numTokens; $i++ ) {
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$type = $this->tokens[$i]['type'];
$content = Util\Common ::prepareForOutput ($this->tokens[$i]['content']);
echo " \tProcess token $i: $type => $content".PHP_EOL;
// Looking for functions that are actually closures.
if ($this->tokens[$i]['code'] === T_FUNCTION && isset ($this->tokens[$i]['scope_opener']) === true ) {
for ($x = ($i + 1 ); $x < $numTokens; $x++ ) {
if (isset (Util\Tokens ::$emptyTokens[$this->tokens[$x]['code']]) === false ) {
$this->tokens[$i]['type'] = 'T_CLOSURE';
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$line = $this->tokens[$i]['line'];
echo " \t* token $i on line $line changed from T_FUNCTION to T_CLOSURE *".PHP_EOL;
for ($x = ($this->tokens[$i]['scope_opener'] + 1 ); $x < $this->tokens[$i]['scope_closer']; $x++ ) {
if (isset ($this->tokens[$x]['conditions'][$i]) === false ) {
$this->tokens[$x]['conditions'][$i] = T_CLOSURE;
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$type = $this->tokens[$x]['type'];
echo " \t\t* cleaned $x ($type) *".PHP_EOL;
&& isset ($this->tokens[$i]['scope_condition']) === false
&& isset ($this->tokens[$i]['bracket_closer']) === true
$condition = end($this->tokens[$i]['conditions']);
reset($this->tokens[$i]['conditions']);
if ($condition === T_CLASS ) {
// Possibly an ES6 method. To be classified as one, the previous
// non-empty tokens need to be a set of parenthesis, and then a string
for ($parenCloser = ($i - 1 ); $parenCloser > 0; $parenCloser-- ) {
if (isset (Util\Tokens ::$emptyTokens[$this->tokens[$parenCloser]['code']]) === false ) {
$parenOpener = $this->tokens[$parenCloser]['parenthesis_opener'];
for ($name = ($parenOpener - 1 ); $name > 0; $name-- ) {
if (isset (Util\Tokens ::$emptyTokens[$this->tokens[$name]['code']]) === false ) {
if ($this->tokens[$name]['code'] === T_STRING ) {
// We found a method name.
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$line = $this->tokens[$name]['line'];
echo " \t* token $name on line $line changed from T_STRING to T_FUNCTION *".PHP_EOL;
$closer = $this->tokens[$i]['bracket_closer'];
$this->tokens[$name]['code'] = T_FUNCTION;
$this->tokens[$name]['type'] = 'T_FUNCTION';
foreach (array ($name, $i, $closer) as $token) {
$this->tokens[$token]['scope_condition'] = $name;
$this->tokens[$token]['scope_opener'] = $i;
$this->tokens[$token]['scope_closer'] = $closer;
$this->tokens[$token]['parenthesis_opener'] = $parenOpener;
$this->tokens[$token]['parenthesis_closer'] = $parenCloser;
$this->tokens[$token]['parenthesis_owner'] = $name;
$this->tokens[$parenOpener]['parenthesis_owner'] = $name;
$this->tokens[$parenCloser]['parenthesis_owner'] = $name;
for ($x = ($i + 1 ); $x < $closer; $x++ ) {
$this->tokens[$x]['conditions'][$name] = T_FUNCTION;
ksort($this->tokens[$x]['conditions'], SORT_NUMERIC );
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$type = $this->tokens[$x]['type'];
echo " \t\t* added T_FUNCTION condition to $x ($type) *".PHP_EOL;
$closer = $this->tokens[$i]['bracket_closer'];
$this->tokens[$i]['type'] = 'T_OBJECT';
$this->tokens[$closer]['type'] = 'T_CLOSE_OBJECT';
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t* token $i converted from T_OPEN_CURLY_BRACKET to T_OBJECT *".PHP_EOL;
echo " \t* token $closer converted from T_CLOSE_CURLY_BRACKET to T_CLOSE_OBJECT *".PHP_EOL;
for ($x = ($i + 1 ); $x < $closer; $x++ ) {
$this->tokens[$x]['conditions'][$i] = T_OBJECT;
ksort($this->tokens[$x]['conditions'], SORT_NUMERIC );
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
$type = $this->tokens[$x]['type'];
echo " \t\t* added T_OBJECT condition to $x ($type) *".PHP_EOL;
} else if ($this->tokens[$i]['code'] === T_COLON) {
// If it is a scope opener, it belongs to a
// DEFAULT or CASE statement.
if (isset ($this->tokens[$i]['scope_condition']) === true ) {
// Make sure this is not part of an inline IF statement.
for ($x = ($i - 1 ); $x >= 0; $x-- ) {
$this->tokens[$i]['type'] = 'T_INLINE_ELSE';
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t* token $i converted from T_COLON to T_INLINE_THEN *".PHP_EOL;
} else if ($this->tokens[$x]['line'] < $this->tokens[$i]['line']) {
// The string to the left of the colon is either a property or label.
for ($label = ($i - 1 ); $label >= 0; $label-- ) {
if (isset (Util\Tokens ::$emptyTokens[$this->tokens[$label]['code']]) === false ) {
if ($this->tokens[$label]['code'] !== T_STRING
&& $this->tokens[$label]['code'] !== T_CONSTANT_ENCAPSED_STRING
if (empty ($classStack) === false ) {
$this->tokens[$label]['type'] = 'T_PROPERTY';
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t* token $label converted from T_STRING to T_PROPERTY *".PHP_EOL;
$this->tokens[$label]['code'] = T_LABEL;
$this->tokens[$label]['type'] = 'T_LABEL';
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo " \t* token $label converted from T_STRING to T_LABEL *".PHP_EOL;
if (PHP_CODESNIFFER_VERBOSITY > 1 ) {
echo "\t*** END ADDITIONAL JS PROCESSING ***".PHP_EOL;
}//end processAdditional()
Documentation generated on Mon, 11 Mar 2019 15:27:35 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|