Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
FinalPrivateSniff
0.00% covered (danger)
0.00%
0 / 30
0.00% covered (danger)
0.00%
0 / 2
42
0.00% covered (danger)
0.00%
0 / 1
 register
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 process
0.00% covered (danger)
0.00%
0 / 27
0.00% covered (danger)
0.00%
0 / 1
30
1<?php
2/**
3 * Sniff to suppress the use of `final` on private methods
4 *
5 * Once PHP 8 is required, using both `final` and `private` on
6 * a function will produce a warning, and this sniff should be
7 * removed.
8 *
9 * @author DannyS712
10 */
11
12namespace MediaWiki\Sniffs\Usage;
13
14use PHP_CodeSniffer\Files\File;
15use PHP_CodeSniffer\Sniffs\Sniff;
16use PHP_CodeSniffer\Util\Tokens;
17
18class FinalPrivateSniff implements Sniff {
19    /**
20     * @inheritDoc
21     */
22    public function register(): array {
23        return [
24            T_FINAL,
25        ];
26    }
27
28    /**
29     * @param File $phpcsFile
30     * @param int $stackPtr The current token index.
31     * @return void
32     */
33    public function process( File $phpcsFile, $stackPtr ) {
34        $tokens = $phpcsFile->getTokens();
35
36        // Find the next non-empty token
37        $next = $phpcsFile->findNext(
38            Tokens::$emptyTokens,
39            $stackPtr + 1,
40            null,
41            true
42        );
43        if ( $next === false
44            || $tokens[$next]['code'] !== T_PRIVATE
45        ) {
46            // Not a private function or nothing after this, must be live coding
47            return;
48        }
49
50        $fix = $phpcsFile->addFixableError(
51            'The `final` modifier should not be used for private methods',
52            $stackPtr,
53            'Found'
54        );
55        if ( $fix ) {
56            $nextNonWhitespace = $phpcsFile->findNext(
57                T_WHITESPACE,
58                $stackPtr + 1,
59                null,
60                true
61            );
62
63            $phpcsFile->fixer->beginChangeset();
64            $phpcsFile->fixer->replaceToken( $stackPtr, '' );
65            for ( $i = $stackPtr + 1; $i < $nextNonWhitespace; $i++ ) {
66                $phpcsFile->fixer->replaceToken( $i, '' );
67            }
68            $phpcsFile->fixer->endChangeset();
69        }
70    }
71}