Skip to content

[FR] Attributes: sniff to enforce ordering attributes within a block #394

@jrfnl

Description

@jrfnl

Setting the scene

PHP 8.0 introduced support for attributes via the #[...] syntax. At this moment, neither PHPCS itself, nor PHPCSExtra contain any sniffs to handle the formatting of attributes.

The PER Coding Standard from FIG, since PER 2.0, outlines a set of rules for attribute formatting to comply with, so using those rules as a starting point would allow for creating an initial set of sniffs to address attribute formatting.

Proposed new sniff: Universal.Attributes.OrderInBlock

Not covered in PER.

Proposed rule "Alphabetically order attributes within a block".

Notes for the implementation

This sniff could benefit from the upcoming PHPCSUtils AttributeBlock::getAttributes() method.

Also see the Univeral.OOStructures.AlphabeticExtendsImplements for a possible public $orderby property (to mirror the same as used in that sniff).

Other notes:

  • Fixer should remove ($attributeOpener + 1) to ($attributeCloser - 1) and replace the $attributeOpener with the re-ordered complete attribute created based on the info retrieved via the AttributeBlock::getAttributes() method.

Describe the solution you'd like

A new sniff as outlined above.

The sniff should be able to flag and auto-fix the following:

// OK.
#[AttributeBar, AttributeFoo]

// Error.
#[AttributeFoo, AttributeBar]

Additional context (optional)

This ticket is part of a series of tickets related to PHP attributes and is the result of a detailed analysis of the rules as outlined in PER 2.0, as well as a critical look at what's still missing rule-wise.

  • I intend to create a pull request to implement this feature.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions