PHPCSStandards/PHP_CodeSniffer

Newline Spacing Around Control Structures Not Working

Closed this issue · 0 comments

Hi, I'd like to include a rule to add newlines around control structures like so:

        $customFieldsDeleted = [];
        foreach ($deleteCustomFields as $customFieldToDelete) {
            $customFieldIdToDelete = $customFieldToDelete['id'];
            if (empty($customFieldIdToDelete)) {
                continue;
            }
            $result = $this->client->deleteCustomField($productId, $customFieldIdToDelete);
            if ($result) {
                array_push($customFieldsDeleted, $customFieldIdToDelete);
            }
        }
        return $customFieldsDeleted;

becomes this:

        $customFieldsDeleted = [];
        
        foreach ($deleteCustomFields as $customFieldToDelete) {
            $customFieldIdToDelete = $customFieldToDelete['id'];
            
            if (empty($customFieldIdToDelete)) {
                continue;
            }
            
            $result = $this->client->deleteCustomField($productId, $customFieldIdToDelete);
            
            if ($result) {
                array_push($customFieldsDeleted, $customFieldIdToDelete);
            }
        }
        
        return $customFieldsDeleted;

Essentially, adding a newline both before and after a control structure (and ensuring it's only one line total in the case of back-to-back control structures).

First, I can't seem to find a rule that works for this. When I include <rule ref="Squiz.WhiteSpace.ControlStructureSpacing"/>, it almost gets me there, because it seems to be adding newlines after the control structure, but not before:

        $customFieldsDeleted = [];
        foreach ($deleteCustomFields as $customFieldToDelete) {
            $customFieldIdToDelete = $customFieldToDelete['id'];
            if (empty($customFieldIdToDelete)) {
                continue;
            }

            $result = $this->client->deleteCustomField($productId, $customFieldIdToDelete);
            if ($result) {
                array_push($customFieldsDeleted, $customFieldIdToDelete);
            }
        }

        return $customFieldsDeleted;

Even more confusing, because we want to lint against the PSR-12 standard, when we add <rule ref="PSR12"/>, it seems to overwrite the above rule and phpcbf will not add any spacing around the control structures when I run it. When I dive into the PSR12 ruleset here, and pulled all the rules into my own phpcs.xml and started removing them one-by-one until the spacing worked to try to figure out potential conflicts, it seemed like <rule ref="Squiz.WhiteSpace.ControlStructureSpacing.SpacingAfterOpen"/> was the culprit, because when that is in the config along with <rule ref="Squiz.WhiteSpace.ControlStructureSpacing"/>, the spacing is not added, but when I remove the former rule, the latter rule finally works.

I tried excluding this from the PSR-12 config block in our file and I also tried

  <rule ref="PSR12">
    <exclude name="PSR12.WhiteSpace.ControlStructureSpacing"/>
  </rule>

But none of this seems to work.

Any guidance on how to get this spacing rule working?