Skip to content

Commit b06f50c

Browse files
committed
Merge branch 'hotfix/class-declaration-sniff' of https://github.com/webimpress/PHP_CodeSniffer into webimpress-hotfix/class-declaration-sniff
2 parents a0d57b8 + 454171b commit b06f50c

File tree

4 files changed

+187
-12
lines changed

4 files changed

+187
-12
lines changed

src/Standards/PSR2/Sniffs/Classes/ClassDeclarationSniff.php

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -168,15 +168,32 @@ public function processOpen(File $phpcsFile, $stackPtr)
168168
$fix = $phpcsFile->addFixableError($error, $keyword, ucfirst($keywordType).'Line', $data);
169169
if ($fix === true) {
170170
$phpcsFile->fixer->beginChangeset();
171-
for ($i = ($stackPtr + 1); $i < $keyword; $i++) {
172-
if ($tokens[$i]['line'] !== $tokens[($i + 1)]['line']) {
173-
$phpcsFile->fixer->substrToken($i, 0, (strlen($phpcsFile->eolChar) * -1));
171+
$comments = [];
172+
173+
for ($i = ($stackPtr + 1); $i < $keyword; ++$i) {
174+
if ($tokens[$i]['code'] === T_COMMENT) {
175+
$comments[] = trim($tokens[$i]['content']);
176+
}
177+
178+
if ($tokens[$i]['code'] === T_WHITESPACE
179+
|| $tokens[$i]['code'] === T_COMMENT
180+
) {
181+
$phpcsFile->fixer->replaceToken($i, ' ');
174182
}
175183
}
176184

177-
$phpcsFile->fixer->addContentBefore($keyword, ' ');
185+
$phpcsFile->fixer->addContent($stackPtr, ' ');
186+
if (empty($comments) === false) {
187+
$i = $keyword;
188+
while ($tokens[($i + 1)]['line'] === $tokens[$keyword]['line']) {
189+
++$i;
190+
}
191+
192+
$phpcsFile->fixer->addContentBefore($i, ' '.implode(' ', $comments));
193+
}
194+
178195
$phpcsFile->fixer->endChangeset();
179-
}
196+
}//end if
180197
} else {
181198
// Check the whitespace before. Whitespace after is checked
182199
// later by looking at the whitespace before the first class name
@@ -231,10 +248,11 @@ public function processOpen(File $phpcsFile, $stackPtr)
231248
$classCount = count($classNames);
232249
$checkingImplements = false;
233250
$implementsToken = null;
234-
foreach ($classNames as $i => $className) {
251+
foreach ($classNames as $n => $className) {
235252
if ($tokens[$className]['code'] === $keywordTokenType) {
236253
$checkingImplements = true;
237254
$implementsToken = $className;
255+
238256
continue;
239257
}
240258

@@ -344,27 +362,40 @@ public function processOpen(File $phpcsFile, $stackPtr)
344362
$prev = ($className - 1);
345363
}
346364

347-
$spaceBefore = $tokens[$prev]['length'];
348-
if ($spaceBefore !== 1) {
365+
$last = $phpcsFile->findPrevious(T_WHITESPACE, $prev, null, true);
366+
$content = $phpcsFile->getTokensAsString(($last + 1), ($prev - $last));
367+
if ($content !== ' ') {
368+
$found = strlen($content);
369+
349370
$error = 'Expected 1 space before "%s"; %s found';
350371
$data = [
351372
$tokens[$className]['content'],
352-
$spaceBefore,
373+
$found,
353374
];
354375

355376
$fix = $phpcsFile->addFixableError($error, $className, 'SpaceBeforeName', $data);
356377
if ($fix === true) {
357-
$phpcsFile->fixer->replaceToken($prev, ' ');
378+
if ($tokens[$prev]['code'] === T_WHITESPACE) {
379+
$phpcsFile->fixer->beginChangeset();
380+
$phpcsFile->fixer->replaceToken($prev, ' ');
381+
while ($tokens[--$prev]['code'] === T_WHITESPACE) {
382+
$phpcsFile->fixer->replaceToken($prev, ' ');
383+
}
384+
385+
$phpcsFile->fixer->endChangeset();
386+
} else {
387+
$phpcsFile->fixer->addContent($prev, ' ');
388+
}
358389
}
359-
}
390+
}//end if
360391
}//end if
361392
}//end if
362393

363394
if ($checkingImplements === true
364395
&& $tokens[($className + 1)]['code'] !== T_NS_SEPARATOR
365396
&& $tokens[($className + 1)]['code'] !== T_COMMA
366397
) {
367-
if ($i !== ($classCount - 1)) {
398+
if ($n !== ($classCount - 1)) {
368399
// This is not the last class name, and the comma
369400
// is not where we expect it to be.
370401
if ($tokens[($className + 2)]['code'] !== $keywordTokenType) {

src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,71 @@ class C2
163163
{
164164

165165
} // phpcs:ignore Standard.Category.Sniff
166+
167+
interface I1 extends
168+
Foo
169+
{
170+
}
171+
172+
interface I2 extends
173+
Bar
174+
{
175+
}
176+
177+
interface I3 extends
178+
Foo,
179+
Bar
180+
{
181+
}
182+
183+
class C1 extends
184+
Foo
185+
{
186+
}
187+
188+
class C2 extends
189+
Bar
190+
{
191+
}
192+
193+
class C3 extends Foo implements
194+
Bar
195+
{
196+
}
197+
198+
class C4 extends Foo implements
199+
Bar
200+
{
201+
}
202+
203+
class C5 extends Foo implements
204+
Bar,
205+
Baz
206+
{
207+
}
208+
209+
class C6 extends \Foo\Bar implements
210+
\Baz\Bar
211+
{
212+
}
213+
214+
interface I4 extends
215+
\Baz
216+
\Bar
217+
{
218+
}
219+
220+
interface I5 extends /* comment */
221+
\Foo\Bar
222+
{
223+
}
224+
225+
interface I6 extends // comment
226+
\Foo\Bar
227+
{
228+
}
229+
230+
class C7 extends // comment
231+
\Foo\Bar implements \Baz\Bar
232+
{
233+
}

src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.inc.fixed

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,67 @@ class C2
161161
{
162162

163163
} // phpcs:ignore Standard.Category.Sniff
164+
165+
interface I1 extends
166+
Foo
167+
{
168+
}
169+
170+
interface I2 extends
171+
Bar
172+
{
173+
}
174+
175+
interface I3 extends
176+
Foo,
177+
Bar
178+
{
179+
}
180+
181+
class C1 extends Foo
182+
{
183+
}
184+
185+
class C2 extends Bar
186+
{
187+
}
188+
189+
class C3 extends Foo implements
190+
Bar
191+
{
192+
}
193+
194+
class C4 extends Foo implements
195+
Bar
196+
{
197+
}
198+
199+
class C5 extends Foo implements
200+
Bar,
201+
Baz
202+
{
203+
}
204+
205+
class C6 extends \Foo\Bar implements
206+
\Baz\Bar
207+
{
208+
}
209+
210+
interface I4 extends
211+
\Baz\Bar
212+
{
213+
}
214+
215+
interface I5 extends /* comment */
216+
\Foo\Bar
217+
{
218+
}
219+
220+
interface I6 extends // comment
221+
\Foo\Bar
222+
{
223+
}
224+
225+
class C7 extends \Foo\Bar implements \Baz\Bar // comment
226+
{
227+
}

src/Standards/PSR2/Tests/Classes/ClassDeclarationUnitTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ public function getErrorList()
5050
130 => 2,
5151
131 => 1,
5252
158 => 1,
53+
168 => 1,
54+
178 => 1,
55+
179 => 1,
56+
184 => 1,
57+
189 => 1,
58+
194 => 1,
59+
204 => 1,
60+
205 => 1,
61+
210 => 1,
62+
215 => 2,
63+
216 => 1,
64+
231 => 2,
5365
];
5466

5567
}//end getErrorList()

0 commit comments

Comments
 (0)