Passed
Push — master ( 2927c7...98f658 )
by Michael
01:46
created

MultiLineArraySniff::process()   C

Complexity

Conditions 7
Paths 20

Size

Total Lines 50
Code Lines 34

Duplication

Lines 30
Ratio 60 %

Importance

Changes 0
Metric Value
cc 7
eloc 34
nc 20
nop 2
dl 30
loc 50
rs 6.7272
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * This file is part of the mo4-coding-standard (phpcs standard)
5
 *
6
 * PHP version 5
7
 *
8
 * @category PHP
9
 * @package  PHP_CodeSniffer-MO4
10
 * @author   Xaver Loppenstedt <[email protected]>
11
 * @license  http://spdx.org/licenses/MIT MIT License
12
 * @version  GIT: master
13
 * @link     https://github.com/Mayflower/mo4-coding-standard
14
 */
15
namespace MO4\Sniffs\Arrays;
16
17
use PHP_CodeSniffer\Files\File;
18
use PHP_CodeSniffer\Sniffs\Sniff;
19
20
/**
21
 * Multi Line Array sniff.
22
 *
23
 * @category  PHP
24
 * @package   PHP_CodeSniffer-MO4
25
 * @author    Xaver Loppenstedt <[email protected]>
26
 * @copyright 2013-2017 Xaver Loppenstedt, some rights reserved.
27
 * @license   http://spdx.org/licenses/MIT MIT License
28
 * @link      https://github.com/Mayflower/mo4-coding-standard
29
 */
30
class MultiLineArraySniff implements Sniff
31
{
32
    /**
33
     * Define all types of arrays.
34
     *
35
     * @var array
36
     */
37
    protected  $arrayTokens = array(
38
                               T_ARRAY,
39
                               T_OPEN_SHORT_ARRAY,
40
                              );
41
42
43
    /**
44
     * Registers the tokens that this sniff wants to listen for.
45
     *
46
     * @return array(int)
47
     * @see    Tokens.php
48
     */
49
    public function register()
50
    {
51
        return $this->arrayTokens;
52
53
    }//end register()
54
55
56
    /**
57
     * Processes this test, when one of its tokens is encountered.
58
     *
59
     * @param File $phpcsFile The file being scanned.
60
     * @param int  $stackPtr  The position of the current token in
61
     *                        the stack passed in $tokens.
62
     *
63
     * @return void
64
     */
65
    public function process(File $phpcsFile, $stackPtr)
66
    {
67
        $tokens  = $phpcsFile->getTokens();
68
        $current = $tokens[$stackPtr];
69
70
        if ($current['code'] === T_ARRAY) {
71
            $arrayType = 'parenthesis';
72
            $start     = $current['parenthesis_opener'];
73
            $end       = $current['parenthesis_closer'];
74
        } else {
75
            $arrayType = 'bracket';
76
            $start     = $current['bracket_opener'];
77
            $end       = $current['bracket_closer'];
78
        }
79
80
        if ($tokens[$start]['line'] === $tokens[$end]['line']) {
81
            return;
82
        }
83
84 View Code Duplication
        if ($tokens[($start + 2)]['line'] === $tokens[$start]['line']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
85
            $fixable = $phpcsFile->addFixableError(
86
                sprintf(
87
                    'opening %s of multi line array must be followed by newline',
88
                    $arrayType
89
                ),
90
                $start,
91
                'OpeningMustBeFollowedByNewline'
92
            );
93
94
            if ($fixable === true) {
95
                $phpcsFile->fixer->beginChangeset();
96
                $phpcsFile->fixer->addNewline($start);
97
                $phpcsFile->fixer->endChangeset();
98
            }
99
        }
100
101 View Code Duplication
        if ($tokens[($end - 2)]['line'] === $tokens[$end]['line']) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
102
            $fixable = $phpcsFile->addFixableError(
103
                sprintf(
104
                    'closing %s of multi line array must in own line',
105
                    $arrayType
106
                ),
107
                $end,
108
                'ClosingMustBeInOwnLine'
109
            );
110
111
            if ($fixable === true) {
112
                $phpcsFile->fixer->beginChangeset();
113
                $phpcsFile->fixer->addNewlineBefore($end);
114
                $phpcsFile->fixer->endChangeset();
115
            }
116
        }
117
118
    }//end process()
119
120
121
}//end class
122