Tokenizer not applying tab replacement to heredoc/nowdoc closers #3639
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Since PHP 7.3, heredoc/nowdoc closers may be indented.
This indent can use either tabs or spaces and the indent is included in the
T_END_HEREDOC
/T_END_NOWDOC
token contents as received from the PHP native tokenizer.However, the PHPCS
Tokenizer
did not execute tab replacement on these token leading to unexpected'content'
and incorrect'length'
values in theFile::$tokens
array, which in turn could lead to incorrect sniff results and incorrect fixes.This commit adds the
T_END_HEREDOC
/T_END_NOWDOC
tokens to the array of tokens for which to do tab replacement to make them more consistent with the rest of PHPCS.I also considered splitting the token into a
T_WHITESPACE
token and theT_END_HEREDOC
/T_END_NOWDOC
token, but that could potentially break sniffs which expect theT_END_HEREDOC
/T_END_NOWDOC
token directly after the lastT_HEREDOC
/T_NOWDOC
token. The current fix does not contain that risk.Includes unit tests safeguarding this change.
The tests will only run on PHP 7.3+ as flexible heredoc/nowdocs don't tokenize correctly in PHP < 7.3.