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_NOWDOCtoken contents as received from the PHP native tokenizer.However, the PHPCS
Tokenizerdid not execute tab replacement on these token leading to unexpected'content'and incorrect'length'values in theFile::$tokensarray, which in turn could lead to incorrect sniff results and incorrect fixes.This commit adds the
T_END_HEREDOC/T_END_NOWDOCtokens 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_WHITESPACEtoken and theT_END_HEREDOC/T_END_NOWDOCtoken, but that could potentially break sniffs which expect theT_END_HEREDOC/T_END_NOWDOCtoken directly after the lastT_HEREDOC/T_NOWDOCtoken. 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.