Skip to content

Commit f36375f

Browse files
committed
RequireSingleLineMethodDeclarationSniff renamed to RequireSingleLineMethodSignatureSniff
1 parent f238a59 commit f36375f

11 files changed

+153
-153
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,13 @@ Sniff provides the following settings:
374374
* `$minLinesCountBeforeWithoutComment`: minimum number of lines before property without a doc comment
375375
* `$maxLinesCountBeforeWithoutComment`: maximum number of lines before property without a doc comment
376376

377-
#### SlevomatCodingStandard.Classes.RequireSingleLineMethodDeclaration 🔧
377+
#### SlevomatCodingStandard.Classes.RequireSingleLineMethodSignature 🔧
378378

379-
Enforces method declaration to be on a single line if it fits on it (or all the time; depends on settings).
379+
Enforces method signature to be on a single line.
380380

381381
Sniff provides the following settings:
382382

383-
* `maxLineLength`: specifies max allowed line length; if declaration would fit on it, it's enforced. Use 0 value to enforce for all methods, regardless of length.
383+
* `maxLineLength`: specifies max allowed line length. If signature would fit on it, it's enforced. Use 0 value to enforce for all methods, regardless of length.
384384

385385
#### SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming
386386

SlevomatCodingStandard/Sniffs/Classes/RequireSingleLineMethodDeclarationSniff.php

Lines changed: 0 additions & 110 deletions
This file was deleted.
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace SlevomatCodingStandard\Sniffs\Classes;
4+
5+
use PHP_CodeSniffer\Files\File;
6+
use PHP_CodeSniffer\Sniffs\Sniff;
7+
use SlevomatCodingStandard\Helpers\FunctionHelper;
8+
use SlevomatCodingStandard\Helpers\TokenHelper;
9+
use function assert;
10+
use function in_array;
11+
use function is_bool;
12+
use function is_int;
13+
use function is_string;
14+
use function preg_replace;
15+
use function preg_replace_callback;
16+
use function rtrim;
17+
use function sprintf;
18+
use function str_repeat;
19+
use function str_replace;
20+
use function strlen;
21+
use const T_FUNCTION;
22+
use const T_OPEN_CURLY_BRACKET;
23+
use const T_OPEN_TAG;
24+
use const T_SEMICOLON;
25+
26+
class RequireSingleLineMethodSignatureSniff implements Sniff
27+
{
28+
29+
public const CODE_REQUIRED_SINGLE_LINE_SIGNATURE = 'RequiredSingleLineSignature';
30+
31+
/** @var int */
32+
public $maxLineLength = 120;
33+
34+
/**
35+
* @return array<int, (int|string)>
36+
*/
37+
public function register(): array
38+
{
39+
return [T_FUNCTION];
40+
}
41+
42+
/**
43+
* @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
44+
* @param \PHP_CodeSniffer\Files\File $phpcsFile
45+
* @param int $pointer
46+
*/
47+
public function process(File $phpcsFile, $pointer): void
48+
{
49+
if (!FunctionHelper::isMethod($phpcsFile, $pointer)) {
50+
return;
51+
}
52+
53+
$tokens = $phpcsFile->getTokens();
54+
55+
$lineStartPointer = $phpcsFile->findFirstOnLine(T_OPEN_TAG, $pointer, true);
56+
assert(!is_bool($lineStartPointer));
57+
58+
$methodSignatureEndPointer = $phpcsFile->findNext([T_OPEN_CURLY_BRACKET, T_SEMICOLON], $pointer);
59+
assert(is_int($methodSignatureEndPointer));
60+
61+
$signatureEndLine = $tokens[$methodSignatureEndPointer]['line'];
62+
if (in_array($tokens[$lineStartPointer]['line'], [$signatureEndLine, $signatureEndLine - 1], true)) {
63+
return;
64+
}
65+
66+
$singleLineMethodSignatureEndPointer = $methodSignatureEndPointer;
67+
if ($tokens[$methodSignatureEndPointer]['code'] === T_OPEN_CURLY_BRACKET) {
68+
$singleLineMethodSignatureEndPointer--;
69+
}
70+
71+
$methodSignature = TokenHelper::getContent($phpcsFile, $lineStartPointer, $singleLineMethodSignatureEndPointer);
72+
$methodSignature = preg_replace(sprintf('~%s[ \t]*~', $phpcsFile->eolChar), ' ', $methodSignature);
73+
assert(is_string($methodSignature));
74+
75+
$methodSignature = str_replace(['( ', ' )'], ['(', ')'], $methodSignature);
76+
$methodSignature = rtrim($methodSignature);
77+
78+
$methodSignatureWithoutTabIndetation = preg_replace_callback('~^(\t+)~', static function (array $matches): string {
79+
return str_repeat(' ', strlen($matches[1]));
80+
}, $methodSignature);
81+
82+
if ($this->maxLineLength !== 0 && strlen($methodSignatureWithoutTabIndetation) > $this->maxLineLength) {
83+
return;
84+
}
85+
86+
$error = sprintf('Signature of method "%s" should be placed on a single line.', FunctionHelper::getName($phpcsFile, $pointer));
87+
$fix = $phpcsFile->addFixableError($error, $pointer, self::CODE_REQUIRED_SINGLE_LINE_SIGNATURE);
88+
if (!$fix) {
89+
return;
90+
}
91+
92+
$whitespaceBeforeMethod = $tokens[$lineStartPointer]['content'];
93+
94+
$phpcsFile->fixer->beginChangeset();
95+
96+
for ($i = $lineStartPointer; $i <= $methodSignatureEndPointer; $i++) {
97+
$phpcsFile->fixer->replaceToken($i, '');
98+
}
99+
100+
$replacement = $methodSignature;
101+
if ($tokens[$methodSignatureEndPointer]['code'] === T_OPEN_CURLY_BRACKET) {
102+
$replacement = sprintf("%s\n%s{", $methodSignature, $whitespaceBeforeMethod);
103+
}
104+
105+
$phpcsFile->fixer->replaceToken($lineStartPointer, $replacement);
106+
107+
$phpcsFile->fixer->endChangeset();
108+
}
109+
110+
}

build/phpcs.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<rule ref="SlevomatCodingStandard.Classes.ModernClassNameReference"/>
6464
<rule ref="SlevomatCodingStandard.Classes.ParentCallSpacing"/>
6565
<rule ref="SlevomatCodingStandard.Classes.PropertySpacing"/>
66-
<rule ref="SlevomatCodingStandard.Classes.RequireSingleLineMethodDeclaration"/>
66+
<rule ref="SlevomatCodingStandard.Classes.RequireSingleLineMethodSignature"/>
6767
<rule ref="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming">
6868
<exclude-pattern>SlevomatCodingStandard/Sniffs/Classes/AbstractPropertyAndConstantSpacing.php</exclude-pattern>
6969
<exclude-pattern>SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php</exclude-pattern>

tests/Sniffs/Classes/RequireSingleLineMethodDeclarationSniffTest.php

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace SlevomatCodingStandard\Sniffs\Classes;
4+
5+
use SlevomatCodingStandard\Sniffs\TestCase;
6+
7+
final class RequireSingleLineMethodSignatureSniffTest extends TestCase
8+
{
9+
10+
public function testNoErrors(): void
11+
{
12+
$report = self::checkFile(__DIR__ . '/data/requireSingleLineMethodSignatureNoErrors.php');
13+
self::assertNoSniffErrorInFile($report);
14+
}
15+
16+
public function testErrors(): void
17+
{
18+
$report = self::checkFile(__DIR__ . '/data/requireSingleLineMethodSignatureErrors.php');
19+
self::assertSame(4, $report->getErrorCount());
20+
21+
self::assertSniffError($report, 5, RequireSingleLineMethodSignatureSniff::CODE_REQUIRED_SINGLE_LINE_SIGNATURE);
22+
self::assertSniffError($report, 11, RequireSingleLineMethodSignatureSniff::CODE_REQUIRED_SINGLE_LINE_SIGNATURE);
23+
self::assertSniffError($report, 20, RequireSingleLineMethodSignatureSniff::CODE_REQUIRED_SINGLE_LINE_SIGNATURE);
24+
self::assertSniffError($report, 25, RequireSingleLineMethodSignatureSniff::CODE_REQUIRED_SINGLE_LINE_SIGNATURE);
25+
26+
self::assertAllFixedInFile($report);
27+
}
28+
29+
public function testForAllMethods(): void
30+
{
31+
$report = self::checkFile(__DIR__ . '/data/requireSingleLineMethodSignatureAllMethodsErrors.php', ['maxLineLength' => 0]);
32+
self::assertSame(1, $report->getErrorCount());
33+
34+
self::assertSniffError($report, 5, RequireSingleLineMethodSignatureSniff::CODE_REQUIRED_SINGLE_LINE_SIGNATURE);
35+
36+
self::assertAllFixedInFile($report);
37+
}
38+
39+
}

0 commit comments

Comments
 (0)