diff --git a/README.md b/README.md index 85518d9..20f2f04 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,19 @@ class Example } ``` +Enforce multi row parameters to not be on the first row. +Example: + +```php +class Example +{ + public function test( + #[Attribute] + int $param, + ) +} +``` + ### DocCommentSniff Allows some doc blocks to work as single line: diff --git a/library.xml b/library.xml index 418951e..12fef4f 100644 --- a/library.xml +++ b/library.xml @@ -113,4 +113,5 @@ + diff --git a/src/Stefna/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php b/src/Stefna/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php index 4e584fc..165ad6c 100644 --- a/src/Stefna/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php +++ b/src/Stefna/Sniffs/Functions/MultiLineFunctionDeclarationSniff.php @@ -48,6 +48,23 @@ public function processSingleLineDeclaration(File $phpcsFile, int $stackPtr, arr return; } } + elseif ( + !$tokensCollection->sameLine( + $tokensCollection->parenthesisOpener($stackPtr), + $tokensCollection->parenthesisCloser($stackPtr), + ) + ) { + $parenthesisStart = $tokensCollection->parenthesisOpener($stackPtr); + $nextPtr = $phpcsFile->findNext(T_WHITESPACE, $parenthesisStart + 1, exclude: true); + + if ($tokensCollection->sameLine($parenthesisStart, $nextPtr)) { + $error = 'Multiline function declarations can not start on the first line'; + $fix = $phpcsFile->addFixableError($error, $nextPtr, 'MultilineNotPure'); + if ($fix) { + $phpcsFile->fixer->addNewline($parenthesisStart); + } + } + } parent::processSingleLineDeclaration($phpcsFile, $stackPtr, $tokens); } diff --git a/tests/Sniffs/Functions/MultiLineFunctionDeclarationSniffTest.php b/tests/Sniffs/Functions/MultiLineFunctionDeclarationSniffTest.php index 1b74ab2..625ad16 100644 --- a/tests/Sniffs/Functions/MultiLineFunctionDeclarationSniffTest.php +++ b/tests/Sniffs/Functions/MultiLineFunctionDeclarationSniffTest.php @@ -22,4 +22,13 @@ public function testSingleLineWhitespace(): void self::assertAllFixedInFile('OK'); } + + public function testMultilineDeclaration(): void + { + $this->checkFile('MultilineDeclaration'); + + self::assertSniffError('MultilineNotPure', line: 7); + + self::assertAllFixedInFile(); + } } diff --git a/tests/Sniffs/Functions/data/MultiLineFunctionDeclarationSniff/MultilineDeclaration.fixed.php b/tests/Sniffs/Functions/data/MultiLineFunctionDeclarationSniff/MultilineDeclaration.fixed.php new file mode 100644 index 0000000..158d153 --- /dev/null +++ b/tests/Sniffs/Functions/data/MultiLineFunctionDeclarationSniff/MultilineDeclaration.fixed.php @@ -0,0 +1,12 @@ +checkFile('AttributeMethodDeclaration'); + + self::assertAllFixedInFile(skipErrorCheck: true); + } } diff --git a/tests/Sniffs/GeneralCodeStyle/data/Formatting/AttributeMethodDeclaration.fixed.php b/tests/Sniffs/GeneralCodeStyle/data/Formatting/AttributeMethodDeclaration.fixed.php new file mode 100644 index 0000000..5a4123c --- /dev/null +++ b/tests/Sniffs/GeneralCodeStyle/data/Formatting/AttributeMethodDeclaration.fixed.php @@ -0,0 +1,12 @@ +