Skip to content

Commit 24a7df4

Browse files
committed
Fix TabAndSpaceSniff
1 parent 393a0fa commit 24a7df4

File tree

4 files changed

+84
-20
lines changed

4 files changed

+84
-20
lines changed

PSR2R/Sniffs/WhiteSpace/TabAndSpaceSniff.php

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,35 +49,32 @@ public function process(File $phpcsFile, int $stackPtr): void {
4949
$tokens = $phpcsFile->getTokens();
5050

5151
$line = $tokens[$stackPtr]['line'];
52-
if ($stackPtr > 0 && $tokens[$stackPtr - 1]['line'] !== $line) {
52+
// Only check whitespace at the start of lines (indentation)
53+
if ($stackPtr > 0 && $tokens[$stackPtr - 1]['line'] === $line) {
5354
return;
5455
}
5556

56-
if (strpos($tokens[$stackPtr]['content'], ' ') !== false) {
57-
$error = 'Double space found';
58-
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'DoubleSpace');
57+
$content = $tokens[$stackPtr]['orig_content'] ?? $tokens[$stackPtr]['content'];
58+
59+
// Check for space followed by tab (wrong order)
60+
if (str_contains($content, ' ' . "\t")) {
61+
$error = 'Space followed by tab found in indentation; use tabs only';
62+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeTab');
5963
if ($fix) {
60-
$phpcsFile->fixer->replaceToken($stackPtr, ' ');
64+
// Replace space+tab patterns with just tabs
65+
$phpcsFile->fixer->replaceToken($stackPtr, str_replace(" \t", "\t", $content));
6166
}
6267
}
63-
if (strpos($tokens[$stackPtr]['content'], " \t") !== false) {
64-
$error = 'Space and tab found';
65-
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAndTab');
68+
69+
// Check for tab followed by space (mixed indentation)
70+
if (str_contains($content, "\t ")) {
71+
$error = 'Tab followed by space found in indentation; use tabs only';
72+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'TabAndSpace');
6673
if ($fix) {
67-
$phpcsFile->fixer->replaceToken($stackPtr, ' ');
74+
// Remove spaces after tabs at start of line
75+
$phpcsFile->fixer->replaceToken($stackPtr, preg_replace('/^(\t+) +/', '$1', $content));
6876
}
6977
}
70-
if (strpos($tokens[$stackPtr]['content'], "\t ") === false) {
71-
return;
72-
}
73-
74-
$error = 'Tab and space found';
75-
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'TabAndSpace');
76-
if (!$fix) {
77-
return;
78-
}
79-
80-
$phpcsFile->fixer->replaceToken($stackPtr, ' ');
8178
}
8279

8380
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
/**
4+
* MIT License
5+
* For full license information, please view the LICENSE file that was distributed with this source code.
6+
*/
7+
8+
namespace PSR2R\Test\PSR2R\Sniffs\WhiteSpace;
9+
10+
use PSR2R\Sniffs\WhiteSpace\TabAndSpaceSniff;
11+
use PSR2R\Test\TestCase;
12+
13+
class TabAndSpaceSniffTest extends TestCase {
14+
15+
/**
16+
* @return void
17+
*/
18+
public function testTabAndSpaceSniffer(): void {
19+
$this->assertSnifferFindsErrors(new TabAndSpaceSniff(), 4);
20+
}
21+
22+
/**
23+
* @return void
24+
*/
25+
public function testTabAndSpaceFixer(): void {
26+
$this->assertSnifferCanFixErrors(new TabAndSpaceSniff());
27+
}
28+
29+
}

tests/_data/TabAndSpace/after.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Test;
4+
5+
class TabAndSpaceTest {
6+
7+
public function testMethod() {
8+
$correct = 1; // 2 tabs (correct)
9+
$tabSpace = 2; // 2 tabs + 1 space (WRONG)
10+
$spaceTabs = 3; // 1 space + 2 tabs (WRONG)
11+
$tabSpaceSpace = 4; // 2 tabs + 2 spaces (WRONG)
12+
13+
if ($correct) {
14+
$nested = true;
15+
$nestedTabSpace = true; // WRONG
16+
}
17+
}
18+
19+
}

tests/_data/TabAndSpace/before.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
namespace App\Test;
4+
5+
class TabAndSpaceTest {
6+
7+
public function testMethod() {
8+
$correct = 1; // 2 tabs (correct)
9+
$tabSpace = 2; // 2 tabs + 1 space (WRONG)
10+
$spaceTabs = 3; // 1 space + 2 tabs (WRONG)
11+
$tabSpaceSpace = 4; // 2 tabs + 2 spaces (WRONG)
12+
13+
if ($correct) {
14+
$nested = true;
15+
$nestedTabSpace = true; // WRONG
16+
}
17+
}
18+
19+
}

0 commit comments

Comments
 (0)