Fix: Preserve parameter order when inserting missing @param annotations #44
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
When using phpcbf to fix missing
@paramannotations in a docblock, the parameters were being inserted in the wrong order.For example, given this method:
The fix would produce:
Instead of the correct order:
Root Cause
In
DocBlockParamSniff::canAddMissingParams(), when multiple parameters need to be inserted before an existing parameter (or at the end of a docblock), they were processed usingaddContentBefore()in a forward loop. SinceaddContentBefore()inserts before the same position each time, the result is LIFO (last-in-first-out) order, reversing the parameters.Solution
Reverse the
$pendingInsertsarray before iterating over it withaddContentBefore(). This ensures parameters are inserted in the correct signature order.Impact
The incorrect parameter order was causing cascading issues with other sniffs:
DocBlockParamAllowDefaultValuewould detect type mismatches (e.g.,bool $safeModeseems to be missing typestring)DocBlockParamTypeMismatchwould add incorrect union types to "fix" the mismatchTesting
The existing test case for
middleParamDocumentedalready covers this scenario and passes with the fix.