Skip to content

Commit 6cf615d

Browse files
committed
Merge branch 'fix-operator-spacing-sniff' of https://github.com/grongor/PHP_CodeSniffer
2 parents 5624bed + 78ca525 commit 6cf615d

File tree

3 files changed

+432
-43
lines changed

3 files changed

+432
-43
lines changed

src/Standards/Squiz/Sniffs/WhiteSpace/OperatorSpacingSniff.php

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99

1010
namespace PHP_CodeSniffer\Standards\Squiz\Sniffs\WhiteSpace;
1111

12-
use PHP_CodeSniffer\Sniffs\Sniff;
1312
use PHP_CodeSniffer\Files\File;
13+
use PHP_CodeSniffer\Sniffs\Sniff;
1414
use PHP_CodeSniffer\Util\Tokens;
1515

1616
class OperatorSpacingSniff implements Sniff
@@ -42,6 +42,13 @@ class OperatorSpacingSniff implements Sniff
4242
*/
4343
public $ignoreSpacingBeforeAssignments = true;
4444

45+
/**
46+
* A list of tokens that aren't considered as operands.
47+
*
48+
* @var string[]
49+
*/
50+
private $nonOperandTokens = [];
51+
4552

4653
/**
4754
* Returns an array of tokens this test wants to listen for.
@@ -57,6 +64,43 @@ public function register()
5764
$targets[] = T_INLINE_ELSE;
5865
$targets[] = T_INSTANCEOF;
5966

67+
// Trying to operate on a negative value; eg. ($var * -1).
68+
$this->nonOperandTokens = Tokens::$operators;
69+
// Trying to compare a negative value; eg. ($var === -1).
70+
$this->nonOperandTokens += Tokens::$comparisonTokens;
71+
// Trying to compare a negative value; eg. ($var || -1 === $b).
72+
$this->nonOperandTokens += Tokens::$booleanOperators;
73+
// Trying to assign a negative value; eg. ($var = -1).
74+
$this->nonOperandTokens += Tokens::$assignmentTokens;
75+
$this->nonOperandTokens += [
76+
// Returning/printing a negative value; eg. (return -1).
77+
T_RETURN => T_RETURN,
78+
T_ECHO => T_ECHO,
79+
T_PRINT => T_PRINT,
80+
T_YIELD => T_YIELD,
81+
82+
// Trying to use a negative value; eg. myFunction($var, -2).
83+
T_COMMA => T_COMMA,
84+
T_OPEN_PARENTHESIS => T_OPEN_PARENTHESIS,
85+
T_OPEN_SQUARE_BRACKET => T_OPEN_SQUARE_BRACKET,
86+
T_OPEN_SHORT_ARRAY => T_OPEN_SHORT_ARRAY,
87+
T_DOUBLE_ARROW => T_DOUBLE_ARROW,
88+
T_COLON => T_COLON,
89+
T_INLINE_THEN => T_INLINE_THEN,
90+
T_INLINE_ELSE => T_INLINE_ELSE,
91+
T_CASE => T_CASE,
92+
T_OPEN_CURLY_BRACKET => T_OPEN_CURLY_BRACKET,
93+
94+
// Casting a negative value; eg. (array) -$a.
95+
T_ARRAY_CAST => T_ARRAY_CAST,
96+
T_BOOL_CAST => T_BOOL_CAST,
97+
T_DOUBLE_CAST => T_DOUBLE_CAST,
98+
T_INT_CAST => T_INT_CAST,
99+
T_OBJECT_CAST => T_OBJECT_CAST,
100+
T_STRING_CAST => T_STRING_CAST,
101+
T_UNSET_CAST => T_UNSET_CAST,
102+
];
103+
60104
return $targets;
61105

62106
}//end register()
@@ -311,48 +355,7 @@ protected function isOperator(File $phpcsFile, $stackPtr)
311355
// Check minus spacing, but make sure we aren't just assigning
312356
// a minus value or returning one.
313357
$prev = $phpcsFile->findPrevious(Tokens::$emptyTokens, ($stackPtr - 1), null, true);
314-
if ($tokens[$prev]['code'] === T_RETURN) {
315-
// Just returning a negative value; eg. (return -1).
316-
return false;
317-
}
318-
319-
if (isset(Tokens::$operators[$tokens[$prev]['code']]) === true) {
320-
// Just trying to operate on a negative value; eg. ($var * -1).
321-
return false;
322-
}
323-
324-
if (isset(Tokens::$comparisonTokens[$tokens[$prev]['code']]) === true) {
325-
// Just trying to compare a negative value; eg. ($var === -1).
326-
return false;
327-
}
328-
329-
if (isset(Tokens::$booleanOperators[$tokens[$prev]['code']]) === true) {
330-
// Just trying to compare a negative value; eg. ($var || -1 === $b).
331-
return false;
332-
}
333-
334-
if (isset(Tokens::$assignmentTokens[$tokens[$prev]['code']]) === true) {
335-
// Just trying to assign a negative value; eg. ($var = -1).
336-
return false;
337-
}
338-
339-
// A list of tokens that indicate that the token is not
340-
// part of an arithmetic operation.
341-
$invalidTokens = [
342-
T_COMMA => true,
343-
T_OPEN_PARENTHESIS => true,
344-
T_OPEN_SQUARE_BRACKET => true,
345-
T_OPEN_SHORT_ARRAY => true,
346-
T_DOUBLE_ARROW => true,
347-
T_COLON => true,
348-
T_INLINE_THEN => true,
349-
T_INLINE_ELSE => true,
350-
T_CASE => true,
351-
T_OPEN_CURLY_BRACKET => true,
352-
];
353-
354-
if (isset($invalidTokens[$tokens[$prev]['code']]) === true) {
355-
// Just trying to use a negative value; eg. myFunction($var, -2).
358+
if (isset($this->nonOperandTokens[$tokens[$prev]['code']]) === true) {
356359
return false;
357360
}
358361
}//end if

src/Standards/Squiz/Tests/WhiteSpace/OperatorSpacingUnitTest.inc

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,5 +270,198 @@ fn&($x) => $x;
270270
// phpcs:set Squiz.WhiteSpace.OperatorSpacing ignoreSpacingBeforeAssignments false
271271
$a = 3;
272272

273+
yield -1;
274+
echo -1;
275+
$a = -1;
276+
func(-1);
277+
$a = [-1];
278+
return -1;
279+
print -1;
280+
$a &= -1;
281+
switch ($a) {
282+
case -1:
283+
}
284+
$a = $a ?? -1;
285+
$a .= -1;
286+
$a /= -1;
287+
$a = [1 => -1];
288+
$a = $a == -1;
289+
$a = $a >= -1;
290+
$a = $a === -1;
291+
$a = $a != -1;
292+
$a = $a !== -1;
293+
$a = $a <= -1;
294+
$a = $a <=> -1;
295+
$a = $a and -1;
296+
$a = $a or -1;
297+
$a = $a xor -1;
298+
$a -= -1;
299+
$a %= -1;
300+
$a *= -1;
301+
$a |= -1;
302+
$a += -1;
303+
$a = $a ** -1;
304+
$a **= -1;
305+
$a = $a << -1;
306+
$a <<= -1;
307+
$a = $a >> -1;
308+
$a >>= -1;
309+
$a = (string) -1;
310+
$a = (array) -1;
311+
$a = (bool) -1;
312+
$a = (object) -1;
313+
$a = (unset) -1;
314+
$a = (float) -1;
315+
$a = (int) -1;
316+
$a ^= -1;
317+
$a = [$a, -1];
318+
$a = $a[-1];
319+
$a = $a ? -1 : -1;
320+
321+
yield - 1;
322+
echo - 1;
323+
$a = - 1;
324+
func(- 1);
325+
$a = [- 1];
326+
return - 1;
327+
print - 1;
328+
$a &= - 1;
329+
switch ($a) {
330+
case - 1:
331+
}
332+
$a = $a ?? - 1;
333+
$a .= - 1;
334+
$a /= - 1;
335+
$a = [1 => - 1];
336+
$a = $a == - 1;
337+
$a = $a >= - 1;
338+
$a = $a === - 1;
339+
$a = $a != - 1;
340+
$a = $a !== - 1;
341+
$a = $a <= - 1;
342+
$a = $a <=> - 1;
343+
$a = $a and - 1;
344+
$a = $a or - 1;
345+
$a = $a xor - 1;
346+
$a -= - 1;
347+
$a %= - 1;
348+
$a *= - 1;
349+
$a |= - 1;
350+
$a += - 1;
351+
$a = $a ** - 1;
352+
$a **= - 1;
353+
$a = $a << - 1;
354+
$a <<= - 1;
355+
$a = $a >> - 1;
356+
$a >>= - 1;
357+
$a = (string) - 1;
358+
$a = (array) - 1;
359+
$a = (bool) - 1;
360+
$a = (object) - 1;
361+
$a = (unset) - 1;
362+
$a = (float) - 1;
363+
$a = (int) - 1;
364+
$a ^= - 1;
365+
$a = [$a, - 1];
366+
$a = $a[- 1];
367+
$a = $a ? - 1 : - 1;
368+
369+
370+
yield -$b;
371+
echo -$b;
372+
$a = -$b;
373+
func(-$b);
374+
$a = [-$b];
375+
return -$b;
376+
print -$b;
377+
$a &= -$b;
378+
switch ($a) {
379+
case -$b:
380+
}
381+
$a = $a ?? -$b;
382+
$a .= -$b;
383+
$a /= -$b;
384+
$a = [1 => -$b];
385+
$a = $a == -$b;
386+
$a = $a >= -$b;
387+
$a = $a === -$b;
388+
$a = $a != -$b;
389+
$a = $a !== -$b;
390+
$a = $a <= -$b;
391+
$a = $a <=> -$b;
392+
$a = $a and -$b;
393+
$a = $a or -$b;
394+
$a = $a xor -$b;
395+
$a -= -$b;
396+
$a %= -$b;
397+
$a *= -$b;
398+
$a |= -$b;
399+
$a += -$b;
400+
$a = $a ** -$b;
401+
$a **= -$b;
402+
$a = $a << -$b;
403+
$a <<= -$b;
404+
$a = $a >> -$b;
405+
$a >>= -$b;
406+
$a = (string) -$b;
407+
$a = (array) -$b;
408+
$a = (bool) -$b;
409+
$a = (object) -$b;
410+
$a = (unset) -$b;
411+
$a = (float) -$b;
412+
$a = (int) -$b;
413+
$a ^= -$b;
414+
$a = [$a, -$b];
415+
$a = $a[-$b];
416+
$a = $a ? -$b : -$b;
417+
418+
yield - $b;
419+
echo - $b;
420+
$a = - $b;
421+
func(- $b);
422+
$a = [- $b];
423+
return - $b;
424+
print - $b;
425+
$a &= - $b;
426+
switch ($a) {
427+
case - $b:
428+
}
429+
$a = $a ?? - $b;
430+
$a .= - $b;
431+
$a /= - $b;
432+
$a = [1 => - $b];
433+
$a = $a == - $b;
434+
$a = $a >= - $b;
435+
$a = $a === - $b;
436+
$a = $a != - $b;
437+
$a = $a !== - $b;
438+
$a = $a <= - $b;
439+
$a = $a <=> - $b;
440+
$a = $a and - $b;
441+
$a = $a or - $b;
442+
$a = $a xor - $b;
443+
$a -= - $b;
444+
$a %= - $b;
445+
$a *= - $b;
446+
$a |= - $b;
447+
$a += - $b;
448+
$a = $a ** - $b;
449+
$a **= - $b;
450+
$a = $a << - $b;
451+
$a <<= - $b;
452+
$a = $a >> - $b;
453+
$a >>= - $b;
454+
$a = (string) - $b;
455+
$a = (array) - $b;
456+
$a = (bool) - $b;
457+
$a = (object) - $b;
458+
$a = (unset) - $b;
459+
$a = (float) - $b;
460+
$a = (int) - $b;
461+
$a ^= - $b;
462+
$a = [$a, - $b];
463+
$a = $a[- $b];
464+
$a = $a ? - $b : - $b;
465+
273466
/* Intentional parse error. This has to be the last test in the file. */
274467
$a = 10 +

0 commit comments

Comments
 (0)