PHPCSStandards / PHP_CodeSniffer

PHP_CodeSniffer tokenizes PHP files and detects violations of a defined set of coding standards.
BSD 3-Clause "New" or "Revised" License
806 stars 47 forks source link

4.0 | Change T_GOTO_LABEL to not include colon #185

Open jrfnl opened 6 months ago

jrfnl commented 6 months ago

Repost from https://github.com/squizlabs/PHP_CodeSniffer/issues/3161 by @gsherwood:

The colon after a goto label does not have to be the very next token; there can be whitespace and comments between them. PHP_CodeSniffer will not tokenize the label correctly unless the colon immediately follows the label.

To fix this, T_GOTO_LABEL should be changed to include the label only, and exclude the colon.

So a: becomes:

T_GOTO_LABEL => a
T_COLON => :

Instead of:

T_GOTO_LABEL => a:

And a /*comment here*/ : becomes:

T_GOTO_LABEL => a
T_WHITESPACE => ·
T_COMMENT => /*comment·here*/
T_WHITESPACE => ·
T_COLON => :

Instead of:

T_STRING => a
T_WHITESPACE => ·
T_COMMENT => /*comment·here*/
T_WHITESPACE => ·
T_COLON => :
jrfnl commented 1 month ago

When addressing this change, I believe there is a related bug, which should also be looked into and fixed: the use of context sensitive keywords as goto labels.

As things are, the context sensitive keywords layer in the tokenizer does not retokenize context sensitive keywords to T_STRING when these are used as a goto label.

While this will always be a parse error, I still believe the keywords should be retokenized to T_STRING for consistency. In the same way as context sensitive keywords used as the name of a class or (global) function are retokenized to T_STRING, even though those usages would also result in a parse error.

jrfnl commented 1 month ago

Reminder for the tests: