Skip to content

Commit 0f7a552

Browse files
committed
Added auto-fixing for the file header sniff (ref #750)
1 parent 9748708 commit 0f7a552

File tree

6 files changed

+90
-4
lines changed

6 files changed

+90
-4
lines changed

package.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,8 +1151,10 @@ http://pear.php.net/dtd/package-2.0.xsd">
11511151
<file baseinstalldir="PHP/CodeSniffer" name="DeclareStatementUnitTest.php" role="test" />
11521152
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.1.inc" role="test" />
11531153
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.2.inc" role="test" />
1154+
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.2.inc.fixed" role="test" />
11541155
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.3.inc" role="test" />
11551156
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.4.inc" role="test" />
1157+
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.4.inc.fixed" role="test" />
11561158
<file baseinstalldir="PHP/CodeSniffer" name="FileHeaderUnitTest.php" role="test" />
11571159
<file baseinstalldir="PHP/CodeSniffer" name="ImportStatementUnitTest.inc" role="test" />
11581160
<file baseinstalldir="PHP/CodeSniffer" name="ImportStatementUnitTest.php" role="test" />

src/Standards/PSR12/Sniffs/Files/FileHeaderSniff.php

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,27 @@ public function process(File $phpcsFile, $stackPtr)
147147
$next = $phpcsFile->findNext(T_WHITESPACE, ($line['end'] + 1), null, true);
148148
if ($tokens[$next]['line'] !== ($tokens[$line['end']]['line'] + 2)) {
149149
$error = 'Header blocks must be followed by a single blank line';
150-
$phpcsFile->addError($error, $line['end'], 'SpacingAfterBlock');
151-
}
150+
$fix = $phpcsFile->addFixableError($error, $line['end'], 'SpacingAfterBlock');
151+
if ($fix === true) {
152+
if ($tokens[$next]['line'] === $tokens[$line['end']]['line']) {
153+
$phpcsFile->fixer->addNewlineBefore($next);
154+
$phpcsFile->fixer->addNewlineBefore($next);
155+
} else if ($tokens[$next]['line'] === ($tokens[$line['end']]['line'] + 1)) {
156+
$phpcsFile->fixer->addNewline($line['end']);
157+
} else {
158+
$phpcsFile->fixer->beginChangeset();
159+
for ($i = ($line['end'] + 1); $i < $next; $i++) {
160+
if ($tokens[$i]['line'] === ($tokens[$line['end']]['line'] + 2)) {
161+
break;
162+
}
163+
164+
$phpcsFile->fixer->replaceToken($i, '');
165+
}
166+
167+
$phpcsFile->fixer->endChangeset();
168+
}
169+
}//end if
170+
}//end if
152171

153172
// Make sure we haven't seen this next block before.
154173
if (isset($headerLines[($i + 1)]) === true
@@ -168,7 +187,23 @@ public function process(File $phpcsFile, $stackPtr)
168187
$next = $phpcsFile->findNext(T_WHITESPACE, ($line['end'] + 1), null, true);
169188
if ($tokens[$next]['line'] > ($tokens[$line['end']]['line'] + 1)) {
170189
$error = 'Header blocks must not contain blank lines';
171-
$phpcsFile->addError($error, $line['end'], 'SpacingInsideBlock');
190+
$fix = $phpcsFile->addFixableError($error, $line['end'], 'SpacingInsideBlock');
191+
if ($fix === true) {
192+
$phpcsFile->fixer->beginChangeset();
193+
for ($i = ($line['end'] + 1); $i < $next; $i++) {
194+
if ($tokens[$i]['line'] === $tokens[$line['end']]['line']) {
195+
continue;
196+
}
197+
198+
if ($tokens[$i]['line'] === $tokens[$next]['line']) {
199+
break;
200+
}
201+
202+
$phpcsFile->fixer->replaceToken($i, '');
203+
}
204+
205+
$phpcsFile->fixer->endChangeset();
206+
}
172207
}
173208
}//end if
174209

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
/**
4+
* This file contains an example of coding styles.
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
namespace Vendor\Package;
10+
11+
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
12+
// Comments are probably ok; PSR-12 doesn't say.
13+
use Vendor\Package\SomeNamespace\ClassD as D;
14+
use Vendor\Package\AnotherNamespace\ClassE as E;
15+
16+
// Comments are probably ok; PSR-12 doesn't say.
17+
use function Vendor\Package\{functionA, functionB, functionC};
18+
use function Another\Vendor\functionD;
19+
20+
use const Vendor\Package\{CONSTANT_A, CONSTANT_B, CONSTANT_C};
21+
use const Another\Vendor\CONSTANT_D;
22+
23+
/**
24+
* FooBar is an example class.
25+
*/
26+
class FooBar
27+
{
28+
// ... additional PHP code ...
29+
}

src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.4.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ declare(strict_types=1);
44

55
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
66
use Vendor\Package\SomeNamespace\ClassD as D;
7-
use Vendor\Package\AnotherNamespace\ClassE as E;
7+
use Vendor\Package\AnotherNamespace\ClassE as E;use const Another\Vendor\CONSTANT_D;
88

99
/**
1010
* FooBar is an example class.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace Vendor\Package;
4+
5+
declare(strict_types=1);
6+
7+
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
8+
use Vendor\Package\SomeNamespace\ClassD as D;
9+
use Vendor\Package\AnotherNamespace\ClassE as E;
10+
11+
use const Another\Vendor\CONSTANT_D;
12+
13+
/**
14+
* FooBar is an example class.
15+
*/
16+
class FooBar
17+
{
18+
// ... additional PHP code ...
19+
}

src/Standards/PSR12/Tests/Files/FileHeaderUnitTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public function getErrorList($testFile='')
4646
1 => 1,
4747
2 => 1,
4848
3 => 1,
49+
7 => 1,
4950
];
5051
default:
5152
return [];

0 commit comments

Comments
 (0)