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.