Skip to content

Commit aed6c39

Browse files
committed
Merge branch 'feature/2057-generic-spaceaftercast-adjustable-spacing' of https://github.com/jrfnl/PHP_CodeSniffer
2 parents 698847b + a6c9e2f commit aed6c39

File tree

5 files changed

+204
-15
lines changed

5 files changed

+204
-15
lines changed

src/Standards/Generic/Sniffs/Formatting/NoSpaceAfterCastSniff.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
* @author Greg Sherwood <[email protected]>
66
* @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
77
* @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
8+
*
9+
* @deprecated 3.4.0 Use the Generic.Formatting.SpaceAfterCast sniff with
10+
* the $spacing property set to 0 instead.
811
*/
912

1013
namespace PHP_CodeSniffer\Standards\Generic\Sniffs\Formatting;

src/Standards/Generic/Sniffs/Formatting/SpaceAfterCastSniff.php

Lines changed: 99 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,20 @@
1616
class SpaceAfterCastSniff implements Sniff
1717
{
1818

19+
/**
20+
* The number of spaces desired after a cast token.
21+
*
22+
* @var integer
23+
*/
24+
public $spacing = 1;
25+
26+
/**
27+
* Allow newlines instead of spaces.
28+
*
29+
* @var boolean
30+
*/
31+
public $ignoreNewlines = false;
32+
1933

2034
/**
2135
* Returns an array of tokens this test wants to listen for.
@@ -40,7 +54,8 @@ public function register()
4054
*/
4155
public function process(File $phpcsFile, $stackPtr)
4256
{
43-
$tokens = $phpcsFile->getTokens();
57+
$tokens = $phpcsFile->getTokens();
58+
$this->spacing = (int) $this->spacing;
4459

4560
if ($tokens[$stackPtr]['code'] === T_BINARY_CAST
4661
&& $tokens[$stackPtr]['content'] === 'b'
@@ -49,24 +64,95 @@ public function process(File $phpcsFile, $stackPtr)
4964
return;
5065
}
5166

52-
if ($tokens[($stackPtr + 1)]['code'] !== T_WHITESPACE) {
53-
$error = 'A cast statement must be followed by a single space';
54-
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpace');
55-
if ($fix === true) {
56-
$phpcsFile->fixer->addContent($stackPtr, ' ');
57-
}
67+
$nextNonEmpty = $phpcsFile->findNext(Tokens::$emptyTokens, ($stackPtr + 1), null, true);
68+
if ($nextNonEmpty === false) {
69+
return;
70+
}
71+
72+
if ($this->ignoreNewlines === true
73+
&& $tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']
74+
) {
75+
$phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 'newline');
76+
return;
77+
}
5878

79+
if ($this->spacing === 0 && $nextNonEmpty === ($stackPtr + 1)) {
5980
$phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 0);
6081
return;
6182
}
6283

63-
$phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $tokens[($stackPtr + 1)]['length']);
84+
$maybePlural = '';
85+
if ($this->spacing !== 1) {
86+
$maybePlural = 's';
87+
}
88+
89+
$nextNonWhitespace = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), null, true);
90+
if ($nextNonEmpty !== $nextNonWhitespace) {
91+
$error = 'Expected %s space%s after cast statement; comment found';
92+
$data = [
93+
$this->spacing,
94+
$maybePlural,
95+
];
96+
$phpcsFile->addError($error, $stackPtr, 'CommentFound', $data);
97+
98+
if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) {
99+
$phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $tokens[($stackPtr + 1)]['length']);
100+
} else {
101+
$phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', 0);
102+
}
103+
104+
return;
105+
}
106+
107+
$found = 0;
108+
if ($tokens[$stackPtr]['line'] !== $tokens[$nextNonEmpty]['line']) {
109+
$found = 'newline';
110+
} else if ($tokens[($stackPtr + 1)]['code'] === T_WHITESPACE) {
111+
$found = $tokens[($stackPtr + 1)]['length'];
112+
}
113+
114+
$phpcsFile->recordMetric($stackPtr, 'Spacing after cast statement', $found);
115+
116+
if ($found === $this->spacing) {
117+
return;
118+
}
119+
120+
$error = 'Expected %s space%s after cast statement; %s found';
121+
$data = [
122+
$this->spacing,
123+
$maybePlural,
124+
$found,
125+
];
126+
127+
$errorCode = 'TooMuchSpace';
128+
if ($this->spacing !== 0) {
129+
if ($found === 0) {
130+
$errorCode = 'NoSpace';
131+
} else if ($found !== 'newline' && $found < $this->spacing) {
132+
$errorCode = 'TooLittleSpace';
133+
}
134+
}
135+
136+
$fix = $phpcsFile->addFixableError($error, $stackPtr, $errorCode, $data);
137+
138+
if ($fix === true) {
139+
$padding = str_repeat(' ', $this->spacing);
140+
if ($found === 0) {
141+
$phpcsFile->fixer->addContent($stackPtr, $padding);
142+
} else {
143+
$phpcsFile->fixer->beginChangeset();
144+
$start = ($stackPtr + 1);
145+
146+
if ($this->spacing > 0) {
147+
$phpcsFile->fixer->replaceToken($start, $padding);
148+
++$start;
149+
}
150+
151+
for ($i = $start; $i < $nextNonWhitespace; $i++) {
152+
$phpcsFile->fixer->replaceToken($i, '');
153+
}
64154

65-
if ($tokens[($stackPtr + 1)]['length'] !== 1) {
66-
$error = 'A cast statement must be followed by a single space';
67-
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'TooMuchSpace');
68-
if ($fix === true) {
69-
$phpcsFile->fixer->replaceToken(($stackPtr + 1), ' ');
155+
$phpcsFile->fixer->endChangeset();
70156
}
71157
}
72158

src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.inc

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ $var = (integer) $var2;
1010

1111
$var = (string) $var2;
1212
$var = (string)$var2;
13-
$var = (string) $var2;
13+
$var = (string) $var2;
1414

1515
$var = (float) $var2;
1616
$var = (float)$var2;
@@ -42,10 +42,54 @@ $var = (object) $var2;
4242

4343
$var = (unset) $var2;
4444
$var = (unset)$var2;
45-
$var = (unset) $var2;
45+
$var = (unset) $var2;
4646

4747
$var = b"binary $foo";
4848
$var = b"binary string";
4949
$var = b'binary string';
5050
$var = (binary) $string;
5151
$var = (binary)$string;
52+
53+
$var = (boolean) /* comment */ $var2;
54+
55+
$var = (int)
56+
$var2;
57+
58+
if ( (string) // phpcs:ignore Standard.Cat.SniffName -- for reasons.
59+
$x === 'test'
60+
) {}
61+
62+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines true
63+
$var = (int)
64+
$var1 + (bool) $var2;
65+
66+
if ( (string) // phpcs:ignore Standard.Cat.SniffName -- for reasons.
67+
$x === 'test'
68+
) {}
69+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines false
70+
71+
// phpcs:set Generic.Formatting.SpaceAfterCast spacing 2
72+
$var = (int) $var2;
73+
$var = (string)$var2;
74+
$var = (array) $var2;
75+
$var = (unset) $var2;
76+
$var = (boolean) /* comment */ $var2;
77+
78+
$var = (integer)
79+
$var2;
80+
81+
// phpcs:set Generic.Formatting.SpaceAfterCast spacing 0
82+
$var = (int) $var2;
83+
$var = (string)$var2;
84+
$var = (array) $var2;
85+
$var = (unset) $var2;
86+
$var = (boolean) /* comment */ $var2;
87+
88+
$var = (integer)
89+
$var2;
90+
91+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines true
92+
$var = (int)
93+
$var1 + (bool) $var2;
94+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines false
95+
// phpcs:set Generic.Formatting.SpaceAfterCast spacing 1

src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.inc.fixed

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,44 @@ $var = b"binary string";
4949
$var = b'binary string';
5050
$var = (binary) $string;
5151
$var = (binary) $string;
52+
53+
$var = (boolean) /* comment */ $var2;
54+
55+
$var = (int) $var2;
56+
57+
if ( (string) // phpcs:ignore Standard.Cat.SniffName -- for reasons.
58+
$x === 'test'
59+
) {}
60+
61+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines true
62+
$var = (int)
63+
$var1 + (bool) $var2;
64+
65+
if ( (string) // phpcs:ignore Standard.Cat.SniffName -- for reasons.
66+
$x === 'test'
67+
) {}
68+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines false
69+
70+
// phpcs:set Generic.Formatting.SpaceAfterCast spacing 2
71+
$var = (int) $var2;
72+
$var = (string) $var2;
73+
$var = (array) $var2;
74+
$var = (unset) $var2;
75+
$var = (boolean) /* comment */ $var2;
76+
77+
$var = (integer) $var2;
78+
79+
// phpcs:set Generic.Formatting.SpaceAfterCast spacing 0
80+
$var = (int)$var2;
81+
$var = (string)$var2;
82+
$var = (array)$var2;
83+
$var = (unset)$var2;
84+
$var = (boolean) /* comment */ $var2;
85+
86+
$var = (integer)$var2;
87+
88+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines true
89+
$var = (int)
90+
$var1 + (bool)$var2;
91+
// phpcs:set Generic.Formatting.SpaceAfterCast ignoreNewlines false
92+
// phpcs:set Generic.Formatting.SpaceAfterCast spacing 1

src/Standards/Generic/Tests/Formatting/SpaceAfterCastUnitTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,21 @@ public function getErrorList()
4949
44 => 1,
5050
45 => 1,
5151
51 => 1,
52+
53 => 1,
53+
55 => 1,
54+
58 => 1,
55+
64 => 1,
56+
72 => 1,
57+
73 => 1,
58+
75 => 1,
59+
76 => 1,
60+
78 => 1,
61+
82 => 1,
62+
84 => 1,
63+
85 => 1,
64+
86 => 1,
65+
88 => 1,
66+
93 => 1,
5267
];
5368

5469
}//end getErrorList()

0 commit comments

Comments
 (0)