Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 37 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 1 |
AssignmentInReturnSniff | |
0.00% |
0 / 37 |
|
0.00% |
0 / 2 |
56 | |
0.00% |
0 / 1 |
register | |
0.00% |
0 / 5 |
|
0.00% |
0 / 1 |
2 | |||
process | |
0.00% |
0 / 32 |
|
0.00% |
0 / 1 |
42 |
1 | <?php |
2 | /** |
3 | * Sniff to suppress the use of: |
4 | * Fail: return $a = 0; |
5 | * Pass: return $a == 0 |
6 | */ |
7 | |
8 | namespace MediaWiki\Sniffs\Usage; |
9 | |
10 | use PHP_CodeSniffer\Files\File; |
11 | use PHP_CodeSniffer\Sniffs\Sniff; |
12 | use PHP_CodeSniffer\Util\Tokens; |
13 | |
14 | class AssignmentInReturnSniff implements Sniff { |
15 | /** |
16 | * @inheritDoc |
17 | */ |
18 | public function register(): array { |
19 | return [ |
20 | T_RETURN, |
21 | T_YIELD, |
22 | T_YIELD_FROM, |
23 | ]; |
24 | } |
25 | |
26 | /** |
27 | * @param File $phpcsFile |
28 | * @param int $stackPtr The current token index. |
29 | * @return int |
30 | */ |
31 | public function process( File $phpcsFile, $stackPtr ) { |
32 | $tokens = $phpcsFile->getTokens(); |
33 | |
34 | $searchToken = Tokens::$assignmentTokens + [ |
35 | T_CLOSURE, |
36 | T_FUNCTION, |
37 | T_ANON_CLASS, |
38 | T_SEMICOLON, |
39 | ]; |
40 | $next = $phpcsFile->findNext( $searchToken, $stackPtr + 1 ); |
41 | while ( $next !== false ) { |
42 | $code = $tokens[$next]['code']; |
43 | if ( isset( $tokens[$next]['scope_closer'] ) ) { |
44 | // Skip to the end of the closure/inner function and continue |
45 | $next = $phpcsFile->findNext( $searchToken, $tokens[$next]['scope_closer'] + 1 ); |
46 | continue; |
47 | } |
48 | if ( $code === T_SEMICOLON ) { |
49 | // End of return statement found |
50 | break; |
51 | } |
52 | // Check if any assignment operator was used. Allow T_DOUBLE_ARROW as that can |
53 | // be used in an array like `return [ 'foo' => 'bar' ]` |
54 | if ( array_key_exists( $code, Tokens::$assignmentTokens ) |
55 | && $code !== T_DOUBLE_ARROW |
56 | ) { |
57 | $errorPtr = $stackPtr; |
58 | // "yield from" could be multiline, get content from more than one token |
59 | $content = ''; |
60 | do { |
61 | $content .= $tokens[$stackPtr]['content']; |
62 | $stackPtr++; |
63 | } while ( $tokens[$stackPtr]['code'] === T_YIELD_FROM ); |
64 | // Split by any whitespaces and build better looking content with one space |
65 | $contentPieces = preg_split( '/\s+/', $content ); |
66 | $phpcsFile->addError( |
67 | 'Assignment expression not allowed within "%s".', |
68 | $errorPtr, |
69 | 'AssignmentIn' . implode( '', array_map( 'ucfirst', $contentPieces ) ), |
70 | [ implode( ' ', $contentPieces ) ] |
71 | ); |
72 | break; |
73 | } |
74 | $next = $phpcsFile->findNext( $searchToken, $next + 1 ); |
75 | } |
76 | // Do not report multiline yield tokens twice |
77 | return $stackPtr; |
78 | } |
79 | } |