ConstructorLoopSniff   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 45
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 6
eloc 15
c 1
b 0
f 0
dl 0
loc 45
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 19 5
A register() 0 3 1
1
<?php declare(strict_types = 1);
2
3
namespace Codor\Sniffs\Classes;
4
5
use PHP_CodeSniffer\Sniffs\Sniff as PHP_CodeSniffer_Sniff;
6
use PHP_CodeSniffer\Files\File as PHP_CodeSniffer_File;
7
8
class ConstructorLoopSniff implements PHP_CodeSniffer_Sniff
9
{
10
11
    /**
12
     * The loop tokens we're lookin for.
13
     * @var array
14
     */
15
    protected $loops = ['T_FOR', 'T_FOREACH', 'T_WHILE'];
16
17
    /**
18
     * Returns the token types that this sniff is interested in.
19
     * @return array
20
     */
21
    public function register(): array
22
    {
23
        return [T_FUNCTION];
24
    }
25
26
    /**
27
     * Processes the tokens that this sniff is interested in.
28
     *
29
     * @param PHP_CodeSniffer_File $phpcsFile The file where the token was found.
30
     * @param int                  $stackPtr  The position in the stack where
31
     *                                        the token was found.
32
     * @return void
33
     */
34
    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
35
    {
36
        $tokens            = $phpcsFile->getTokens();
37
        $token             = $tokens[$stackPtr];
38
        $functionNameToken = $tokens[$stackPtr + 2];
39
        $functionName      = $functionNameToken['content'];
40
41
        if ($functionName !== '__construct') {
42
            return;
43
        }
44
        // If this is an interface we don't check it.
45
        if (! isset($token['scope_opener'])) {
46
            return;
47
        }
48
49
        for ($index=$token['scope_opener']; $index <= $token['scope_closer']; $index++) {
50
            if (in_array($tokens[$index]['type'], $this->loops)) {
51
                $phpcsFile->addError("Class constructor cannot contain a loop.", $stackPtr, __CLASS__);
52
                continue;
53
            }
54
        }
55
    }
56
}
57