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']) { |
|
|
|
|
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']) { |
|
|
|
|
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
|
|
|
|
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.