You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Generic/InlineControlStructure: bail early for control structures without body (#880)
* Generic/InlineControlStructure: bail early for control structures without body
The sniff now consistently handles all supported control structures
without a body by bailing early. Extending the existing behavior for
`while` and `for` to also include `do while`, `else`, `elseif`, `if`,
and `foreach`.
Previously, the sniff would incorrectly flag these empty control
structures as inline control structures that needed curly braces. For
`else`, `elseif`, `if`, and `foreach`, the fixer would remove the
semicolon and add the curly braces. For `do while`, the fixer would add
the curly braces and keep the semicolon in between the braces. In all
the cases, the resulting code was syntactically correct.
Consider the following example:
```
do ; while ($foo < 5);
```
Previously, PHPCS would flag this as an inline control structure and
PHPCBF would fix it to:
```
do { ;
} while ($foo < 5);
```
Now an empty `do while` is ignored by the sniff (no warnings and no
fixes).
Here is a link showing that control structures without a body are
valid in PHP:
https://3v4l.org/slnYL
And here is a link showing that the way that they were being fixed by
PHPCBF was resulting in valid code (`while` and `for` are not included
below as they were already ignored before this commit):
https://3v4l.org/8k1N3
* Generic/InlineControlStructure: removed unnecessary code block
29d0be3 changed the sniff to bail early for all control structures
without body, so the code will never reach the fixer if `$closer + 1` is
`T_SEMICOLON` and thus the removed condition is not necessary anymore.
* Generic/InlineControlStructure: removed another unnecessary code block
The original version of this part of the code that is now being removed
was added in the early days by the commit that enabled this sniff to fix
errors:
squizlabs/PHP_CodeSniffer@a54c619#diff-4b3945c2100b0a92a56509de1b797bf58ad804cf36233c95c492479b665655dcR148-R154
The only two tests that were added with the commit mentioned above
that trigger the removed condition are tests using `while` loops
without body:
squizlabs/PHP_CodeSniffer@a54c619#diff-116c49a7b0b31f724fc25409e31ba119d7f023146818bcb63edbe8f4071422e2R42-R43
Control structures without a body are the only cases where `$next`
would be equal to `$end`. Thus, these are the only cases where the
removed condition would be executed. But two previous commits, changed
the sniff to bail early and not get to the fixer part when handling
control structures without a body. 13c803b changed the sniff to ignore
`while`/`for` without a body and updated the existing tests
(squizlabs/PHP_CodeSniffer@13c803b#diff-2f069f3fe33bacdfc80485b97303aec66c98c451d07e6d86e41982b81ab1a294L49-R50).
29d0be3 expanded the same approach for
`do while`/`else`/`elseif`/`if`/`foreach` control structures.
After the removal of the `$next !== $end` check, the `$next` variable
became unused allowing for further simplification of the code by
removing the place where it was being defined.
Note for reviewers: this commit is easier to evaluate when ignoring
whitespaces.
0 commit comments