squizlabs / PHP_CodeSniffer

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

Unnecessary line wrapping with `-s` #3924

Closed anomiex closed 7 months ago

anomiex commented 8 months ago

Describe the bug

When using -s along with a large --report-width, some lines are still wrapped despite being much shorter than the selected width.

Code sample

<?php

$x=1;

Custom ruleset

N/A

To reproduce

Steps to reproduce the behavior:

  1. Create a file called test.php with the code sample above.
  2. Run phpcs -s --report-width=100000 --standard=PSR12 test.php
  3. See output displayed
    FILE: /tmp/test/test.php
    ---------------------------------------------------------------------------------------------------------------
    FOUND 2 ERRORS AFFECTING 1 LINE
    ---------------------------------------------------------------------------------------------------------------
    3 | ERROR | [x] Expected at least 1 space before "="; 0 found
    |       |     (PSR12.Operators.OperatorSpacing.NoSpaceBefore)
    3 | ERROR | [x] Expected at least 1 space after "="; 0 found
    |       |     (PSR12.Operators.OperatorSpacing.NoSpaceAfter)
    ---------------------------------------------------------------------------------------------------------------
    PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
    ---------------------------------------------------------------------------------------------------------------

Expected behavior

FILE: /tmp/test/test.php
---------------------------------------------------------------------------------------------------------------
FOUND 2 ERRORS AFFECTING 1 LINE
---------------------------------------------------------------------------------------------------------------
 3 | ERROR | [x] Expected at least 1 space before "="; 0 found (PSR12.Operators.OperatorSpacing.NoSpaceBefore)
 3 | ERROR | [x] Expected at least 1 space after "="; 0 found (PSR12.Operators.OperatorSpacing.NoSpaceAfter)
---------------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY
---------------------------------------------------------------------------------------------------------------

Versions (please complete the following information)

Operating System Debian sid
PHP version 8.2.12
PHP_CodeSniffer version 3.7.2, master
Standard PSR12
Install type Composer local

Additional context

The problem seems to be that the four non-displaying characters (\033[0m) added at https://github.com/squizlabs/PHP_CodeSniffer/blob/7763e2e1f773cb0615ed8afa133189fc804f583d/src/Reports/Full.php#L139 are not accounted for when calculating $maxErrorLength at https://github.com/squizlabs/PHP_CodeSniffer/blob/7763e2e1f773cb0615ed8afa133189fc804f583d/src/Reports/Full.php#L69 Or, alternatively, that those four characters aren't being ignored by PHP's wordwrap().

The simple fix would be to add 4 more at line 69, with the downsides that the lines of dashes would be longer than necessary and a --report-width that's just barely long enough (e.g. 111 for this example) would still unnecessarily wrap.

A more complex fix might be to wordwrap() only the message, and then manually calculate the length of the last line to decide whether to append the source directly or to append it as a new line.

Please confirm: