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 @@
+