@@ -49,7 +49,7 @@ |
||
49 | 49 | * @param int $stackPtr The position of the current token in the |
50 | 50 | * stack passed in $tokens. |
51 | 51 | * |
52 | - * @return void |
|
52 | + * @return null|integer |
|
53 | 53 | */ |
54 | 54 | public function process(File $phpcsFile, $stackPtr) |
55 | 55 | { |
@@ -16,328 +16,328 @@ |
||
16 | 16 | class InlineCommentSniff implements Sniff |
17 | 17 | { |
18 | 18 | |
19 | - /** |
|
20 | - * A list of tokenizers this sniff supports. |
|
21 | - * |
|
22 | - * @var array |
|
23 | - */ |
|
24 | - public $supportedTokenizers = [ |
|
25 | - 'PHP', |
|
26 | - 'JS', |
|
27 | - ]; |
|
28 | - |
|
29 | - |
|
30 | - /** |
|
31 | - * Returns an array of tokens this test wants to listen for. |
|
32 | - * |
|
33 | - * @return array |
|
34 | - */ |
|
35 | - public function register() |
|
36 | - { |
|
37 | - return [ |
|
38 | - T_COMMENT, |
|
39 | - T_DOC_COMMENT_OPEN_TAG, |
|
40 | - ]; |
|
41 | - |
|
42 | - }//end register() |
|
43 | - |
|
44 | - |
|
45 | - /** |
|
46 | - * Processes this test, when one of its tokens is encountered. |
|
47 | - * |
|
48 | - * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. |
|
49 | - * @param int $stackPtr The position of the current token in the |
|
50 | - * stack passed in $tokens. |
|
51 | - * |
|
52 | - * @return void |
|
53 | - */ |
|
54 | - public function process(File $phpcsFile, $stackPtr) |
|
55 | - { |
|
56 | - $tokens = $phpcsFile->getTokens(); |
|
57 | - |
|
58 | - // If this is a function/class/interface doc block comment, skip it. |
|
59 | - // We are only interested in inline doc block comments, which are |
|
60 | - // not allowed. |
|
61 | - if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { |
|
62 | - $nextToken = $phpcsFile->findNext( |
|
63 | - Tokens::$emptyTokens, |
|
64 | - ($stackPtr + 1), |
|
65 | - null, |
|
66 | - true |
|
67 | - ); |
|
68 | - |
|
69 | - $ignore = [ |
|
70 | - T_CLASS, |
|
71 | - T_INTERFACE, |
|
72 | - T_TRAIT, |
|
73 | - T_FUNCTION, |
|
74 | - T_CLOSURE, |
|
75 | - T_PUBLIC, |
|
76 | - T_PRIVATE, |
|
77 | - T_PROTECTED, |
|
78 | - T_FINAL, |
|
79 | - T_STATIC, |
|
80 | - T_ABSTRACT, |
|
81 | - T_CONST, |
|
82 | - T_PROPERTY, |
|
83 | - T_INCLUDE, |
|
84 | - T_INCLUDE_ONCE, |
|
85 | - T_REQUIRE, |
|
86 | - T_REQUIRE_ONCE, |
|
87 | - ]; |
|
88 | - |
|
89 | - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { |
|
90 | - return; |
|
91 | - } |
|
92 | - |
|
93 | - if ($phpcsFile->tokenizerType === 'JS') { |
|
94 | - // We allow block comments if a function or object |
|
95 | - // is being assigned to a variable. |
|
96 | - $ignore = Tokens::$emptyTokens; |
|
97 | - $ignore[] = T_EQUAL; |
|
98 | - $ignore[] = T_STRING; |
|
99 | - $ignore[] = T_OBJECT_OPERATOR; |
|
100 | - $nextToken = $phpcsFile->findNext($ignore, ($nextToken + 1), null, true); |
|
101 | - if ($tokens[$nextToken]['code'] === T_FUNCTION |
|
102 | - || $tokens[$nextToken]['code'] === T_CLOSURE |
|
103 | - || $tokens[$nextToken]['code'] === T_OBJECT |
|
104 | - || $tokens[$nextToken]['code'] === T_PROTOTYPE |
|
105 | - ) { |
|
106 | - return; |
|
107 | - } |
|
108 | - } |
|
109 | - |
|
110 | - $prevToken = $phpcsFile->findPrevious( |
|
111 | - Tokens::$emptyTokens, |
|
112 | - ($stackPtr - 1), |
|
113 | - null, |
|
114 | - true |
|
115 | - ); |
|
116 | - |
|
117 | - if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { |
|
118 | - return; |
|
119 | - } |
|
120 | - |
|
121 | - if ($tokens[$stackPtr]['content'] === '/**') { |
|
122 | - $error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead'; |
|
123 | - $phpcsFile->addError($error, $stackPtr, 'DocBlock'); |
|
124 | - } |
|
125 | - }//end if |
|
126 | - |
|
127 | - if ($tokens[$stackPtr]['content']{0} === '#') { |
|
128 | - $error = 'Perl-style comments are not allowed; use "// Comment" instead'; |
|
129 | - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); |
|
130 | - if ($fix === true) { |
|
131 | - $comment = ltrim($tokens[$stackPtr]['content'], "# \t"); |
|
132 | - $phpcsFile->fixer->replaceToken($stackPtr, "// $comment"); |
|
133 | - } |
|
134 | - } |
|
135 | - |
|
136 | - // We don't want end of block comments. Check if the last token before the |
|
137 | - // comment is a closing curly brace. |
|
138 | - $previousContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); |
|
139 | - if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) { |
|
140 | - if ($tokens[$previousContent]['code'] === T_CLOSE_CURLY_BRACKET) { |
|
141 | - return; |
|
142 | - } |
|
143 | - |
|
144 | - // Special case for JS files. |
|
145 | - if ($tokens[$previousContent]['code'] === T_COMMA |
|
146 | - || $tokens[$previousContent]['code'] === T_SEMICOLON |
|
147 | - ) { |
|
148 | - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($previousContent - 1), null, true); |
|
149 | - if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { |
|
150 | - return; |
|
151 | - } |
|
152 | - } |
|
153 | - } |
|
154 | - |
|
155 | - // Only want inline comments. |
|
156 | - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { |
|
157 | - return; |
|
158 | - } |
|
159 | - |
|
160 | - $commentTokens = [$stackPtr]; |
|
161 | - |
|
162 | - $nextComment = $stackPtr; |
|
163 | - $lastComment = $stackPtr; |
|
164 | - while (($nextComment = $phpcsFile->findNext(T_COMMENT, ($nextComment + 1), null, false)) !== false) { |
|
165 | - if ($tokens[$nextComment]['line'] !== ($tokens[$lastComment]['line'] + 1)) { |
|
166 | - break; |
|
167 | - } |
|
168 | - |
|
169 | - // Only want inline comments. |
|
170 | - if (substr($tokens[$nextComment]['content'], 0, 2) !== '//') { |
|
171 | - break; |
|
172 | - } |
|
173 | - |
|
174 | - // There is a comment on the very next line. If there is |
|
175 | - // no code between the comments, they are part of the same |
|
176 | - // comment block. |
|
177 | - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextComment - 1), $lastComment, true); |
|
178 | - if ($prevNonWhitespace !== $lastComment) { |
|
179 | - break; |
|
180 | - } |
|
181 | - |
|
182 | - $commentTokens[] = $nextComment; |
|
183 | - $lastComment = $nextComment; |
|
184 | - }//end while |
|
185 | - |
|
186 | - $commentText = ''; |
|
187 | - foreach ($commentTokens as $lastCommentToken) { |
|
188 | - $comment = rtrim($tokens[$lastCommentToken]['content']); |
|
189 | - |
|
190 | - if (trim(substr($comment, 2)) === '') { |
|
191 | - continue; |
|
192 | - } |
|
193 | - |
|
194 | - $spaceCount = 0; |
|
195 | - $tabFound = false; |
|
196 | - |
|
197 | - $commentLength = strlen($comment); |
|
198 | - for ($i = 2; $i < $commentLength; $i++) { |
|
199 | - if ($comment[$i] === "\t") { |
|
200 | - $tabFound = true; |
|
201 | - break; |
|
202 | - } |
|
203 | - |
|
204 | - if ($comment[$i] !== ' ') { |
|
205 | - break; |
|
206 | - } |
|
207 | - |
|
208 | - $spaceCount++; |
|
209 | - } |
|
210 | - |
|
211 | - $fix = false; |
|
212 | - if ($tabFound === true) { |
|
213 | - $error = 'Tab found before comment text; expected "// %s" but found "%s"'; |
|
214 | - $data = [ |
|
215 | - ltrim(substr($comment, 2)), |
|
216 | - $comment, |
|
217 | - ]; |
|
218 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'TabBefore', $data); |
|
219 | - } else if ($spaceCount === 0) { |
|
220 | - $error = 'No space found before comment text; expected "// %s" but found "%s"'; |
|
221 | - $data = [ |
|
222 | - substr($comment, 2), |
|
223 | - $comment, |
|
224 | - ]; |
|
225 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'NoSpaceBefore', $data); |
|
226 | - } else if ($spaceCount > 1) { |
|
227 | - $error = 'Expected 1 space before comment text but found %s; use block comment if you need indentation'; |
|
228 | - $data = [ |
|
229 | - $spaceCount, |
|
230 | - substr($comment, (2 + $spaceCount)), |
|
231 | - $comment, |
|
232 | - ]; |
|
233 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'SpacingBefore', $data); |
|
234 | - }//end if |
|
235 | - |
|
236 | - if ($fix === true) { |
|
237 | - $newComment = '// '.ltrim($tokens[$lastCommentToken]['content'], "/\t "); |
|
238 | - $phpcsFile->fixer->replaceToken($lastCommentToken, $newComment); |
|
239 | - } |
|
240 | - |
|
241 | - $commentText .= trim(substr($tokens[$lastCommentToken]['content'], 2)); |
|
242 | - }//end foreach |
|
243 | - |
|
244 | - if ($commentText === '') { |
|
245 | - $error = 'Blank comments are not allowed'; |
|
246 | - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); |
|
247 | - if ($fix === true) { |
|
248 | - $phpcsFile->fixer->replaceToken($stackPtr, ''); |
|
249 | - } |
|
250 | - |
|
251 | - return ($lastCommentToken + 1); |
|
252 | - } |
|
253 | - |
|
254 | - if (preg_match('/^\p{Ll}/u', $commentText) === 1) { |
|
255 | - $error = 'Inline comments must start with a capital letter'; |
|
256 | - $phpcsFile->addError($error, $stackPtr, 'NotCapital'); |
|
257 | - } |
|
258 | - |
|
259 | - // Only check the end of comment character if the start of the comment |
|
260 | - // is a letter, indicating that the comment is just standard text. |
|
261 | - if (preg_match('/^\p{L}/u', $commentText) === 1) { |
|
262 | - $commentCloser = $commentText[(strlen($commentText) - 1)]; |
|
263 | - $acceptedClosers = [ |
|
264 | - 'full-stops' => '.', |
|
265 | - 'exclamation marks' => '!', |
|
266 | - 'or question marks' => '?', |
|
267 | - ]; |
|
268 | - |
|
269 | - if (in_array($commentCloser, $acceptedClosers, true) === false) { |
|
270 | - $error = 'Inline comments must end in %s'; |
|
271 | - $ender = ''; |
|
272 | - foreach ($acceptedClosers as $closerName => $symbol) { |
|
273 | - $ender .= ' '.$closerName.','; |
|
274 | - } |
|
275 | - |
|
276 | - $ender = trim($ender, ' ,'); |
|
277 | - $data = [$ender]; |
|
278 | - $phpcsFile->addError($error, $lastCommentToken, 'InvalidEndChar', $data); |
|
279 | - } |
|
280 | - } |
|
281 | - |
|
282 | - // Finally, the line below the last comment cannot be empty if this inline |
|
283 | - // comment is on a line by itself. |
|
284 | - if ($tokens[$previousContent]['line'] < $tokens[$stackPtr]['line']) { |
|
285 | - $next = $phpcsFile->findNext(T_WHITESPACE, ($lastCommentToken + 1), null, true); |
|
286 | - if ($next === false) { |
|
287 | - // Ignore if the comment is the last non-whitespace token in a file. |
|
288 | - return ($lastCommentToken + 1); |
|
289 | - } |
|
290 | - |
|
291 | - if ($tokens[$next]['code'] === T_DOC_COMMENT_OPEN_TAG) { |
|
292 | - // If this inline comment is followed by a docblock, |
|
293 | - // ignore spacing as docblock/function etc spacing rules |
|
294 | - // are likely to conflict with our rules. |
|
295 | - return ($lastCommentToken + 1); |
|
296 | - } |
|
297 | - |
|
298 | - $errorCode = 'SpacingAfter'; |
|
299 | - |
|
300 | - if (isset($tokens[$stackPtr]['conditions']) === true) { |
|
301 | - $conditions = $tokens[$stackPtr]['conditions']; |
|
302 | - $type = end($conditions); |
|
303 | - $conditionPtr = key($conditions); |
|
304 | - |
|
305 | - if (($type === T_FUNCTION || $type === T_CLOSURE) |
|
306 | - && $tokens[$conditionPtr]['scope_closer'] === $next |
|
307 | - ) { |
|
308 | - $errorCode = 'SpacingAfterAtFunctionEnd'; |
|
309 | - } |
|
310 | - } |
|
311 | - |
|
312 | - for ($i = ($lastCommentToken + 1); $i < $phpcsFile->numTokens; $i++) { |
|
313 | - if ($tokens[$i]['line'] === ($tokens[$lastCommentToken]['line'] + 1)) { |
|
314 | - if ($tokens[$i]['code'] !== T_WHITESPACE) { |
|
315 | - return ($lastCommentToken + 1); |
|
316 | - } |
|
317 | - } else if ($tokens[$i]['line'] > ($tokens[$lastCommentToken]['line'] + 1)) { |
|
318 | - break; |
|
319 | - } |
|
320 | - } |
|
321 | - |
|
322 | - $error = 'There must be no blank line following an inline comment'; |
|
323 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, $errorCode); |
|
324 | - if ($fix === true) { |
|
325 | - $phpcsFile->fixer->beginChangeset(); |
|
326 | - for ($i = ($lastCommentToken + 1); $i < $next; $i++) { |
|
327 | - if ($tokens[$i]['line'] === $tokens[$next]['line']) { |
|
328 | - break; |
|
329 | - } |
|
330 | - |
|
331 | - $phpcsFile->fixer->replaceToken($i, ''); |
|
332 | - } |
|
333 | - |
|
334 | - $phpcsFile->fixer->endChangeset(); |
|
335 | - } |
|
336 | - }//end if |
|
337 | - |
|
338 | - return ($lastCommentToken + 1); |
|
339 | - |
|
340 | - }//end process() |
|
19 | + /** |
|
20 | + * A list of tokenizers this sniff supports. |
|
21 | + * |
|
22 | + * @var array |
|
23 | + */ |
|
24 | + public $supportedTokenizers = [ |
|
25 | + 'PHP', |
|
26 | + 'JS', |
|
27 | + ]; |
|
28 | + |
|
29 | + |
|
30 | + /** |
|
31 | + * Returns an array of tokens this test wants to listen for. |
|
32 | + * |
|
33 | + * @return array |
|
34 | + */ |
|
35 | + public function register() |
|
36 | + { |
|
37 | + return [ |
|
38 | + T_COMMENT, |
|
39 | + T_DOC_COMMENT_OPEN_TAG, |
|
40 | + ]; |
|
41 | + |
|
42 | + }//end register() |
|
43 | + |
|
44 | + |
|
45 | + /** |
|
46 | + * Processes this test, when one of its tokens is encountered. |
|
47 | + * |
|
48 | + * @param \PHP_CodeSniffer\Files\File $phpcsFile The file being scanned. |
|
49 | + * @param int $stackPtr The position of the current token in the |
|
50 | + * stack passed in $tokens. |
|
51 | + * |
|
52 | + * @return void |
|
53 | + */ |
|
54 | + public function process(File $phpcsFile, $stackPtr) |
|
55 | + { |
|
56 | + $tokens = $phpcsFile->getTokens(); |
|
57 | + |
|
58 | + // If this is a function/class/interface doc block comment, skip it. |
|
59 | + // We are only interested in inline doc block comments, which are |
|
60 | + // not allowed. |
|
61 | + if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { |
|
62 | + $nextToken = $phpcsFile->findNext( |
|
63 | + Tokens::$emptyTokens, |
|
64 | + ($stackPtr + 1), |
|
65 | + null, |
|
66 | + true |
|
67 | + ); |
|
68 | + |
|
69 | + $ignore = [ |
|
70 | + T_CLASS, |
|
71 | + T_INTERFACE, |
|
72 | + T_TRAIT, |
|
73 | + T_FUNCTION, |
|
74 | + T_CLOSURE, |
|
75 | + T_PUBLIC, |
|
76 | + T_PRIVATE, |
|
77 | + T_PROTECTED, |
|
78 | + T_FINAL, |
|
79 | + T_STATIC, |
|
80 | + T_ABSTRACT, |
|
81 | + T_CONST, |
|
82 | + T_PROPERTY, |
|
83 | + T_INCLUDE, |
|
84 | + T_INCLUDE_ONCE, |
|
85 | + T_REQUIRE, |
|
86 | + T_REQUIRE_ONCE, |
|
87 | + ]; |
|
88 | + |
|
89 | + if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { |
|
90 | + return; |
|
91 | + } |
|
92 | + |
|
93 | + if ($phpcsFile->tokenizerType === 'JS') { |
|
94 | + // We allow block comments if a function or object |
|
95 | + // is being assigned to a variable. |
|
96 | + $ignore = Tokens::$emptyTokens; |
|
97 | + $ignore[] = T_EQUAL; |
|
98 | + $ignore[] = T_STRING; |
|
99 | + $ignore[] = T_OBJECT_OPERATOR; |
|
100 | + $nextToken = $phpcsFile->findNext($ignore, ($nextToken + 1), null, true); |
|
101 | + if ($tokens[$nextToken]['code'] === T_FUNCTION |
|
102 | + || $tokens[$nextToken]['code'] === T_CLOSURE |
|
103 | + || $tokens[$nextToken]['code'] === T_OBJECT |
|
104 | + || $tokens[$nextToken]['code'] === T_PROTOTYPE |
|
105 | + ) { |
|
106 | + return; |
|
107 | + } |
|
108 | + } |
|
109 | + |
|
110 | + $prevToken = $phpcsFile->findPrevious( |
|
111 | + Tokens::$emptyTokens, |
|
112 | + ($stackPtr - 1), |
|
113 | + null, |
|
114 | + true |
|
115 | + ); |
|
116 | + |
|
117 | + if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { |
|
118 | + return; |
|
119 | + } |
|
120 | + |
|
121 | + if ($tokens[$stackPtr]['content'] === '/**') { |
|
122 | + $error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead'; |
|
123 | + $phpcsFile->addError($error, $stackPtr, 'DocBlock'); |
|
124 | + } |
|
125 | + }//end if |
|
126 | + |
|
127 | + if ($tokens[$stackPtr]['content']{0} === '#') { |
|
128 | + $error = 'Perl-style comments are not allowed; use "// Comment" instead'; |
|
129 | + $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); |
|
130 | + if ($fix === true) { |
|
131 | + $comment = ltrim($tokens[$stackPtr]['content'], "# \t"); |
|
132 | + $phpcsFile->fixer->replaceToken($stackPtr, "// $comment"); |
|
133 | + } |
|
134 | + } |
|
135 | + |
|
136 | + // We don't want end of block comments. Check if the last token before the |
|
137 | + // comment is a closing curly brace. |
|
138 | + $previousContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); |
|
139 | + if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) { |
|
140 | + if ($tokens[$previousContent]['code'] === T_CLOSE_CURLY_BRACKET) { |
|
141 | + return; |
|
142 | + } |
|
143 | + |
|
144 | + // Special case for JS files. |
|
145 | + if ($tokens[$previousContent]['code'] === T_COMMA |
|
146 | + || $tokens[$previousContent]['code'] === T_SEMICOLON |
|
147 | + ) { |
|
148 | + $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($previousContent - 1), null, true); |
|
149 | + if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { |
|
150 | + return; |
|
151 | + } |
|
152 | + } |
|
153 | + } |
|
154 | + |
|
155 | + // Only want inline comments. |
|
156 | + if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { |
|
157 | + return; |
|
158 | + } |
|
159 | + |
|
160 | + $commentTokens = [$stackPtr]; |
|
161 | + |
|
162 | + $nextComment = $stackPtr; |
|
163 | + $lastComment = $stackPtr; |
|
164 | + while (($nextComment = $phpcsFile->findNext(T_COMMENT, ($nextComment + 1), null, false)) !== false) { |
|
165 | + if ($tokens[$nextComment]['line'] !== ($tokens[$lastComment]['line'] + 1)) { |
|
166 | + break; |
|
167 | + } |
|
168 | + |
|
169 | + // Only want inline comments. |
|
170 | + if (substr($tokens[$nextComment]['content'], 0, 2) !== '//') { |
|
171 | + break; |
|
172 | + } |
|
173 | + |
|
174 | + // There is a comment on the very next line. If there is |
|
175 | + // no code between the comments, they are part of the same |
|
176 | + // comment block. |
|
177 | + $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextComment - 1), $lastComment, true); |
|
178 | + if ($prevNonWhitespace !== $lastComment) { |
|
179 | + break; |
|
180 | + } |
|
181 | + |
|
182 | + $commentTokens[] = $nextComment; |
|
183 | + $lastComment = $nextComment; |
|
184 | + }//end while |
|
185 | + |
|
186 | + $commentText = ''; |
|
187 | + foreach ($commentTokens as $lastCommentToken) { |
|
188 | + $comment = rtrim($tokens[$lastCommentToken]['content']); |
|
189 | + |
|
190 | + if (trim(substr($comment, 2)) === '') { |
|
191 | + continue; |
|
192 | + } |
|
193 | + |
|
194 | + $spaceCount = 0; |
|
195 | + $tabFound = false; |
|
196 | + |
|
197 | + $commentLength = strlen($comment); |
|
198 | + for ($i = 2; $i < $commentLength; $i++) { |
|
199 | + if ($comment[$i] === "\t") { |
|
200 | + $tabFound = true; |
|
201 | + break; |
|
202 | + } |
|
203 | + |
|
204 | + if ($comment[$i] !== ' ') { |
|
205 | + break; |
|
206 | + } |
|
207 | + |
|
208 | + $spaceCount++; |
|
209 | + } |
|
210 | + |
|
211 | + $fix = false; |
|
212 | + if ($tabFound === true) { |
|
213 | + $error = 'Tab found before comment text; expected "// %s" but found "%s"'; |
|
214 | + $data = [ |
|
215 | + ltrim(substr($comment, 2)), |
|
216 | + $comment, |
|
217 | + ]; |
|
218 | + $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'TabBefore', $data); |
|
219 | + } else if ($spaceCount === 0) { |
|
220 | + $error = 'No space found before comment text; expected "// %s" but found "%s"'; |
|
221 | + $data = [ |
|
222 | + substr($comment, 2), |
|
223 | + $comment, |
|
224 | + ]; |
|
225 | + $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'NoSpaceBefore', $data); |
|
226 | + } else if ($spaceCount > 1) { |
|
227 | + $error = 'Expected 1 space before comment text but found %s; use block comment if you need indentation'; |
|
228 | + $data = [ |
|
229 | + $spaceCount, |
|
230 | + substr($comment, (2 + $spaceCount)), |
|
231 | + $comment, |
|
232 | + ]; |
|
233 | + $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'SpacingBefore', $data); |
|
234 | + }//end if |
|
235 | + |
|
236 | + if ($fix === true) { |
|
237 | + $newComment = '// '.ltrim($tokens[$lastCommentToken]['content'], "/\t "); |
|
238 | + $phpcsFile->fixer->replaceToken($lastCommentToken, $newComment); |
|
239 | + } |
|
240 | + |
|
241 | + $commentText .= trim(substr($tokens[$lastCommentToken]['content'], 2)); |
|
242 | + }//end foreach |
|
243 | + |
|
244 | + if ($commentText === '') { |
|
245 | + $error = 'Blank comments are not allowed'; |
|
246 | + $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); |
|
247 | + if ($fix === true) { |
|
248 | + $phpcsFile->fixer->replaceToken($stackPtr, ''); |
|
249 | + } |
|
250 | + |
|
251 | + return ($lastCommentToken + 1); |
|
252 | + } |
|
253 | + |
|
254 | + if (preg_match('/^\p{Ll}/u', $commentText) === 1) { |
|
255 | + $error = 'Inline comments must start with a capital letter'; |
|
256 | + $phpcsFile->addError($error, $stackPtr, 'NotCapital'); |
|
257 | + } |
|
258 | + |
|
259 | + // Only check the end of comment character if the start of the comment |
|
260 | + // is a letter, indicating that the comment is just standard text. |
|
261 | + if (preg_match('/^\p{L}/u', $commentText) === 1) { |
|
262 | + $commentCloser = $commentText[(strlen($commentText) - 1)]; |
|
263 | + $acceptedClosers = [ |
|
264 | + 'full-stops' => '.', |
|
265 | + 'exclamation marks' => '!', |
|
266 | + 'or question marks' => '?', |
|
267 | + ]; |
|
268 | + |
|
269 | + if (in_array($commentCloser, $acceptedClosers, true) === false) { |
|
270 | + $error = 'Inline comments must end in %s'; |
|
271 | + $ender = ''; |
|
272 | + foreach ($acceptedClosers as $closerName => $symbol) { |
|
273 | + $ender .= ' '.$closerName.','; |
|
274 | + } |
|
275 | + |
|
276 | + $ender = trim($ender, ' ,'); |
|
277 | + $data = [$ender]; |
|
278 | + $phpcsFile->addError($error, $lastCommentToken, 'InvalidEndChar', $data); |
|
279 | + } |
|
280 | + } |
|
281 | + |
|
282 | + // Finally, the line below the last comment cannot be empty if this inline |
|
283 | + // comment is on a line by itself. |
|
284 | + if ($tokens[$previousContent]['line'] < $tokens[$stackPtr]['line']) { |
|
285 | + $next = $phpcsFile->findNext(T_WHITESPACE, ($lastCommentToken + 1), null, true); |
|
286 | + if ($next === false) { |
|
287 | + // Ignore if the comment is the last non-whitespace token in a file. |
|
288 | + return ($lastCommentToken + 1); |
|
289 | + } |
|
290 | + |
|
291 | + if ($tokens[$next]['code'] === T_DOC_COMMENT_OPEN_TAG) { |
|
292 | + // If this inline comment is followed by a docblock, |
|
293 | + // ignore spacing as docblock/function etc spacing rules |
|
294 | + // are likely to conflict with our rules. |
|
295 | + return ($lastCommentToken + 1); |
|
296 | + } |
|
297 | + |
|
298 | + $errorCode = 'SpacingAfter'; |
|
299 | + |
|
300 | + if (isset($tokens[$stackPtr]['conditions']) === true) { |
|
301 | + $conditions = $tokens[$stackPtr]['conditions']; |
|
302 | + $type = end($conditions); |
|
303 | + $conditionPtr = key($conditions); |
|
304 | + |
|
305 | + if (($type === T_FUNCTION || $type === T_CLOSURE) |
|
306 | + && $tokens[$conditionPtr]['scope_closer'] === $next |
|
307 | + ) { |
|
308 | + $errorCode = 'SpacingAfterAtFunctionEnd'; |
|
309 | + } |
|
310 | + } |
|
311 | + |
|
312 | + for ($i = ($lastCommentToken + 1); $i < $phpcsFile->numTokens; $i++) { |
|
313 | + if ($tokens[$i]['line'] === ($tokens[$lastCommentToken]['line'] + 1)) { |
|
314 | + if ($tokens[$i]['code'] !== T_WHITESPACE) { |
|
315 | + return ($lastCommentToken + 1); |
|
316 | + } |
|
317 | + } else if ($tokens[$i]['line'] > ($tokens[$lastCommentToken]['line'] + 1)) { |
|
318 | + break; |
|
319 | + } |
|
320 | + } |
|
321 | + |
|
322 | + $error = 'There must be no blank line following an inline comment'; |
|
323 | + $fix = $phpcsFile->addFixableError($error, $lastCommentToken, $errorCode); |
|
324 | + if ($fix === true) { |
|
325 | + $phpcsFile->fixer->beginChangeset(); |
|
326 | + for ($i = ($lastCommentToken + 1); $i < $next; $i++) { |
|
327 | + if ($tokens[$i]['line'] === $tokens[$next]['line']) { |
|
328 | + break; |
|
329 | + } |
|
330 | + |
|
331 | + $phpcsFile->fixer->replaceToken($i, ''); |
|
332 | + } |
|
333 | + |
|
334 | + $phpcsFile->fixer->endChangeset(); |
|
335 | + } |
|
336 | + }//end if |
|
337 | + |
|
338 | + return ($lastCommentToken + 1); |
|
339 | + |
|
340 | + }//end process() |
|
341 | 341 | |
342 | 342 | |
343 | 343 | }//end class |
@@ -51,17 +51,17 @@ discard block |
||
51 | 51 | * |
52 | 52 | * @return void |
53 | 53 | */ |
54 | - public function process(File $phpcsFile, $stackPtr) |
|
54 | + public function process( File $phpcsFile, $stackPtr ) |
|
55 | 55 | { |
56 | 56 | $tokens = $phpcsFile->getTokens(); |
57 | 57 | |
58 | 58 | // If this is a function/class/interface doc block comment, skip it. |
59 | 59 | // We are only interested in inline doc block comments, which are |
60 | 60 | // not allowed. |
61 | - if ($tokens[$stackPtr]['code'] === T_DOC_COMMENT_OPEN_TAG) { |
|
61 | + if ( $tokens[ $stackPtr ][ 'code' ] === T_DOC_COMMENT_OPEN_TAG ) { |
|
62 | 62 | $nextToken = $phpcsFile->findNext( |
63 | 63 | Tokens::$emptyTokens, |
64 | - ($stackPtr + 1), |
|
64 | + ( $stackPtr + 1 ), |
|
65 | 65 | null, |
66 | 66 | true |
67 | 67 | ); |
@@ -86,22 +86,22 @@ discard block |
||
86 | 86 | T_REQUIRE_ONCE, |
87 | 87 | ]; |
88 | 88 | |
89 | - if (in_array($tokens[$nextToken]['code'], $ignore, true) === true) { |
|
89 | + if ( in_array( $tokens[ $nextToken ][ 'code' ], $ignore, true ) === true ) { |
|
90 | 90 | return; |
91 | 91 | } |
92 | 92 | |
93 | - if ($phpcsFile->tokenizerType === 'JS') { |
|
93 | + if ( $phpcsFile->tokenizerType === 'JS' ) { |
|
94 | 94 | // We allow block comments if a function or object |
95 | 95 | // is being assigned to a variable. |
96 | 96 | $ignore = Tokens::$emptyTokens; |
97 | - $ignore[] = T_EQUAL; |
|
98 | - $ignore[] = T_STRING; |
|
99 | - $ignore[] = T_OBJECT_OPERATOR; |
|
100 | - $nextToken = $phpcsFile->findNext($ignore, ($nextToken + 1), null, true); |
|
101 | - if ($tokens[$nextToken]['code'] === T_FUNCTION |
|
102 | - || $tokens[$nextToken]['code'] === T_CLOSURE |
|
103 | - || $tokens[$nextToken]['code'] === T_OBJECT |
|
104 | - || $tokens[$nextToken]['code'] === T_PROTOTYPE |
|
97 | + $ignore[ ] = T_EQUAL; |
|
98 | + $ignore[ ] = T_STRING; |
|
99 | + $ignore[ ] = T_OBJECT_OPERATOR; |
|
100 | + $nextToken = $phpcsFile->findNext( $ignore, ( $nextToken + 1 ), null, true ); |
|
101 | + if ( $tokens[ $nextToken ][ 'code' ] === T_FUNCTION |
|
102 | + || $tokens[ $nextToken ][ 'code' ] === T_CLOSURE |
|
103 | + || $tokens[ $nextToken ][ 'code' ] === T_OBJECT |
|
104 | + || $tokens[ $nextToken ][ 'code' ] === T_PROTOTYPE |
|
105 | 105 | ) { |
106 | 106 | return; |
107 | 107 | } |
@@ -109,99 +109,99 @@ discard block |
||
109 | 109 | |
110 | 110 | $prevToken = $phpcsFile->findPrevious( |
111 | 111 | Tokens::$emptyTokens, |
112 | - ($stackPtr - 1), |
|
112 | + ( $stackPtr - 1 ), |
|
113 | 113 | null, |
114 | 114 | true |
115 | 115 | ); |
116 | 116 | |
117 | - if ($tokens[$prevToken]['code'] === T_OPEN_TAG) { |
|
117 | + if ( $tokens[ $prevToken ][ 'code' ] === T_OPEN_TAG ) { |
|
118 | 118 | return; |
119 | 119 | } |
120 | 120 | |
121 | - if ($tokens[$stackPtr]['content'] === '/**') { |
|
121 | + if ( $tokens[ $stackPtr ][ 'content' ] === '/**' ) { |
|
122 | 122 | $error = 'Inline doc block comments are not allowed; use "/* Comment */" or "// Comment" instead'; |
123 | - $phpcsFile->addError($error, $stackPtr, 'DocBlock'); |
|
123 | + $phpcsFile->addError( $error, $stackPtr, 'DocBlock' ); |
|
124 | 124 | } |
125 | 125 | }//end if |
126 | 126 | |
127 | - if ($tokens[$stackPtr]['content']{0} === '#') { |
|
127 | + if ( $tokens[ $stackPtr ][ 'content' ]{0} === '#' ) { |
|
128 | 128 | $error = 'Perl-style comments are not allowed; use "// Comment" instead'; |
129 | - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); |
|
130 | - if ($fix === true) { |
|
131 | - $comment = ltrim($tokens[$stackPtr]['content'], "# \t"); |
|
132 | - $phpcsFile->fixer->replaceToken($stackPtr, "// $comment"); |
|
129 | + $fix = $phpcsFile->addFixableError( $error, $stackPtr, 'WrongStyle' ); |
|
130 | + if ( $fix === true ) { |
|
131 | + $comment = ltrim( $tokens[ $stackPtr ][ 'content' ], "# \t" ); |
|
132 | + $phpcsFile->fixer->replaceToken( $stackPtr, "// $comment" ); |
|
133 | 133 | } |
134 | 134 | } |
135 | 135 | |
136 | 136 | // We don't want end of block comments. Check if the last token before the |
137 | 137 | // comment is a closing curly brace. |
138 | - $previousContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true); |
|
139 | - if ($tokens[$previousContent]['line'] === $tokens[$stackPtr]['line']) { |
|
140 | - if ($tokens[$previousContent]['code'] === T_CLOSE_CURLY_BRACKET) { |
|
138 | + $previousContent = $phpcsFile->findPrevious( T_WHITESPACE, ( $stackPtr - 1 ), null, true ); |
|
139 | + if ( $tokens[ $previousContent ][ 'line' ] === $tokens[ $stackPtr ][ 'line' ] ) { |
|
140 | + if ( $tokens[ $previousContent ][ 'code' ] === T_CLOSE_CURLY_BRACKET ) { |
|
141 | 141 | return; |
142 | 142 | } |
143 | 143 | |
144 | 144 | // Special case for JS files. |
145 | - if ($tokens[$previousContent]['code'] === T_COMMA |
|
146 | - || $tokens[$previousContent]['code'] === T_SEMICOLON |
|
145 | + if ( $tokens[ $previousContent ][ 'code' ] === T_COMMA |
|
146 | + || $tokens[ $previousContent ][ 'code' ] === T_SEMICOLON |
|
147 | 147 | ) { |
148 | - $lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($previousContent - 1), null, true); |
|
149 | - if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) { |
|
148 | + $lastContent = $phpcsFile->findPrevious( T_WHITESPACE, ( $previousContent - 1 ), null, true ); |
|
149 | + if ( $tokens[ $lastContent ][ 'code' ] === T_CLOSE_CURLY_BRACKET ) { |
|
150 | 150 | return; |
151 | 151 | } |
152 | 152 | } |
153 | 153 | } |
154 | 154 | |
155 | 155 | // Only want inline comments. |
156 | - if (substr($tokens[$stackPtr]['content'], 0, 2) !== '//') { |
|
156 | + if ( substr( $tokens[ $stackPtr ][ 'content' ], 0, 2 ) !== '//' ) { |
|
157 | 157 | return; |
158 | 158 | } |
159 | 159 | |
160 | - $commentTokens = [$stackPtr]; |
|
160 | + $commentTokens = [ $stackPtr ]; |
|
161 | 161 | |
162 | 162 | $nextComment = $stackPtr; |
163 | 163 | $lastComment = $stackPtr; |
164 | - while (($nextComment = $phpcsFile->findNext(T_COMMENT, ($nextComment + 1), null, false)) !== false) { |
|
165 | - if ($tokens[$nextComment]['line'] !== ($tokens[$lastComment]['line'] + 1)) { |
|
164 | + while ( ( $nextComment = $phpcsFile->findNext( T_COMMENT, ( $nextComment + 1 ), null, false ) ) !== false ) { |
|
165 | + if ( $tokens[ $nextComment ][ 'line' ] !== ( $tokens[ $lastComment ][ 'line' ] + 1 ) ) { |
|
166 | 166 | break; |
167 | 167 | } |
168 | 168 | |
169 | 169 | // Only want inline comments. |
170 | - if (substr($tokens[$nextComment]['content'], 0, 2) !== '//') { |
|
170 | + if ( substr( $tokens[ $nextComment ][ 'content' ], 0, 2 ) !== '//' ) { |
|
171 | 171 | break; |
172 | 172 | } |
173 | 173 | |
174 | 174 | // There is a comment on the very next line. If there is |
175 | 175 | // no code between the comments, they are part of the same |
176 | 176 | // comment block. |
177 | - $prevNonWhitespace = $phpcsFile->findPrevious(T_WHITESPACE, ($nextComment - 1), $lastComment, true); |
|
178 | - if ($prevNonWhitespace !== $lastComment) { |
|
177 | + $prevNonWhitespace = $phpcsFile->findPrevious( T_WHITESPACE, ( $nextComment - 1 ), $lastComment, true ); |
|
178 | + if ( $prevNonWhitespace !== $lastComment ) { |
|
179 | 179 | break; |
180 | 180 | } |
181 | 181 | |
182 | - $commentTokens[] = $nextComment; |
|
182 | + $commentTokens[ ] = $nextComment; |
|
183 | 183 | $lastComment = $nextComment; |
184 | 184 | }//end while |
185 | 185 | |
186 | 186 | $commentText = ''; |
187 | - foreach ($commentTokens as $lastCommentToken) { |
|
188 | - $comment = rtrim($tokens[$lastCommentToken]['content']); |
|
187 | + foreach ( $commentTokens as $lastCommentToken ) { |
|
188 | + $comment = rtrim( $tokens[ $lastCommentToken ][ 'content' ] ); |
|
189 | 189 | |
190 | - if (trim(substr($comment, 2)) === '') { |
|
190 | + if ( trim( substr( $comment, 2 ) ) === '' ) { |
|
191 | 191 | continue; |
192 | 192 | } |
193 | 193 | |
194 | 194 | $spaceCount = 0; |
195 | 195 | $tabFound = false; |
196 | 196 | |
197 | - $commentLength = strlen($comment); |
|
198 | - for ($i = 2; $i < $commentLength; $i++) { |
|
199 | - if ($comment[$i] === "\t") { |
|
197 | + $commentLength = strlen( $comment ); |
|
198 | + for ( $i = 2; $i < $commentLength; $i++ ) { |
|
199 | + if ( $comment[ $i ] === "\t" ) { |
|
200 | 200 | $tabFound = true; |
201 | 201 | break; |
202 | 202 | } |
203 | 203 | |
204 | - if ($comment[$i] !== ' ') { |
|
204 | + if ( $comment[ $i ] !== ' ' ) { |
|
205 | 205 | break; |
206 | 206 | } |
207 | 207 | |
@@ -209,133 +209,133 @@ discard block |
||
209 | 209 | } |
210 | 210 | |
211 | 211 | $fix = false; |
212 | - if ($tabFound === true) { |
|
212 | + if ( $tabFound === true ) { |
|
213 | 213 | $error = 'Tab found before comment text; expected "// %s" but found "%s"'; |
214 | 214 | $data = [ |
215 | - ltrim(substr($comment, 2)), |
|
215 | + ltrim( substr( $comment, 2 ) ), |
|
216 | 216 | $comment, |
217 | 217 | ]; |
218 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'TabBefore', $data); |
|
219 | - } else if ($spaceCount === 0) { |
|
218 | + $fix = $phpcsFile->addFixableError( $error, $lastCommentToken, 'TabBefore', $data ); |
|
219 | + } else if ( $spaceCount === 0 ) { |
|
220 | 220 | $error = 'No space found before comment text; expected "// %s" but found "%s"'; |
221 | 221 | $data = [ |
222 | - substr($comment, 2), |
|
222 | + substr( $comment, 2 ), |
|
223 | 223 | $comment, |
224 | 224 | ]; |
225 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'NoSpaceBefore', $data); |
|
226 | - } else if ($spaceCount > 1) { |
|
225 | + $fix = $phpcsFile->addFixableError( $error, $lastCommentToken, 'NoSpaceBefore', $data ); |
|
226 | + } else if ( $spaceCount > 1 ) { |
|
227 | 227 | $error = 'Expected 1 space before comment text but found %s; use block comment if you need indentation'; |
228 | 228 | $data = [ |
229 | 229 | $spaceCount, |
230 | - substr($comment, (2 + $spaceCount)), |
|
230 | + substr( $comment, ( 2 + $spaceCount ) ), |
|
231 | 231 | $comment, |
232 | 232 | ]; |
233 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, 'SpacingBefore', $data); |
|
233 | + $fix = $phpcsFile->addFixableError( $error, $lastCommentToken, 'SpacingBefore', $data ); |
|
234 | 234 | }//end if |
235 | 235 | |
236 | - if ($fix === true) { |
|
237 | - $newComment = '// '.ltrim($tokens[$lastCommentToken]['content'], "/\t "); |
|
238 | - $phpcsFile->fixer->replaceToken($lastCommentToken, $newComment); |
|
236 | + if ( $fix === true ) { |
|
237 | + $newComment = '// ' . ltrim( $tokens[ $lastCommentToken ][ 'content' ], "/\t " ); |
|
238 | + $phpcsFile->fixer->replaceToken( $lastCommentToken, $newComment ); |
|
239 | 239 | } |
240 | 240 | |
241 | - $commentText .= trim(substr($tokens[$lastCommentToken]['content'], 2)); |
|
241 | + $commentText .= trim( substr( $tokens[ $lastCommentToken ][ 'content' ], 2 ) ); |
|
242 | 242 | }//end foreach |
243 | 243 | |
244 | - if ($commentText === '') { |
|
244 | + if ( $commentText === '' ) { |
|
245 | 245 | $error = 'Blank comments are not allowed'; |
246 | - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'Empty'); |
|
247 | - if ($fix === true) { |
|
248 | - $phpcsFile->fixer->replaceToken($stackPtr, ''); |
|
246 | + $fix = $phpcsFile->addFixableError( $error, $stackPtr, 'Empty' ); |
|
247 | + if ( $fix === true ) { |
|
248 | + $phpcsFile->fixer->replaceToken( $stackPtr, '' ); |
|
249 | 249 | } |
250 | 250 | |
251 | - return ($lastCommentToken + 1); |
|
251 | + return ( $lastCommentToken + 1 ); |
|
252 | 252 | } |
253 | 253 | |
254 | - if (preg_match('/^\p{Ll}/u', $commentText) === 1) { |
|
254 | + if ( preg_match( '/^\p{Ll}/u', $commentText ) === 1 ) { |
|
255 | 255 | $error = 'Inline comments must start with a capital letter'; |
256 | - $phpcsFile->addError($error, $stackPtr, 'NotCapital'); |
|
256 | + $phpcsFile->addError( $error, $stackPtr, 'NotCapital' ); |
|
257 | 257 | } |
258 | 258 | |
259 | 259 | // Only check the end of comment character if the start of the comment |
260 | 260 | // is a letter, indicating that the comment is just standard text. |
261 | - if (preg_match('/^\p{L}/u', $commentText) === 1) { |
|
262 | - $commentCloser = $commentText[(strlen($commentText) - 1)]; |
|
261 | + if ( preg_match( '/^\p{L}/u', $commentText ) === 1 ) { |
|
262 | + $commentCloser = $commentText[ ( strlen( $commentText ) - 1 ) ]; |
|
263 | 263 | $acceptedClosers = [ |
264 | 264 | 'full-stops' => '.', |
265 | 265 | 'exclamation marks' => '!', |
266 | 266 | 'or question marks' => '?', |
267 | 267 | ]; |
268 | 268 | |
269 | - if (in_array($commentCloser, $acceptedClosers, true) === false) { |
|
269 | + if ( in_array( $commentCloser, $acceptedClosers, true ) === false ) { |
|
270 | 270 | $error = 'Inline comments must end in %s'; |
271 | 271 | $ender = ''; |
272 | - foreach ($acceptedClosers as $closerName => $symbol) { |
|
273 | - $ender .= ' '.$closerName.','; |
|
272 | + foreach ( $acceptedClosers as $closerName => $symbol ) { |
|
273 | + $ender .= ' ' . $closerName . ','; |
|
274 | 274 | } |
275 | 275 | |
276 | - $ender = trim($ender, ' ,'); |
|
277 | - $data = [$ender]; |
|
278 | - $phpcsFile->addError($error, $lastCommentToken, 'InvalidEndChar', $data); |
|
276 | + $ender = trim( $ender, ' ,' ); |
|
277 | + $data = [ $ender ]; |
|
278 | + $phpcsFile->addError( $error, $lastCommentToken, 'InvalidEndChar', $data ); |
|
279 | 279 | } |
280 | 280 | } |
281 | 281 | |
282 | 282 | // Finally, the line below the last comment cannot be empty if this inline |
283 | 283 | // comment is on a line by itself. |
284 | - if ($tokens[$previousContent]['line'] < $tokens[$stackPtr]['line']) { |
|
285 | - $next = $phpcsFile->findNext(T_WHITESPACE, ($lastCommentToken + 1), null, true); |
|
286 | - if ($next === false) { |
|
284 | + if ( $tokens[ $previousContent ][ 'line' ] < $tokens[ $stackPtr ][ 'line' ] ) { |
|
285 | + $next = $phpcsFile->findNext( T_WHITESPACE, ( $lastCommentToken + 1 ), null, true ); |
|
286 | + if ( $next === false ) { |
|
287 | 287 | // Ignore if the comment is the last non-whitespace token in a file. |
288 | - return ($lastCommentToken + 1); |
|
288 | + return ( $lastCommentToken + 1 ); |
|
289 | 289 | } |
290 | 290 | |
291 | - if ($tokens[$next]['code'] === T_DOC_COMMENT_OPEN_TAG) { |
|
291 | + if ( $tokens[ $next ][ 'code' ] === T_DOC_COMMENT_OPEN_TAG ) { |
|
292 | 292 | // If this inline comment is followed by a docblock, |
293 | 293 | // ignore spacing as docblock/function etc spacing rules |
294 | 294 | // are likely to conflict with our rules. |
295 | - return ($lastCommentToken + 1); |
|
295 | + return ( $lastCommentToken + 1 ); |
|
296 | 296 | } |
297 | 297 | |
298 | 298 | $errorCode = 'SpacingAfter'; |
299 | 299 | |
300 | - if (isset($tokens[$stackPtr]['conditions']) === true) { |
|
301 | - $conditions = $tokens[$stackPtr]['conditions']; |
|
302 | - $type = end($conditions); |
|
303 | - $conditionPtr = key($conditions); |
|
300 | + if ( isset( $tokens[ $stackPtr ][ 'conditions' ] ) === true ) { |
|
301 | + $conditions = $tokens[ $stackPtr ][ 'conditions' ]; |
|
302 | + $type = end( $conditions ); |
|
303 | + $conditionPtr = key( $conditions ); |
|
304 | 304 | |
305 | - if (($type === T_FUNCTION || $type === T_CLOSURE) |
|
306 | - && $tokens[$conditionPtr]['scope_closer'] === $next |
|
305 | + if ( ( $type === T_FUNCTION || $type === T_CLOSURE ) |
|
306 | + && $tokens[ $conditionPtr ][ 'scope_closer' ] === $next |
|
307 | 307 | ) { |
308 | 308 | $errorCode = 'SpacingAfterAtFunctionEnd'; |
309 | 309 | } |
310 | 310 | } |
311 | 311 | |
312 | - for ($i = ($lastCommentToken + 1); $i < $phpcsFile->numTokens; $i++) { |
|
313 | - if ($tokens[$i]['line'] === ($tokens[$lastCommentToken]['line'] + 1)) { |
|
314 | - if ($tokens[$i]['code'] !== T_WHITESPACE) { |
|
315 | - return ($lastCommentToken + 1); |
|
312 | + for ( $i = ( $lastCommentToken + 1 ); $i < $phpcsFile->numTokens; $i++ ) { |
|
313 | + if ( $tokens[ $i ][ 'line' ] === ( $tokens[ $lastCommentToken ][ 'line' ] + 1 ) ) { |
|
314 | + if ( $tokens[ $i ][ 'code' ] !== T_WHITESPACE ) { |
|
315 | + return ( $lastCommentToken + 1 ); |
|
316 | 316 | } |
317 | - } else if ($tokens[$i]['line'] > ($tokens[$lastCommentToken]['line'] + 1)) { |
|
317 | + } else if ( $tokens[ $i ][ 'line' ] > ( $tokens[ $lastCommentToken ][ 'line' ] + 1 ) ) { |
|
318 | 318 | break; |
319 | 319 | } |
320 | 320 | } |
321 | 321 | |
322 | 322 | $error = 'There must be no blank line following an inline comment'; |
323 | - $fix = $phpcsFile->addFixableError($error, $lastCommentToken, $errorCode); |
|
324 | - if ($fix === true) { |
|
323 | + $fix = $phpcsFile->addFixableError( $error, $lastCommentToken, $errorCode ); |
|
324 | + if ( $fix === true ) { |
|
325 | 325 | $phpcsFile->fixer->beginChangeset(); |
326 | - for ($i = ($lastCommentToken + 1); $i < $next; $i++) { |
|
327 | - if ($tokens[$i]['line'] === $tokens[$next]['line']) { |
|
326 | + for ( $i = ( $lastCommentToken + 1 ); $i < $next; $i++ ) { |
|
327 | + if ( $tokens[ $i ][ 'line' ] === $tokens[ $next ][ 'line' ] ) { |
|
328 | 328 | break; |
329 | 329 | } |
330 | 330 | |
331 | - $phpcsFile->fixer->replaceToken($i, ''); |
|
331 | + $phpcsFile->fixer->replaceToken( $i, '' ); |
|
332 | 332 | } |
333 | 333 | |
334 | 334 | $phpcsFile->fixer->endChangeset(); |
335 | 335 | } |
336 | 336 | }//end if |
337 | 337 | |
338 | - return ($lastCommentToken + 1); |
|
338 | + return ( $lastCommentToken + 1 ); |
|
339 | 339 | |
340 | 340 | }//end process() |
341 | 341 |
@@ -13,8 +13,7 @@ discard block |
||
13 | 13 | use PHP_CodeSniffer\Files\File; |
14 | 14 | use PHP_CodeSniffer\Util\Tokens; |
15 | 15 | |
16 | -class InlineCommentSniff implements Sniff |
|
17 | -{ |
|
16 | +class InlineCommentSniff implements Sniff { |
|
18 | 17 | |
19 | 18 | /** |
20 | 19 | * A list of tokenizers this sniff supports. |
@@ -32,8 +31,7 @@ discard block |
||
32 | 31 | * |
33 | 32 | * @return array |
34 | 33 | */ |
35 | - public function register() |
|
36 | - { |
|
34 | + public function register() { |
|
37 | 35 | return [ |
38 | 36 | T_COMMENT, |
39 | 37 | T_DOC_COMMENT_OPEN_TAG, |
@@ -51,8 +49,7 @@ discard block |
||
51 | 49 | * |
52 | 50 | * @return void |
53 | 51 | */ |
54 | - public function process(File $phpcsFile, $stackPtr) |
|
55 | - { |
|
52 | + public function process(File $phpcsFile, $stackPtr) { |
|
56 | 53 | $tokens = $phpcsFile->getTokens(); |
57 | 54 | |
58 | 55 | // If this is a function/class/interface doc block comment, skip it. |
@@ -61,9 +61,6 @@ |
||
61 | 61 | * - three |
62 | 62 | * |
63 | 63 | * @param array &$tokens The array of tokens to process. |
64 | - * @param object $tokenizer The tokenizer being used to |
|
65 | - * process this file. |
|
66 | - * @param string $eolChar The EOL character to use for splitting strings. |
|
67 | 64 | * |
68 | 65 | * @return void |
69 | 66 | */ |
@@ -5,40 +5,40 @@ discard block |
||
5 | 5 | */ |
6 | 6 | class MyClass |
7 | 7 | { |
8 | - /** |
|
9 | - * Some info about the function here. |
|
10 | - * |
|
11 | - *@return void |
|
12 | - */ |
|
13 | - function myFunction() {} |
|
8 | + /** |
|
9 | + * Some info about the function here. |
|
10 | + * |
|
11 | + *@return void |
|
12 | + */ |
|
13 | + function myFunction() {} |
|
14 | 14 | } |
15 | 15 | |
16 | 16 | /** |
17 | - * Some info about the class here |
|
18 | - * |
|
19 | - */ |
|
17 | + * Some info about the class here |
|
18 | + * |
|
19 | + */ |
|
20 | 20 | class MyClass |
21 | 21 | { |
22 | - /** |
|
23 | - *Some info about the function here. |
|
24 | - * |
|
25 | - * @return void |
|
26 | - */ |
|
27 | - function myFunction() {} |
|
22 | + /** |
|
23 | + *Some info about the function here. |
|
24 | + * |
|
25 | + * @return void |
|
26 | + */ |
|
27 | + function myFunction() {} |
|
28 | 28 | } |
29 | 29 | |
30 | 30 | /** |
31 | 31 | * Some info about the class here |
32 | - * |
|
32 | + * |
|
33 | 33 | */ |
34 | 34 | class MyClass |
35 | 35 | { |
36 | - /** |
|
37 | - * Some info about the function here. |
|
38 | - * |
|
39 | - * @return void |
|
40 | - */ |
|
41 | - function myFunction() {} |
|
36 | + /** |
|
37 | + * Some info about the function here. |
|
38 | + * |
|
39 | + * @return void |
|
40 | + */ |
|
41 | + function myFunction() {} |
|
42 | 42 | } |
43 | 43 | |
44 | 44 | /** @var Database $mockedDatabase */ |
@@ -46,10 +46,10 @@ discard block |
||
46 | 46 | |
47 | 47 | function myFunction() |
48 | 48 | { |
49 | - echo 'hi'; |
|
50 | - /** |
|
49 | + echo 'hi'; |
|
50 | + /** |
|
51 | 51 | Comment here. |
52 | - */ |
|
52 | + */ |
|
53 | 53 | } |
54 | 54 | |
55 | 55 | /** |
@@ -71,10 +71,10 @@ discard block |
||
71 | 71 | |
72 | 72 | class MyClass2 |
73 | 73 | { |
74 | - /** |
|
75 | - * Some info about the variable here. |
|
76 | - */ |
|
77 | - var $x; |
|
74 | + /** |
|
75 | + * Some info about the variable here. |
|
76 | + */ |
|
77 | + var $x; |
|
78 | 78 | } |
79 | 79 | |
80 | 80 | /** ************************************************************************ |
@@ -3,8 +3,7 @@ discard block |
||
3 | 3 | * Some info about the class here |
4 | 4 | * |
5 | 5 | */ |
6 | -class MyClass |
|
7 | -{ |
|
6 | +class MyClass { |
|
8 | 7 | /** |
9 | 8 | * Some info about the function here. |
10 | 9 | * |
@@ -17,8 +16,7 @@ discard block |
||
17 | 16 | * Some info about the class here |
18 | 17 | * |
19 | 18 | */ |
20 | -class MyClass |
|
21 | -{ |
|
19 | +class MyClass { |
|
22 | 20 | /** |
23 | 21 | *Some info about the function here. |
24 | 22 | * |
@@ -31,8 +29,7 @@ discard block |
||
31 | 29 | * Some info about the class here |
32 | 30 | * |
33 | 31 | */ |
34 | -class MyClass |
|
35 | -{ |
|
32 | +class MyClass { |
|
36 | 33 | /** |
37 | 34 | * Some info about the function here. |
38 | 35 | * |
@@ -44,8 +41,7 @@ discard block |
||
44 | 41 | /** @var Database $mockedDatabase */ |
45 | 42 | /** @var Container $mockedContainer */ |
46 | 43 | |
47 | -function myFunction() |
|
48 | -{ |
|
44 | +function myFunction() { |
|
49 | 45 | echo 'hi'; |
50 | 46 | /** |
51 | 47 | Comment here. |
@@ -69,8 +65,7 @@ discard block |
||
69 | 65 | */ |
70 | 66 | function myFunction() {} |
71 | 67 | |
72 | -class MyClass2 |
|
73 | -{ |
|
68 | +class MyClass2 { |
|
74 | 69 | /** |
75 | 70 | * Some info about the variable here. |
76 | 71 | */ |
@@ -20,7 +20,7 @@ |
||
20 | 20 | * |
21 | 21 | * @param string $testFile The name of the file being tested. |
22 | 22 | * |
23 | - * @return array |
|
23 | + * @return string[] |
|
24 | 24 | */ |
25 | 25 | public function getCliValues($testFile) |
26 | 26 | { |
@@ -15,61 +15,61 @@ |
||
15 | 15 | { |
16 | 16 | |
17 | 17 | |
18 | - /** |
|
19 | - * Get a list of CLI values to set before the file is tested. |
|
20 | - * |
|
21 | - * @param string $testFile The name of the file being tested. |
|
22 | - * |
|
23 | - * @return array |
|
24 | - */ |
|
25 | - public function getCliValues($testFile) |
|
26 | - { |
|
27 | - return ['--encoding=utf-8']; |
|
18 | + /** |
|
19 | + * Get a list of CLI values to set before the file is tested. |
|
20 | + * |
|
21 | + * @param string $testFile The name of the file being tested. |
|
22 | + * |
|
23 | + * @return array |
|
24 | + */ |
|
25 | + public function getCliValues($testFile) |
|
26 | + { |
|
27 | + return ['--encoding=utf-8']; |
|
28 | 28 | |
29 | - }//end getCliValues() |
|
29 | + }//end getCliValues() |
|
30 | 30 | |
31 | 31 | |
32 | - /** |
|
33 | - * Returns the lines where errors should occur. |
|
34 | - * |
|
35 | - * The key of the array should represent the line number and the value |
|
36 | - * should represent the number of errors that should occur on that line. |
|
37 | - * |
|
38 | - * @return array<int, int> |
|
39 | - */ |
|
40 | - public function getErrorList() |
|
41 | - { |
|
42 | - return [ |
|
43 | - 4 => 1, |
|
44 | - 5 => 1, |
|
45 | - 6 => 1, |
|
46 | - 7 => 1, |
|
47 | - 8 => 1, |
|
48 | - 9 => 1, |
|
49 | - 10 => 1, |
|
50 | - 13 => 1, |
|
51 | - 20 => 1, |
|
52 | - 24 => 4, |
|
53 | - 44 => 1, |
|
54 | - 47 => 1, |
|
55 | - ]; |
|
32 | + /** |
|
33 | + * Returns the lines where errors should occur. |
|
34 | + * |
|
35 | + * The key of the array should represent the line number and the value |
|
36 | + * should represent the number of errors that should occur on that line. |
|
37 | + * |
|
38 | + * @return array<int, int> |
|
39 | + */ |
|
40 | + public function getErrorList() |
|
41 | + { |
|
42 | + return [ |
|
43 | + 4 => 1, |
|
44 | + 5 => 1, |
|
45 | + 6 => 1, |
|
46 | + 7 => 1, |
|
47 | + 8 => 1, |
|
48 | + 9 => 1, |
|
49 | + 10 => 1, |
|
50 | + 13 => 1, |
|
51 | + 20 => 1, |
|
52 | + 24 => 4, |
|
53 | + 44 => 1, |
|
54 | + 47 => 1, |
|
55 | + ]; |
|
56 | 56 | |
57 | - }//end getErrorList() |
|
57 | + }//end getErrorList() |
|
58 | 58 | |
59 | 59 | |
60 | - /** |
|
61 | - * Returns the lines where warnings should occur. |
|
62 | - * |
|
63 | - * The key of the array should represent the line number and the value |
|
64 | - * should represent the number of warnings that should occur on that line. |
|
65 | - * |
|
66 | - * @return array<int, int> |
|
67 | - */ |
|
68 | - public function getWarningList() |
|
69 | - { |
|
70 | - return []; |
|
60 | + /** |
|
61 | + * Returns the lines where warnings should occur. |
|
62 | + * |
|
63 | + * The key of the array should represent the line number and the value |
|
64 | + * should represent the number of warnings that should occur on that line. |
|
65 | + * |
|
66 | + * @return array<int, int> |
|
67 | + */ |
|
68 | + public function getWarningList() |
|
69 | + { |
|
70 | + return []; |
|
71 | 71 | |
72 | - }//end getWarningList() |
|
72 | + }//end getWarningList() |
|
73 | 73 | |
74 | 74 | |
75 | 75 | }//end class |
@@ -22,9 +22,9 @@ discard block |
||
22 | 22 | * |
23 | 23 | * @return array |
24 | 24 | */ |
25 | - public function getCliValues($testFile) |
|
25 | + public function getCliValues( $testFile ) |
|
26 | 26 | { |
27 | - return ['--encoding=utf-8']; |
|
27 | + return [ '--encoding=utf-8' ]; |
|
28 | 28 | |
29 | 29 | }//end getCliValues() |
30 | 30 | |
@@ -67,7 +67,7 @@ discard block |
||
67 | 67 | */ |
68 | 68 | public function getWarningList() |
69 | 69 | { |
70 | - return []; |
|
70 | + return [ ]; |
|
71 | 71 | |
72 | 72 | }//end getWarningList() |
73 | 73 |
@@ -11,8 +11,7 @@ discard block |
||
11 | 11 | |
12 | 12 | use PHP_CodeSniffer\Tests\Standards\AbstractSniffUnitTest; |
13 | 13 | |
14 | -class InlineIfDeclarationUnitTest extends AbstractSniffUnitTest |
|
15 | -{ |
|
14 | +class InlineIfDeclarationUnitTest extends AbstractSniffUnitTest { |
|
16 | 15 | |
17 | 16 | |
18 | 17 | /** |
@@ -22,8 +21,7 @@ discard block |
||
22 | 21 | * |
23 | 22 | * @return array |
24 | 23 | */ |
25 | - public function getCliValues($testFile) |
|
26 | - { |
|
24 | + public function getCliValues($testFile) { |
|
27 | 25 | return ['--encoding=utf-8']; |
28 | 26 | |
29 | 27 | }//end getCliValues() |
@@ -37,8 +35,7 @@ discard block |
||
37 | 35 | * |
38 | 36 | * @return array<int, int> |
39 | 37 | */ |
40 | - public function getErrorList() |
|
41 | - { |
|
38 | + public function getErrorList() { |
|
42 | 39 | return [ |
43 | 40 | 4 => 1, |
44 | 41 | 5 => 1, |
@@ -65,8 +62,7 @@ discard block |
||
65 | 62 | * |
66 | 63 | * @return array<int, int> |
67 | 64 | */ |
68 | - public function getWarningList() |
|
69 | - { |
|
65 | + public function getWarningList() { |
|
70 | 66 | return []; |
71 | 67 | |
72 | 68 | }//end getWarningList() |
@@ -19,9 +19,3 @@ |
||
19 | 19 | $arr = array( |
20 | 20 | 'a' => 'a' |
21 | 21 | <<<<<<< HEAD |
22 | - 'b' => 'b' |
|
23 | -======= |
|
24 | - 'c' => 'c' |
|
25 | ->>>>>>> master |
|
26 | - ); |
|
27 | - } |
@@ -15,13 +15,7 @@ |
||
15 | 15 | // This is not a merge conflict - it is a valid test case. |
16 | 16 | // Please do not remove. |
17 | 17 | function test() |
18 | - { |
|
19 | - $arr = array( |
|
20 | - 'a' => 'a' |
|
18 | + { |
|
19 | + $arr = array( |
|
20 | + 'a' => 'a' |
|
21 | 21 | <<<<<<< HEAD |
22 | - 'b' => 'b' |
|
23 | -======= |
|
24 | - 'c' => 'c' |
|
25 | ->>>>>>> master |
|
26 | - ); |
|
27 | - } |
@@ -19,9 +19,3 @@ |
||
19 | 19 | $arr = array( |
20 | 20 | 'a' => 'a' |
21 | 21 | <<<<<<< HEAD |
22 | - 'b' => 'b' |
|
23 | -======= |
|
24 | - 'c' => 'c' |
|
25 | ->>>>>>> master |
|
26 | - ); |
|
27 | - } |
@@ -18,10 +18,4 @@ |
||
18 | 18 | { |
19 | 19 | $arr = array( |
20 | 20 | 'a' => 'a' |
21 | -<<<<<<< HEAD |
|
22 | - 'b' => 'b' |
|
23 | -======= |
|
24 | - 'c' => 'c' |
|
25 | ->>>>>>> master |
|
26 | - ); |
|
27 | - } |
|
21 | +<< << <<< HEAD |
@@ -14,14 +14,7 @@ |
||
14 | 14 | // The following function has a simulated git conflict for testing. |
15 | 15 | // This is not a merge conflict - it is a valid test case. |
16 | 16 | // Please do not remove. |
17 | -function test() |
|
18 | - { |
|
17 | +function test() { |
|
19 | 18 | $arr = array( |
20 | 19 | 'a' => 'a' |
21 | 20 | <<<<<<< HEAD |
22 | - 'b' => 'b' |
|
23 | -======= |
|
24 | - 'c' => 'c' |
|
25 | ->>>>>>> master |
|
26 | - ); |
|
27 | - } |
@@ -3,13 +3,13 @@ discard block |
||
3 | 3 | Example of string |
4 | 4 | spanning multiple lines |
5 | 5 | using heredoc syntax. |
6 | -EOD; |
|
6 | +eod; |
|
7 | 7 | |
8 | 8 | echo <<<'EOT' |
9 | 9 | My name is "$name". I am printing some $foo->foo. |
10 | 10 | Now, I am printing some {$foo->bar[1]}. |
11 | 11 | This should not print a capital 'A': \x41 |
12 | -EOT; |
|
12 | +eot; |
|
13 | 13 | |
14 | 14 | // The following function has a simulated git conflict for testing. |
15 | 15 | // This is not a merge conflict - it is a valid test case. |
@@ -19,9 +19,3 @@ discard block |
||
19 | 19 | $arr = array( |
20 | 20 | 'a' => 'a' |
21 | 21 | <<<<<<< HEAD |
22 | - 'b' => 'b' |
|
23 | -======= |
|
24 | - 'c' => 'c' |
|
25 | ->>>>>>> master |
|
26 | - ); |
|
27 | - } |
@@ -78,6 +78,7 @@ |
||
78 | 78 | * @param string $content The content to tokenize, |
79 | 79 | * @param \PHP_CodeSniffer\Config | null $config The config data for the run. |
80 | 80 | * @param string $eolChar The EOL char used in the content. |
81 | + * @param null|\PHP_CodeSniffer\Config $config |
|
81 | 82 | * |
82 | 83 | * @return void |
83 | 84 | * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. |
@@ -15,1632 +15,1632 @@ |
||
15 | 15 | abstract class Tokenizer |
16 | 16 | { |
17 | 17 | |
18 | - /** |
|
19 | - * The config data for the run. |
|
20 | - * |
|
21 | - * @var \PHP_CodeSniffer\Config |
|
22 | - */ |
|
23 | - protected $config = null; |
|
24 | - |
|
25 | - /** |
|
26 | - * The EOL char used in the content. |
|
27 | - * |
|
28 | - * @var string |
|
29 | - */ |
|
30 | - protected $eolChar = []; |
|
31 | - |
|
32 | - /** |
|
33 | - * A token-based representation of the content. |
|
34 | - * |
|
35 | - * @var array |
|
36 | - */ |
|
37 | - protected $tokens = []; |
|
38 | - |
|
39 | - /** |
|
40 | - * The number of tokens in the tokens array. |
|
41 | - * |
|
42 | - * @var integer |
|
43 | - */ |
|
44 | - protected $numTokens = 0; |
|
45 | - |
|
46 | - /** |
|
47 | - * A list of tokens that are allowed to open a scope. |
|
48 | - * |
|
49 | - * @var array |
|
50 | - */ |
|
51 | - public $scopeOpeners = []; |
|
52 | - |
|
53 | - /** |
|
54 | - * A list of tokens that end the scope. |
|
55 | - * |
|
56 | - * @var array |
|
57 | - */ |
|
58 | - public $endScopeTokens = []; |
|
59 | - |
|
60 | - /** |
|
61 | - * Known lengths of tokens. |
|
62 | - * |
|
63 | - * @var array<int, int> |
|
64 | - */ |
|
65 | - public $knownLengths = []; |
|
66 | - |
|
67 | - /** |
|
68 | - * A list of lines being ignored due to error suppression comments. |
|
69 | - * |
|
70 | - * @var array |
|
71 | - */ |
|
72 | - public $ignoredLines = []; |
|
73 | - |
|
74 | - |
|
75 | - /** |
|
76 | - * Initialise and run the tokenizer. |
|
77 | - * |
|
78 | - * @param string $content The content to tokenize, |
|
79 | - * @param \PHP_CodeSniffer\Config | null $config The config data for the run. |
|
80 | - * @param string $eolChar The EOL char used in the content. |
|
81 | - * |
|
82 | - * @return void |
|
83 | - * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. |
|
84 | - */ |
|
85 | - public function __construct($content, $config, $eolChar='\n') |
|
86 | - { |
|
87 | - $this->eolChar = $eolChar; |
|
88 | - |
|
89 | - $this->config = $config; |
|
90 | - $this->tokens = $this->tokenize($content); |
|
91 | - |
|
92 | - if ($config === null) { |
|
93 | - return; |
|
94 | - } |
|
95 | - |
|
96 | - $this->createPositionMap(); |
|
97 | - $this->createTokenMap(); |
|
98 | - $this->createParenthesisNestingMap(); |
|
99 | - $this->createScopeMap(); |
|
100 | - $this->createLevelMap(); |
|
101 | - |
|
102 | - // Allow the tokenizer to do additional processing if required. |
|
103 | - $this->processAdditional(); |
|
104 | - |
|
105 | - }//end __construct() |
|
106 | - |
|
107 | - |
|
108 | - /** |
|
109 | - * Checks the content to see if it looks minified. |
|
110 | - * |
|
111 | - * @param string $content The content to tokenize. |
|
112 | - * @param string $eolChar The EOL char used in the content. |
|
113 | - * |
|
114 | - * @return boolean |
|
115 | - */ |
|
116 | - protected function isMinifiedContent($content, $eolChar='\n') |
|
117 | - { |
|
118 | - // Minified files often have a very large number of characters per line |
|
119 | - // and cause issues when tokenizing. |
|
120 | - $numChars = strlen($content); |
|
121 | - $numLines = (substr_count($content, $eolChar) + 1); |
|
122 | - $average = ($numChars / $numLines); |
|
123 | - if ($average > 100) { |
|
124 | - return true; |
|
125 | - } |
|
126 | - |
|
127 | - return false; |
|
128 | - |
|
129 | - }//end isMinifiedContent() |
|
130 | - |
|
131 | - |
|
132 | - /** |
|
133 | - * Gets the array of tokens. |
|
134 | - * |
|
135 | - * @return array |
|
136 | - */ |
|
137 | - public function getTokens() |
|
138 | - { |
|
139 | - return $this->tokens; |
|
140 | - |
|
141 | - }//end getTokens() |
|
142 | - |
|
143 | - |
|
144 | - /** |
|
145 | - * Creates an array of tokens when given some content. |
|
146 | - * |
|
147 | - * @param string $string The string to tokenize. |
|
148 | - * |
|
149 | - * @return array |
|
150 | - */ |
|
151 | - abstract protected function tokenize($string); |
|
152 | - |
|
153 | - |
|
154 | - /** |
|
155 | - * Performs additional processing after main tokenizing. |
|
156 | - * |
|
157 | - * @return void |
|
158 | - */ |
|
159 | - abstract protected function processAdditional(); |
|
160 | - |
|
161 | - |
|
162 | - /** |
|
163 | - * Sets token position information. |
|
164 | - * |
|
165 | - * Can also convert tabs into spaces. Each tab can represent between |
|
166 | - * 1 and $width spaces, so this cannot be a straight string replace. |
|
167 | - * |
|
168 | - * @return void |
|
169 | - */ |
|
170 | - private function createPositionMap() |
|
171 | - { |
|
172 | - $currColumn = 1; |
|
173 | - $lineNumber = 1; |
|
174 | - $eolLen = strlen($this->eolChar); |
|
175 | - $ignoring = null; |
|
176 | - $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); |
|
177 | - |
|
178 | - $checkEncoding = false; |
|
179 | - if (function_exists('iconv_strlen') === true) { |
|
180 | - $checkEncoding = true; |
|
181 | - } |
|
182 | - |
|
183 | - $checkAnnotations = $this->config->annotations; |
|
184 | - $encoding = $this->config->encoding; |
|
185 | - $tabWidth = $this->config->tabWidth; |
|
186 | - |
|
187 | - $tokensWithTabs = [ |
|
188 | - T_WHITESPACE => true, |
|
189 | - T_COMMENT => true, |
|
190 | - T_DOC_COMMENT => true, |
|
191 | - T_DOC_COMMENT_WHITESPACE => true, |
|
192 | - T_DOC_COMMENT_STRING => true, |
|
193 | - T_CONSTANT_ENCAPSED_STRING => true, |
|
194 | - T_DOUBLE_QUOTED_STRING => true, |
|
195 | - T_HEREDOC => true, |
|
196 | - T_NOWDOC => true, |
|
197 | - T_INLINE_HTML => true, |
|
198 | - ]; |
|
199 | - |
|
200 | - $this->numTokens = count($this->tokens); |
|
201 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
202 | - $this->tokens[$i]['line'] = $lineNumber; |
|
203 | - $this->tokens[$i]['column'] = $currColumn; |
|
204 | - |
|
205 | - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === true) { |
|
206 | - // There are no tabs in the tokens we know the length of. |
|
207 | - $length = $this->knownLengths[$this->tokens[$i]['code']]; |
|
208 | - $currColumn += $length; |
|
209 | - } else if ($tabWidth === 0 |
|
210 | - || isset($tokensWithTabs[$this->tokens[$i]['code']]) === false |
|
211 | - || strpos($this->tokens[$i]['content'], "\t") === false |
|
212 | - ) { |
|
213 | - // There are no tabs in this content, or we aren't replacing them. |
|
214 | - if ($checkEncoding === true) { |
|
215 | - // Not using the default encoding, so take a bit more care. |
|
216 | - $oldLevel = error_reporting(); |
|
217 | - error_reporting(0); |
|
218 | - $length = iconv_strlen($this->tokens[$i]['content'], $encoding); |
|
219 | - error_reporting($oldLevel); |
|
220 | - |
|
221 | - if ($length === false) { |
|
222 | - // String contained invalid characters, so revert to default. |
|
223 | - $length = strlen($this->tokens[$i]['content']); |
|
224 | - } |
|
225 | - } else { |
|
226 | - $length = strlen($this->tokens[$i]['content']); |
|
227 | - } |
|
228 | - |
|
229 | - $currColumn += $length; |
|
230 | - } else { |
|
231 | - $this->replaceTabsInToken($this->tokens[$i]); |
|
232 | - $length = $this->tokens[$i]['length']; |
|
233 | - $currColumn += $length; |
|
234 | - }//end if |
|
235 | - |
|
236 | - $this->tokens[$i]['length'] = $length; |
|
237 | - |
|
238 | - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === false |
|
239 | - && strpos($this->tokens[$i]['content'], $this->eolChar) !== false |
|
240 | - ) { |
|
241 | - $lineNumber++; |
|
242 | - $currColumn = 1; |
|
243 | - |
|
244 | - // Newline chars are not counted in the token length. |
|
245 | - $this->tokens[$i]['length'] -= $eolLen; |
|
246 | - } |
|
247 | - |
|
248 | - if ($this->tokens[$i]['code'] === T_COMMENT |
|
249 | - || $this->tokens[$i]['code'] === T_DOC_COMMENT_STRING |
|
250 | - || $this->tokens[$i]['code'] === T_DOC_COMMENT_TAG |
|
251 | - || ($inTests === true && $this->tokens[$i]['code'] === T_INLINE_HTML) |
|
252 | - ) { |
|
253 | - $commentText = ltrim($this->tokens[$i]['content'], " \t/*"); |
|
254 | - $commentText = rtrim($commentText, " */\t\r\n"); |
|
255 | - $commentTextLower = strtolower($commentText); |
|
256 | - if (strpos($commentText, '@codingStandards') !== false) { |
|
257 | - // If this comment is the only thing on the line, it tells us |
|
258 | - // to ignore the following line. If the line contains other content |
|
259 | - // then we are just ignoring this one single line. |
|
260 | - $ownLine = false; |
|
261 | - if ($i > 0) { |
|
262 | - for ($prev = ($i - 1); $prev >= 0; $prev--) { |
|
263 | - if ($this->tokens[$prev]['code'] === T_WHITESPACE) { |
|
264 | - continue; |
|
265 | - } |
|
266 | - |
|
267 | - break; |
|
268 | - } |
|
269 | - |
|
270 | - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { |
|
271 | - $ownLine = true; |
|
272 | - } |
|
273 | - } |
|
274 | - |
|
275 | - if ($ignoring === null |
|
276 | - && strpos($commentText, '@codingStandardsIgnoreStart') !== false |
|
277 | - ) { |
|
278 | - $ignoring = ['.all' => true]; |
|
279 | - if ($ownLine === true) { |
|
280 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
281 | - } |
|
282 | - } else if ($ignoring !== null |
|
283 | - && strpos($commentText, '@codingStandardsIgnoreEnd') !== false |
|
284 | - ) { |
|
285 | - if ($ownLine === true) { |
|
286 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
287 | - } else { |
|
288 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
289 | - } |
|
290 | - |
|
291 | - $ignoring = null; |
|
292 | - } else if ($ignoring === null |
|
293 | - && strpos($commentText, '@codingStandardsIgnoreLine') !== false |
|
294 | - ) { |
|
295 | - $ignoring = ['.all' => true]; |
|
296 | - if ($ownLine === true) { |
|
297 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
298 | - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoring; |
|
299 | - } else { |
|
300 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
301 | - } |
|
302 | - |
|
303 | - $ignoring = null; |
|
304 | - }//end if |
|
305 | - } else if (substr($commentTextLower, 0, 6) === 'phpcs:' |
|
306 | - || substr($commentTextLower, 0, 7) === '@phpcs:' |
|
307 | - ) { |
|
308 | - // If the @phpcs: syntax is being used, strip the @ to make |
|
309 | - // comparisons easier. |
|
310 | - if ($commentText[0] === '@') { |
|
311 | - $commentText = substr($commentText, 1); |
|
312 | - $commentTextLower = strtolower($commentText); |
|
313 | - } |
|
314 | - |
|
315 | - // If there is a comment on the end, strip it off. |
|
316 | - $commentStart = strpos($commentTextLower, ' --'); |
|
317 | - if ($commentStart !== false) { |
|
318 | - $commentText = substr($commentText, 0, $commentStart); |
|
319 | - $commentTextLower = strtolower($commentText); |
|
320 | - } |
|
321 | - |
|
322 | - // If this comment is the only thing on the line, it tells us |
|
323 | - // to ignore the following line. If the line contains other content |
|
324 | - // then we are just ignoring this one single line. |
|
325 | - $lineHasOtherContent = false; |
|
326 | - $lineHasOtherTokens = false; |
|
327 | - if ($i > 0) { |
|
328 | - for ($prev = ($i - 1); $prev > 0; $prev--) { |
|
329 | - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { |
|
330 | - // Changed lines. |
|
331 | - break; |
|
332 | - } |
|
333 | - |
|
334 | - if ($this->tokens[$prev]['code'] === T_WHITESPACE |
|
335 | - || ($this->tokens[$prev]['code'] === T_INLINE_HTML |
|
336 | - && trim($this->tokens[$prev]['content']) === '') |
|
337 | - ) { |
|
338 | - continue; |
|
339 | - } |
|
340 | - |
|
341 | - $lineHasOtherTokens = true; |
|
342 | - |
|
343 | - if ($this->tokens[$prev]['code'] === T_OPEN_TAG) { |
|
344 | - continue; |
|
345 | - } |
|
346 | - |
|
347 | - $lineHasOtherContent = true; |
|
348 | - break; |
|
349 | - }//end for |
|
350 | - |
|
351 | - $changedLines = false; |
|
352 | - for ($next = $i; $next < $this->numTokens; $next++) { |
|
353 | - if ($changedLines === true) { |
|
354 | - // Changed lines. |
|
355 | - break; |
|
356 | - } |
|
357 | - |
|
358 | - if (isset($this->knownLengths[$this->tokens[$next]['code']]) === false |
|
359 | - && strpos($this->tokens[$next]['content'], $this->eolChar) !== false |
|
360 | - ) { |
|
361 | - // Last token on the current line. |
|
362 | - $changedLines = true; |
|
363 | - } |
|
364 | - |
|
365 | - if ($next === $i) { |
|
366 | - continue; |
|
367 | - } |
|
368 | - |
|
369 | - if ($this->tokens[$next]['code'] === T_WHITESPACE |
|
370 | - || ($this->tokens[$next]['code'] === T_INLINE_HTML |
|
371 | - && trim($this->tokens[$next]['content']) === '') |
|
372 | - ) { |
|
373 | - continue; |
|
374 | - } |
|
375 | - |
|
376 | - $lineHasOtherTokens = true; |
|
377 | - |
|
378 | - if ($this->tokens[$next]['code'] === T_CLOSE_TAG) { |
|
379 | - continue; |
|
380 | - } |
|
381 | - |
|
382 | - $lineHasOtherContent = true; |
|
383 | - break; |
|
384 | - }//end for |
|
385 | - }//end if |
|
386 | - |
|
387 | - if (substr($commentTextLower, 0, 9) === 'phpcs:set') { |
|
388 | - // Ignore standards for complete lines that change sniff settings. |
|
389 | - if ($lineHasOtherTokens === false) { |
|
390 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
391 | - } |
|
392 | - |
|
393 | - // Need to maintain case here, to get the correct sniff code. |
|
394 | - $parts = explode(' ', substr($commentText, 10)); |
|
395 | - if (count($parts) >= 2) { |
|
396 | - $sniffParts = explode('.', $parts[0]); |
|
397 | - if (count($sniffParts) >= 3) { |
|
398 | - $this->tokens[$i]['sniffCode'] = array_shift($parts); |
|
399 | - $this->tokens[$i]['sniffProperty'] = array_shift($parts); |
|
400 | - $this->tokens[$i]['sniffPropertyValue'] = rtrim(implode(' ', $parts), " */\r\n"); |
|
401 | - } |
|
402 | - } |
|
403 | - |
|
404 | - $this->tokens[$i]['code'] = T_PHPCS_SET; |
|
405 | - $this->tokens[$i]['type'] = 'T_PHPCS_SET'; |
|
406 | - } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile') { |
|
407 | - // The whole file will be ignored, but at least set the correct token. |
|
408 | - $this->tokens[$i]['code'] = T_PHPCS_IGNORE_FILE; |
|
409 | - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE_FILE'; |
|
410 | - } else if (substr($commentTextLower, 0, 13) === 'phpcs:disable') { |
|
411 | - if ($lineHasOtherContent === false) { |
|
412 | - // Completely ignore the comment line. |
|
413 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
414 | - } |
|
415 | - |
|
416 | - if ($ignoring === null) { |
|
417 | - $ignoring = []; |
|
418 | - } |
|
419 | - |
|
420 | - $disabledSniffs = []; |
|
421 | - |
|
422 | - $additionalText = substr($commentText, 14); |
|
423 | - if ($additionalText === false) { |
|
424 | - $ignoring = ['.all' => true]; |
|
425 | - } else { |
|
426 | - $parts = explode(',', substr($commentText, 13)); |
|
427 | - foreach ($parts as $sniffCode) { |
|
428 | - $sniffCode = trim($sniffCode); |
|
429 | - $disabledSniffs[$sniffCode] = true; |
|
430 | - $ignoring[$sniffCode] = true; |
|
431 | - |
|
432 | - // This newly disabled sniff might be disabling an existing |
|
433 | - // enabled exception that we are tracking. |
|
434 | - if (isset($ignoring['.except']) === true) { |
|
435 | - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { |
|
436 | - if ($ignoredSniffCode === $sniffCode |
|
437 | - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
438 | - ) { |
|
439 | - unset($ignoring['.except'][$ignoredSniffCode]); |
|
440 | - } |
|
441 | - } |
|
442 | - |
|
443 | - if (empty($ignoring['.except']) === true) { |
|
444 | - unset($ignoring['.except']); |
|
445 | - } |
|
446 | - } |
|
447 | - }//end foreach |
|
448 | - }//end if |
|
449 | - |
|
450 | - $this->tokens[$i]['code'] = T_PHPCS_DISABLE; |
|
451 | - $this->tokens[$i]['type'] = 'T_PHPCS_DISABLE'; |
|
452 | - $this->tokens[$i]['sniffCodes'] = $disabledSniffs; |
|
453 | - } else if (substr($commentTextLower, 0, 12) === 'phpcs:enable') { |
|
454 | - if ($ignoring !== null) { |
|
455 | - $enabledSniffs = []; |
|
456 | - |
|
457 | - $additionalText = substr($commentText, 13); |
|
458 | - if ($additionalText === false) { |
|
459 | - $ignoring = null; |
|
460 | - } else { |
|
461 | - $parts = explode(',', substr($commentText, 13)); |
|
462 | - foreach ($parts as $sniffCode) { |
|
463 | - $sniffCode = trim($sniffCode); |
|
464 | - $enabledSniffs[$sniffCode] = true; |
|
465 | - |
|
466 | - // This new enabled sniff might remove previously disabled |
|
467 | - // sniffs if it is actually a standard or category of sniffs. |
|
468 | - foreach (array_keys($ignoring) as $ignoredSniffCode) { |
|
469 | - if ($ignoredSniffCode === $sniffCode |
|
470 | - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
471 | - ) { |
|
472 | - unset($ignoring[$ignoredSniffCode]); |
|
473 | - } |
|
474 | - } |
|
475 | - |
|
476 | - // This new enabled sniff might be able to clear up |
|
477 | - // previously enabled sniffs if it is actually a standard or |
|
478 | - // category of sniffs. |
|
479 | - if (isset($ignoring['.except']) === true) { |
|
480 | - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { |
|
481 | - if ($ignoredSniffCode === $sniffCode |
|
482 | - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
483 | - ) { |
|
484 | - unset($ignoring['.except'][$ignoredSniffCode]); |
|
485 | - } |
|
486 | - } |
|
487 | - } |
|
488 | - }//end foreach |
|
489 | - |
|
490 | - if (empty($ignoring) === true) { |
|
491 | - $ignoring = null; |
|
492 | - } else { |
|
493 | - if (isset($ignoring['.except']) === true) { |
|
494 | - $ignoring['.except'] += $enabledSniffs; |
|
495 | - } else { |
|
496 | - $ignoring['.except'] = $enabledSniffs; |
|
497 | - } |
|
498 | - } |
|
499 | - }//end if |
|
500 | - |
|
501 | - if ($lineHasOtherContent === false) { |
|
502 | - // Completely ignore the comment line. |
|
503 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
504 | - } else { |
|
505 | - // The comment is on the same line as the code it is ignoring, |
|
506 | - // so respect the new ignore rules. |
|
507 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
508 | - } |
|
509 | - |
|
510 | - $this->tokens[$i]['sniffCodes'] = $enabledSniffs; |
|
511 | - }//end if |
|
512 | - |
|
513 | - $this->tokens[$i]['code'] = T_PHPCS_ENABLE; |
|
514 | - $this->tokens[$i]['type'] = 'T_PHPCS_ENABLE'; |
|
515 | - } else if (substr($commentTextLower, 0, 12) === 'phpcs:ignore') { |
|
516 | - $ignoreRules = []; |
|
517 | - |
|
518 | - $additionalText = substr($commentText, 13); |
|
519 | - if ($additionalText === false) { |
|
520 | - $ignoreRules = ['.all' => true]; |
|
521 | - } else { |
|
522 | - $parts = explode(',', substr($commentText, 13)); |
|
523 | - foreach ($parts as $sniffCode) { |
|
524 | - $ignoreRules[trim($sniffCode)] = true; |
|
525 | - } |
|
526 | - } |
|
527 | - |
|
528 | - $this->tokens[$i]['code'] = T_PHPCS_IGNORE; |
|
529 | - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE'; |
|
530 | - $this->tokens[$i]['sniffCodes'] = $ignoreRules; |
|
531 | - |
|
532 | - if ($ignoring !== null) { |
|
533 | - $ignoreRules += $ignoring; |
|
534 | - } |
|
535 | - |
|
536 | - if ($lineHasOtherContent === false) { |
|
537 | - // Completely ignore the comment line, and set the following |
|
538 | - // line to include the ignore rules we've set. |
|
539 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
540 | - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoreRules; |
|
541 | - } else { |
|
542 | - // The comment is on the same line as the code it is ignoring, |
|
543 | - // so respect the ignore rules it set. |
|
544 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoreRules; |
|
545 | - } |
|
546 | - }//end if |
|
547 | - }//end if |
|
548 | - }//end if |
|
549 | - |
|
550 | - if ($ignoring !== null && isset($this->ignoredLines[$this->tokens[$i]['line']]) === false) { |
|
551 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
552 | - } |
|
553 | - }//end for |
|
554 | - |
|
555 | - // If annotations are being ignored, we clear out all the ignore rules |
|
556 | - // but leave the annotations tokenized as normal. |
|
557 | - if ($checkAnnotations === false) { |
|
558 | - $this->ignoredLines = []; |
|
559 | - } |
|
560 | - |
|
561 | - }//end createPositionMap() |
|
562 | - |
|
563 | - |
|
564 | - /** |
|
565 | - * Replaces tabs in original token content with spaces. |
|
566 | - * |
|
567 | - * Each tab can represent between 1 and $config->tabWidth spaces, |
|
568 | - * so this cannot be a straight string replace. The original content |
|
569 | - * is placed into an orig_content index and the new token length is also |
|
570 | - * set in the length index. |
|
571 | - * |
|
572 | - * @param array $token The token to replace tabs inside. |
|
573 | - * @param string $prefix The character to use to represent the start of a tab. |
|
574 | - * @param string $padding The character to use to represent the end of a tab. |
|
575 | - * @param int $tabWidth The number of spaces each tab represents. |
|
576 | - * |
|
577 | - * @return void |
|
578 | - */ |
|
579 | - public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) |
|
580 | - { |
|
581 | - $checkEncoding = false; |
|
582 | - if (function_exists('iconv_strlen') === true) { |
|
583 | - $checkEncoding = true; |
|
584 | - } |
|
585 | - |
|
586 | - $currColumn = $token['column']; |
|
587 | - if ($tabWidth === null) { |
|
588 | - $tabWidth = $this->config->tabWidth; |
|
589 | - if ($tabWidth === 0) { |
|
590 | - $tabWidth = 1; |
|
591 | - } |
|
592 | - } |
|
593 | - |
|
594 | - if (rtrim($token['content'], "\t") === '') { |
|
595 | - // String only contains tabs, so we can shortcut the process. |
|
596 | - $numTabs = strlen($token['content']); |
|
597 | - |
|
598 | - $firstTabSize = ($tabWidth - (($currColumn - 1) % $tabWidth)); |
|
599 | - $length = ($firstTabSize + ($tabWidth * ($numTabs - 1))); |
|
600 | - $newContent = $prefix.str_repeat($padding, ($length - 1)); |
|
601 | - } else { |
|
602 | - // We need to determine the length of each tab. |
|
603 | - $tabs = explode("\t", $token['content']); |
|
604 | - |
|
605 | - $numTabs = (count($tabs) - 1); |
|
606 | - $tabNum = 0; |
|
607 | - $newContent = ''; |
|
608 | - $length = 0; |
|
609 | - |
|
610 | - foreach ($tabs as $content) { |
|
611 | - if ($content !== '') { |
|
612 | - $newContent .= $content; |
|
613 | - if ($checkEncoding === true) { |
|
614 | - // Not using the default encoding, so take a bit more care. |
|
615 | - $oldLevel = error_reporting(); |
|
616 | - error_reporting(0); |
|
617 | - $contentLength = iconv_strlen($content, $this->config->encoding); |
|
618 | - error_reporting($oldLevel); |
|
619 | - if ($contentLength === false) { |
|
620 | - // String contained invalid characters, so revert to default. |
|
621 | - $contentLength = strlen($content); |
|
622 | - } |
|
623 | - } else { |
|
624 | - $contentLength = strlen($content); |
|
625 | - } |
|
626 | - |
|
627 | - $currColumn += $contentLength; |
|
628 | - $length += $contentLength; |
|
629 | - } |
|
630 | - |
|
631 | - // The last piece of content does not have a tab after it. |
|
632 | - if ($tabNum === $numTabs) { |
|
633 | - break; |
|
634 | - } |
|
635 | - |
|
636 | - // Process the tab that comes after the content. |
|
637 | - $lastCurrColumn = $currColumn; |
|
638 | - $tabNum++; |
|
639 | - |
|
640 | - // Move the pointer to the next tab stop. |
|
641 | - if (($currColumn % $tabWidth) === 0) { |
|
642 | - // This is the first tab, and we are already at a |
|
643 | - // tab stop, so this tab counts as a single space. |
|
644 | - $currColumn++; |
|
645 | - } else { |
|
646 | - $currColumn++; |
|
647 | - while (($currColumn % $tabWidth) !== 0) { |
|
648 | - $currColumn++; |
|
649 | - } |
|
650 | - |
|
651 | - $currColumn++; |
|
652 | - } |
|
653 | - |
|
654 | - $length += ($currColumn - $lastCurrColumn); |
|
655 | - $newContent .= $prefix.str_repeat($padding, ($currColumn - $lastCurrColumn - 1)); |
|
656 | - }//end foreach |
|
657 | - }//end if |
|
658 | - |
|
659 | - $token['orig_content'] = $token['content']; |
|
660 | - $token['content'] = $newContent; |
|
661 | - $token['length'] = $length; |
|
662 | - |
|
663 | - }//end replaceTabsInToken() |
|
664 | - |
|
665 | - |
|
666 | - /** |
|
667 | - * Creates a map of brackets positions. |
|
668 | - * |
|
669 | - * @return void |
|
670 | - */ |
|
671 | - private function createTokenMap() |
|
672 | - { |
|
673 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
674 | - echo "\t*** START TOKEN MAP ***".PHP_EOL; |
|
675 | - } |
|
676 | - |
|
677 | - $squareOpeners = []; |
|
678 | - $curlyOpeners = []; |
|
679 | - $this->numTokens = count($this->tokens); |
|
680 | - |
|
681 | - $openers = []; |
|
682 | - $openOwner = null; |
|
683 | - |
|
684 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
685 | - /* |
|
18 | + /** |
|
19 | + * The config data for the run. |
|
20 | + * |
|
21 | + * @var \PHP_CodeSniffer\Config |
|
22 | + */ |
|
23 | + protected $config = null; |
|
24 | + |
|
25 | + /** |
|
26 | + * The EOL char used in the content. |
|
27 | + * |
|
28 | + * @var string |
|
29 | + */ |
|
30 | + protected $eolChar = []; |
|
31 | + |
|
32 | + /** |
|
33 | + * A token-based representation of the content. |
|
34 | + * |
|
35 | + * @var array |
|
36 | + */ |
|
37 | + protected $tokens = []; |
|
38 | + |
|
39 | + /** |
|
40 | + * The number of tokens in the tokens array. |
|
41 | + * |
|
42 | + * @var integer |
|
43 | + */ |
|
44 | + protected $numTokens = 0; |
|
45 | + |
|
46 | + /** |
|
47 | + * A list of tokens that are allowed to open a scope. |
|
48 | + * |
|
49 | + * @var array |
|
50 | + */ |
|
51 | + public $scopeOpeners = []; |
|
52 | + |
|
53 | + /** |
|
54 | + * A list of tokens that end the scope. |
|
55 | + * |
|
56 | + * @var array |
|
57 | + */ |
|
58 | + public $endScopeTokens = []; |
|
59 | + |
|
60 | + /** |
|
61 | + * Known lengths of tokens. |
|
62 | + * |
|
63 | + * @var array<int, int> |
|
64 | + */ |
|
65 | + public $knownLengths = []; |
|
66 | + |
|
67 | + /** |
|
68 | + * A list of lines being ignored due to error suppression comments. |
|
69 | + * |
|
70 | + * @var array |
|
71 | + */ |
|
72 | + public $ignoredLines = []; |
|
73 | + |
|
74 | + |
|
75 | + /** |
|
76 | + * Initialise and run the tokenizer. |
|
77 | + * |
|
78 | + * @param string $content The content to tokenize, |
|
79 | + * @param \PHP_CodeSniffer\Config | null $config The config data for the run. |
|
80 | + * @param string $eolChar The EOL char used in the content. |
|
81 | + * |
|
82 | + * @return void |
|
83 | + * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. |
|
84 | + */ |
|
85 | + public function __construct($content, $config, $eolChar='\n') |
|
86 | + { |
|
87 | + $this->eolChar = $eolChar; |
|
88 | + |
|
89 | + $this->config = $config; |
|
90 | + $this->tokens = $this->tokenize($content); |
|
91 | + |
|
92 | + if ($config === null) { |
|
93 | + return; |
|
94 | + } |
|
95 | + |
|
96 | + $this->createPositionMap(); |
|
97 | + $this->createTokenMap(); |
|
98 | + $this->createParenthesisNestingMap(); |
|
99 | + $this->createScopeMap(); |
|
100 | + $this->createLevelMap(); |
|
101 | + |
|
102 | + // Allow the tokenizer to do additional processing if required. |
|
103 | + $this->processAdditional(); |
|
104 | + |
|
105 | + }//end __construct() |
|
106 | + |
|
107 | + |
|
108 | + /** |
|
109 | + * Checks the content to see if it looks minified. |
|
110 | + * |
|
111 | + * @param string $content The content to tokenize. |
|
112 | + * @param string $eolChar The EOL char used in the content. |
|
113 | + * |
|
114 | + * @return boolean |
|
115 | + */ |
|
116 | + protected function isMinifiedContent($content, $eolChar='\n') |
|
117 | + { |
|
118 | + // Minified files often have a very large number of characters per line |
|
119 | + // and cause issues when tokenizing. |
|
120 | + $numChars = strlen($content); |
|
121 | + $numLines = (substr_count($content, $eolChar) + 1); |
|
122 | + $average = ($numChars / $numLines); |
|
123 | + if ($average > 100) { |
|
124 | + return true; |
|
125 | + } |
|
126 | + |
|
127 | + return false; |
|
128 | + |
|
129 | + }//end isMinifiedContent() |
|
130 | + |
|
131 | + |
|
132 | + /** |
|
133 | + * Gets the array of tokens. |
|
134 | + * |
|
135 | + * @return array |
|
136 | + */ |
|
137 | + public function getTokens() |
|
138 | + { |
|
139 | + return $this->tokens; |
|
140 | + |
|
141 | + }//end getTokens() |
|
142 | + |
|
143 | + |
|
144 | + /** |
|
145 | + * Creates an array of tokens when given some content. |
|
146 | + * |
|
147 | + * @param string $string The string to tokenize. |
|
148 | + * |
|
149 | + * @return array |
|
150 | + */ |
|
151 | + abstract protected function tokenize($string); |
|
152 | + |
|
153 | + |
|
154 | + /** |
|
155 | + * Performs additional processing after main tokenizing. |
|
156 | + * |
|
157 | + * @return void |
|
158 | + */ |
|
159 | + abstract protected function processAdditional(); |
|
160 | + |
|
161 | + |
|
162 | + /** |
|
163 | + * Sets token position information. |
|
164 | + * |
|
165 | + * Can also convert tabs into spaces. Each tab can represent between |
|
166 | + * 1 and $width spaces, so this cannot be a straight string replace. |
|
167 | + * |
|
168 | + * @return void |
|
169 | + */ |
|
170 | + private function createPositionMap() |
|
171 | + { |
|
172 | + $currColumn = 1; |
|
173 | + $lineNumber = 1; |
|
174 | + $eolLen = strlen($this->eolChar); |
|
175 | + $ignoring = null; |
|
176 | + $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); |
|
177 | + |
|
178 | + $checkEncoding = false; |
|
179 | + if (function_exists('iconv_strlen') === true) { |
|
180 | + $checkEncoding = true; |
|
181 | + } |
|
182 | + |
|
183 | + $checkAnnotations = $this->config->annotations; |
|
184 | + $encoding = $this->config->encoding; |
|
185 | + $tabWidth = $this->config->tabWidth; |
|
186 | + |
|
187 | + $tokensWithTabs = [ |
|
188 | + T_WHITESPACE => true, |
|
189 | + T_COMMENT => true, |
|
190 | + T_DOC_COMMENT => true, |
|
191 | + T_DOC_COMMENT_WHITESPACE => true, |
|
192 | + T_DOC_COMMENT_STRING => true, |
|
193 | + T_CONSTANT_ENCAPSED_STRING => true, |
|
194 | + T_DOUBLE_QUOTED_STRING => true, |
|
195 | + T_HEREDOC => true, |
|
196 | + T_NOWDOC => true, |
|
197 | + T_INLINE_HTML => true, |
|
198 | + ]; |
|
199 | + |
|
200 | + $this->numTokens = count($this->tokens); |
|
201 | + for ($i = 0; $i < $this->numTokens; $i++) { |
|
202 | + $this->tokens[$i]['line'] = $lineNumber; |
|
203 | + $this->tokens[$i]['column'] = $currColumn; |
|
204 | + |
|
205 | + if (isset($this->knownLengths[$this->tokens[$i]['code']]) === true) { |
|
206 | + // There are no tabs in the tokens we know the length of. |
|
207 | + $length = $this->knownLengths[$this->tokens[$i]['code']]; |
|
208 | + $currColumn += $length; |
|
209 | + } else if ($tabWidth === 0 |
|
210 | + || isset($tokensWithTabs[$this->tokens[$i]['code']]) === false |
|
211 | + || strpos($this->tokens[$i]['content'], "\t") === false |
|
212 | + ) { |
|
213 | + // There are no tabs in this content, or we aren't replacing them. |
|
214 | + if ($checkEncoding === true) { |
|
215 | + // Not using the default encoding, so take a bit more care. |
|
216 | + $oldLevel = error_reporting(); |
|
217 | + error_reporting(0); |
|
218 | + $length = iconv_strlen($this->tokens[$i]['content'], $encoding); |
|
219 | + error_reporting($oldLevel); |
|
220 | + |
|
221 | + if ($length === false) { |
|
222 | + // String contained invalid characters, so revert to default. |
|
223 | + $length = strlen($this->tokens[$i]['content']); |
|
224 | + } |
|
225 | + } else { |
|
226 | + $length = strlen($this->tokens[$i]['content']); |
|
227 | + } |
|
228 | + |
|
229 | + $currColumn += $length; |
|
230 | + } else { |
|
231 | + $this->replaceTabsInToken($this->tokens[$i]); |
|
232 | + $length = $this->tokens[$i]['length']; |
|
233 | + $currColumn += $length; |
|
234 | + }//end if |
|
235 | + |
|
236 | + $this->tokens[$i]['length'] = $length; |
|
237 | + |
|
238 | + if (isset($this->knownLengths[$this->tokens[$i]['code']]) === false |
|
239 | + && strpos($this->tokens[$i]['content'], $this->eolChar) !== false |
|
240 | + ) { |
|
241 | + $lineNumber++; |
|
242 | + $currColumn = 1; |
|
243 | + |
|
244 | + // Newline chars are not counted in the token length. |
|
245 | + $this->tokens[$i]['length'] -= $eolLen; |
|
246 | + } |
|
247 | + |
|
248 | + if ($this->tokens[$i]['code'] === T_COMMENT |
|
249 | + || $this->tokens[$i]['code'] === T_DOC_COMMENT_STRING |
|
250 | + || $this->tokens[$i]['code'] === T_DOC_COMMENT_TAG |
|
251 | + || ($inTests === true && $this->tokens[$i]['code'] === T_INLINE_HTML) |
|
252 | + ) { |
|
253 | + $commentText = ltrim($this->tokens[$i]['content'], " \t/*"); |
|
254 | + $commentText = rtrim($commentText, " */\t\r\n"); |
|
255 | + $commentTextLower = strtolower($commentText); |
|
256 | + if (strpos($commentText, '@codingStandards') !== false) { |
|
257 | + // If this comment is the only thing on the line, it tells us |
|
258 | + // to ignore the following line. If the line contains other content |
|
259 | + // then we are just ignoring this one single line. |
|
260 | + $ownLine = false; |
|
261 | + if ($i > 0) { |
|
262 | + for ($prev = ($i - 1); $prev >= 0; $prev--) { |
|
263 | + if ($this->tokens[$prev]['code'] === T_WHITESPACE) { |
|
264 | + continue; |
|
265 | + } |
|
266 | + |
|
267 | + break; |
|
268 | + } |
|
269 | + |
|
270 | + if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { |
|
271 | + $ownLine = true; |
|
272 | + } |
|
273 | + } |
|
274 | + |
|
275 | + if ($ignoring === null |
|
276 | + && strpos($commentText, '@codingStandardsIgnoreStart') !== false |
|
277 | + ) { |
|
278 | + $ignoring = ['.all' => true]; |
|
279 | + if ($ownLine === true) { |
|
280 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
281 | + } |
|
282 | + } else if ($ignoring !== null |
|
283 | + && strpos($commentText, '@codingStandardsIgnoreEnd') !== false |
|
284 | + ) { |
|
285 | + if ($ownLine === true) { |
|
286 | + $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
287 | + } else { |
|
288 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
289 | + } |
|
290 | + |
|
291 | + $ignoring = null; |
|
292 | + } else if ($ignoring === null |
|
293 | + && strpos($commentText, '@codingStandardsIgnoreLine') !== false |
|
294 | + ) { |
|
295 | + $ignoring = ['.all' => true]; |
|
296 | + if ($ownLine === true) { |
|
297 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
298 | + $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoring; |
|
299 | + } else { |
|
300 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
301 | + } |
|
302 | + |
|
303 | + $ignoring = null; |
|
304 | + }//end if |
|
305 | + } else if (substr($commentTextLower, 0, 6) === 'phpcs:' |
|
306 | + || substr($commentTextLower, 0, 7) === '@phpcs:' |
|
307 | + ) { |
|
308 | + // If the @phpcs: syntax is being used, strip the @ to make |
|
309 | + // comparisons easier. |
|
310 | + if ($commentText[0] === '@') { |
|
311 | + $commentText = substr($commentText, 1); |
|
312 | + $commentTextLower = strtolower($commentText); |
|
313 | + } |
|
314 | + |
|
315 | + // If there is a comment on the end, strip it off. |
|
316 | + $commentStart = strpos($commentTextLower, ' --'); |
|
317 | + if ($commentStart !== false) { |
|
318 | + $commentText = substr($commentText, 0, $commentStart); |
|
319 | + $commentTextLower = strtolower($commentText); |
|
320 | + } |
|
321 | + |
|
322 | + // If this comment is the only thing on the line, it tells us |
|
323 | + // to ignore the following line. If the line contains other content |
|
324 | + // then we are just ignoring this one single line. |
|
325 | + $lineHasOtherContent = false; |
|
326 | + $lineHasOtherTokens = false; |
|
327 | + if ($i > 0) { |
|
328 | + for ($prev = ($i - 1); $prev > 0; $prev--) { |
|
329 | + if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { |
|
330 | + // Changed lines. |
|
331 | + break; |
|
332 | + } |
|
333 | + |
|
334 | + if ($this->tokens[$prev]['code'] === T_WHITESPACE |
|
335 | + || ($this->tokens[$prev]['code'] === T_INLINE_HTML |
|
336 | + && trim($this->tokens[$prev]['content']) === '') |
|
337 | + ) { |
|
338 | + continue; |
|
339 | + } |
|
340 | + |
|
341 | + $lineHasOtherTokens = true; |
|
342 | + |
|
343 | + if ($this->tokens[$prev]['code'] === T_OPEN_TAG) { |
|
344 | + continue; |
|
345 | + } |
|
346 | + |
|
347 | + $lineHasOtherContent = true; |
|
348 | + break; |
|
349 | + }//end for |
|
350 | + |
|
351 | + $changedLines = false; |
|
352 | + for ($next = $i; $next < $this->numTokens; $next++) { |
|
353 | + if ($changedLines === true) { |
|
354 | + // Changed lines. |
|
355 | + break; |
|
356 | + } |
|
357 | + |
|
358 | + if (isset($this->knownLengths[$this->tokens[$next]['code']]) === false |
|
359 | + && strpos($this->tokens[$next]['content'], $this->eolChar) !== false |
|
360 | + ) { |
|
361 | + // Last token on the current line. |
|
362 | + $changedLines = true; |
|
363 | + } |
|
364 | + |
|
365 | + if ($next === $i) { |
|
366 | + continue; |
|
367 | + } |
|
368 | + |
|
369 | + if ($this->tokens[$next]['code'] === T_WHITESPACE |
|
370 | + || ($this->tokens[$next]['code'] === T_INLINE_HTML |
|
371 | + && trim($this->tokens[$next]['content']) === '') |
|
372 | + ) { |
|
373 | + continue; |
|
374 | + } |
|
375 | + |
|
376 | + $lineHasOtherTokens = true; |
|
377 | + |
|
378 | + if ($this->tokens[$next]['code'] === T_CLOSE_TAG) { |
|
379 | + continue; |
|
380 | + } |
|
381 | + |
|
382 | + $lineHasOtherContent = true; |
|
383 | + break; |
|
384 | + }//end for |
|
385 | + }//end if |
|
386 | + |
|
387 | + if (substr($commentTextLower, 0, 9) === 'phpcs:set') { |
|
388 | + // Ignore standards for complete lines that change sniff settings. |
|
389 | + if ($lineHasOtherTokens === false) { |
|
390 | + $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
391 | + } |
|
392 | + |
|
393 | + // Need to maintain case here, to get the correct sniff code. |
|
394 | + $parts = explode(' ', substr($commentText, 10)); |
|
395 | + if (count($parts) >= 2) { |
|
396 | + $sniffParts = explode('.', $parts[0]); |
|
397 | + if (count($sniffParts) >= 3) { |
|
398 | + $this->tokens[$i]['sniffCode'] = array_shift($parts); |
|
399 | + $this->tokens[$i]['sniffProperty'] = array_shift($parts); |
|
400 | + $this->tokens[$i]['sniffPropertyValue'] = rtrim(implode(' ', $parts), " */\r\n"); |
|
401 | + } |
|
402 | + } |
|
403 | + |
|
404 | + $this->tokens[$i]['code'] = T_PHPCS_SET; |
|
405 | + $this->tokens[$i]['type'] = 'T_PHPCS_SET'; |
|
406 | + } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile') { |
|
407 | + // The whole file will be ignored, but at least set the correct token. |
|
408 | + $this->tokens[$i]['code'] = T_PHPCS_IGNORE_FILE; |
|
409 | + $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE_FILE'; |
|
410 | + } else if (substr($commentTextLower, 0, 13) === 'phpcs:disable') { |
|
411 | + if ($lineHasOtherContent === false) { |
|
412 | + // Completely ignore the comment line. |
|
413 | + $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
414 | + } |
|
415 | + |
|
416 | + if ($ignoring === null) { |
|
417 | + $ignoring = []; |
|
418 | + } |
|
419 | + |
|
420 | + $disabledSniffs = []; |
|
421 | + |
|
422 | + $additionalText = substr($commentText, 14); |
|
423 | + if ($additionalText === false) { |
|
424 | + $ignoring = ['.all' => true]; |
|
425 | + } else { |
|
426 | + $parts = explode(',', substr($commentText, 13)); |
|
427 | + foreach ($parts as $sniffCode) { |
|
428 | + $sniffCode = trim($sniffCode); |
|
429 | + $disabledSniffs[$sniffCode] = true; |
|
430 | + $ignoring[$sniffCode] = true; |
|
431 | + |
|
432 | + // This newly disabled sniff might be disabling an existing |
|
433 | + // enabled exception that we are tracking. |
|
434 | + if (isset($ignoring['.except']) === true) { |
|
435 | + foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { |
|
436 | + if ($ignoredSniffCode === $sniffCode |
|
437 | + || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
438 | + ) { |
|
439 | + unset($ignoring['.except'][$ignoredSniffCode]); |
|
440 | + } |
|
441 | + } |
|
442 | + |
|
443 | + if (empty($ignoring['.except']) === true) { |
|
444 | + unset($ignoring['.except']); |
|
445 | + } |
|
446 | + } |
|
447 | + }//end foreach |
|
448 | + }//end if |
|
449 | + |
|
450 | + $this->tokens[$i]['code'] = T_PHPCS_DISABLE; |
|
451 | + $this->tokens[$i]['type'] = 'T_PHPCS_DISABLE'; |
|
452 | + $this->tokens[$i]['sniffCodes'] = $disabledSniffs; |
|
453 | + } else if (substr($commentTextLower, 0, 12) === 'phpcs:enable') { |
|
454 | + if ($ignoring !== null) { |
|
455 | + $enabledSniffs = []; |
|
456 | + |
|
457 | + $additionalText = substr($commentText, 13); |
|
458 | + if ($additionalText === false) { |
|
459 | + $ignoring = null; |
|
460 | + } else { |
|
461 | + $parts = explode(',', substr($commentText, 13)); |
|
462 | + foreach ($parts as $sniffCode) { |
|
463 | + $sniffCode = trim($sniffCode); |
|
464 | + $enabledSniffs[$sniffCode] = true; |
|
465 | + |
|
466 | + // This new enabled sniff might remove previously disabled |
|
467 | + // sniffs if it is actually a standard or category of sniffs. |
|
468 | + foreach (array_keys($ignoring) as $ignoredSniffCode) { |
|
469 | + if ($ignoredSniffCode === $sniffCode |
|
470 | + || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
471 | + ) { |
|
472 | + unset($ignoring[$ignoredSniffCode]); |
|
473 | + } |
|
474 | + } |
|
475 | + |
|
476 | + // This new enabled sniff might be able to clear up |
|
477 | + // previously enabled sniffs if it is actually a standard or |
|
478 | + // category of sniffs. |
|
479 | + if (isset($ignoring['.except']) === true) { |
|
480 | + foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { |
|
481 | + if ($ignoredSniffCode === $sniffCode |
|
482 | + || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
483 | + ) { |
|
484 | + unset($ignoring['.except'][$ignoredSniffCode]); |
|
485 | + } |
|
486 | + } |
|
487 | + } |
|
488 | + }//end foreach |
|
489 | + |
|
490 | + if (empty($ignoring) === true) { |
|
491 | + $ignoring = null; |
|
492 | + } else { |
|
493 | + if (isset($ignoring['.except']) === true) { |
|
494 | + $ignoring['.except'] += $enabledSniffs; |
|
495 | + } else { |
|
496 | + $ignoring['.except'] = $enabledSniffs; |
|
497 | + } |
|
498 | + } |
|
499 | + }//end if |
|
500 | + |
|
501 | + if ($lineHasOtherContent === false) { |
|
502 | + // Completely ignore the comment line. |
|
503 | + $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
504 | + } else { |
|
505 | + // The comment is on the same line as the code it is ignoring, |
|
506 | + // so respect the new ignore rules. |
|
507 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
508 | + } |
|
509 | + |
|
510 | + $this->tokens[$i]['sniffCodes'] = $enabledSniffs; |
|
511 | + }//end if |
|
512 | + |
|
513 | + $this->tokens[$i]['code'] = T_PHPCS_ENABLE; |
|
514 | + $this->tokens[$i]['type'] = 'T_PHPCS_ENABLE'; |
|
515 | + } else if (substr($commentTextLower, 0, 12) === 'phpcs:ignore') { |
|
516 | + $ignoreRules = []; |
|
517 | + |
|
518 | + $additionalText = substr($commentText, 13); |
|
519 | + if ($additionalText === false) { |
|
520 | + $ignoreRules = ['.all' => true]; |
|
521 | + } else { |
|
522 | + $parts = explode(',', substr($commentText, 13)); |
|
523 | + foreach ($parts as $sniffCode) { |
|
524 | + $ignoreRules[trim($sniffCode)] = true; |
|
525 | + } |
|
526 | + } |
|
527 | + |
|
528 | + $this->tokens[$i]['code'] = T_PHPCS_IGNORE; |
|
529 | + $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE'; |
|
530 | + $this->tokens[$i]['sniffCodes'] = $ignoreRules; |
|
531 | + |
|
532 | + if ($ignoring !== null) { |
|
533 | + $ignoreRules += $ignoring; |
|
534 | + } |
|
535 | + |
|
536 | + if ($lineHasOtherContent === false) { |
|
537 | + // Completely ignore the comment line, and set the following |
|
538 | + // line to include the ignore rules we've set. |
|
539 | + $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
540 | + $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoreRules; |
|
541 | + } else { |
|
542 | + // The comment is on the same line as the code it is ignoring, |
|
543 | + // so respect the ignore rules it set. |
|
544 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoreRules; |
|
545 | + } |
|
546 | + }//end if |
|
547 | + }//end if |
|
548 | + }//end if |
|
549 | + |
|
550 | + if ($ignoring !== null && isset($this->ignoredLines[$this->tokens[$i]['line']]) === false) { |
|
551 | + $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
552 | + } |
|
553 | + }//end for |
|
554 | + |
|
555 | + // If annotations are being ignored, we clear out all the ignore rules |
|
556 | + // but leave the annotations tokenized as normal. |
|
557 | + if ($checkAnnotations === false) { |
|
558 | + $this->ignoredLines = []; |
|
559 | + } |
|
560 | + |
|
561 | + }//end createPositionMap() |
|
562 | + |
|
563 | + |
|
564 | + /** |
|
565 | + * Replaces tabs in original token content with spaces. |
|
566 | + * |
|
567 | + * Each tab can represent between 1 and $config->tabWidth spaces, |
|
568 | + * so this cannot be a straight string replace. The original content |
|
569 | + * is placed into an orig_content index and the new token length is also |
|
570 | + * set in the length index. |
|
571 | + * |
|
572 | + * @param array $token The token to replace tabs inside. |
|
573 | + * @param string $prefix The character to use to represent the start of a tab. |
|
574 | + * @param string $padding The character to use to represent the end of a tab. |
|
575 | + * @param int $tabWidth The number of spaces each tab represents. |
|
576 | + * |
|
577 | + * @return void |
|
578 | + */ |
|
579 | + public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) |
|
580 | + { |
|
581 | + $checkEncoding = false; |
|
582 | + if (function_exists('iconv_strlen') === true) { |
|
583 | + $checkEncoding = true; |
|
584 | + } |
|
585 | + |
|
586 | + $currColumn = $token['column']; |
|
587 | + if ($tabWidth === null) { |
|
588 | + $tabWidth = $this->config->tabWidth; |
|
589 | + if ($tabWidth === 0) { |
|
590 | + $tabWidth = 1; |
|
591 | + } |
|
592 | + } |
|
593 | + |
|
594 | + if (rtrim($token['content'], "\t") === '') { |
|
595 | + // String only contains tabs, so we can shortcut the process. |
|
596 | + $numTabs = strlen($token['content']); |
|
597 | + |
|
598 | + $firstTabSize = ($tabWidth - (($currColumn - 1) % $tabWidth)); |
|
599 | + $length = ($firstTabSize + ($tabWidth * ($numTabs - 1))); |
|
600 | + $newContent = $prefix.str_repeat($padding, ($length - 1)); |
|
601 | + } else { |
|
602 | + // We need to determine the length of each tab. |
|
603 | + $tabs = explode("\t", $token['content']); |
|
604 | + |
|
605 | + $numTabs = (count($tabs) - 1); |
|
606 | + $tabNum = 0; |
|
607 | + $newContent = ''; |
|
608 | + $length = 0; |
|
609 | + |
|
610 | + foreach ($tabs as $content) { |
|
611 | + if ($content !== '') { |
|
612 | + $newContent .= $content; |
|
613 | + if ($checkEncoding === true) { |
|
614 | + // Not using the default encoding, so take a bit more care. |
|
615 | + $oldLevel = error_reporting(); |
|
616 | + error_reporting(0); |
|
617 | + $contentLength = iconv_strlen($content, $this->config->encoding); |
|
618 | + error_reporting($oldLevel); |
|
619 | + if ($contentLength === false) { |
|
620 | + // String contained invalid characters, so revert to default. |
|
621 | + $contentLength = strlen($content); |
|
622 | + } |
|
623 | + } else { |
|
624 | + $contentLength = strlen($content); |
|
625 | + } |
|
626 | + |
|
627 | + $currColumn += $contentLength; |
|
628 | + $length += $contentLength; |
|
629 | + } |
|
630 | + |
|
631 | + // The last piece of content does not have a tab after it. |
|
632 | + if ($tabNum === $numTabs) { |
|
633 | + break; |
|
634 | + } |
|
635 | + |
|
636 | + // Process the tab that comes after the content. |
|
637 | + $lastCurrColumn = $currColumn; |
|
638 | + $tabNum++; |
|
639 | + |
|
640 | + // Move the pointer to the next tab stop. |
|
641 | + if (($currColumn % $tabWidth) === 0) { |
|
642 | + // This is the first tab, and we are already at a |
|
643 | + // tab stop, so this tab counts as a single space. |
|
644 | + $currColumn++; |
|
645 | + } else { |
|
646 | + $currColumn++; |
|
647 | + while (($currColumn % $tabWidth) !== 0) { |
|
648 | + $currColumn++; |
|
649 | + } |
|
650 | + |
|
651 | + $currColumn++; |
|
652 | + } |
|
653 | + |
|
654 | + $length += ($currColumn - $lastCurrColumn); |
|
655 | + $newContent .= $prefix.str_repeat($padding, ($currColumn - $lastCurrColumn - 1)); |
|
656 | + }//end foreach |
|
657 | + }//end if |
|
658 | + |
|
659 | + $token['orig_content'] = $token['content']; |
|
660 | + $token['content'] = $newContent; |
|
661 | + $token['length'] = $length; |
|
662 | + |
|
663 | + }//end replaceTabsInToken() |
|
664 | + |
|
665 | + |
|
666 | + /** |
|
667 | + * Creates a map of brackets positions. |
|
668 | + * |
|
669 | + * @return void |
|
670 | + */ |
|
671 | + private function createTokenMap() |
|
672 | + { |
|
673 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
674 | + echo "\t*** START TOKEN MAP ***".PHP_EOL; |
|
675 | + } |
|
676 | + |
|
677 | + $squareOpeners = []; |
|
678 | + $curlyOpeners = []; |
|
679 | + $this->numTokens = count($this->tokens); |
|
680 | + |
|
681 | + $openers = []; |
|
682 | + $openOwner = null; |
|
683 | + |
|
684 | + for ($i = 0; $i < $this->numTokens; $i++) { |
|
685 | + /* |
|
686 | 686 | Parenthesis mapping. |
687 | 687 | */ |
688 | 688 | |
689 | - if (isset(Util\Tokens::$parenthesisOpeners[$this->tokens[$i]['code']]) === true) { |
|
690 | - $this->tokens[$i]['parenthesis_opener'] = null; |
|
691 | - $this->tokens[$i]['parenthesis_closer'] = null; |
|
692 | - $this->tokens[$i]['parenthesis_owner'] = $i; |
|
693 | - $openOwner = $i; |
|
694 | - } else if ($this->tokens[$i]['code'] === T_OPEN_PARENTHESIS) { |
|
695 | - $openers[] = $i; |
|
696 | - $this->tokens[$i]['parenthesis_opener'] = $i; |
|
697 | - if ($openOwner !== null) { |
|
698 | - $this->tokens[$openOwner]['parenthesis_opener'] = $i; |
|
699 | - $this->tokens[$i]['parenthesis_owner'] = $openOwner; |
|
700 | - $openOwner = null; |
|
701 | - } |
|
702 | - } else if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { |
|
703 | - // Did we set an owner for this set of parenthesis? |
|
704 | - $numOpeners = count($openers); |
|
705 | - if ($numOpeners !== 0) { |
|
706 | - $opener = array_pop($openers); |
|
707 | - if (isset($this->tokens[$opener]['parenthesis_owner']) === true) { |
|
708 | - $owner = $this->tokens[$opener]['parenthesis_owner']; |
|
709 | - |
|
710 | - $this->tokens[$owner]['parenthesis_closer'] = $i; |
|
711 | - $this->tokens[$i]['parenthesis_owner'] = $owner; |
|
712 | - } |
|
713 | - |
|
714 | - $this->tokens[$i]['parenthesis_opener'] = $opener; |
|
715 | - $this->tokens[$i]['parenthesis_closer'] = $i; |
|
716 | - $this->tokens[$opener]['parenthesis_closer'] = $i; |
|
717 | - } |
|
718 | - }//end if |
|
719 | - |
|
720 | - /* |
|
689 | + if (isset(Util\Tokens::$parenthesisOpeners[$this->tokens[$i]['code']]) === true) { |
|
690 | + $this->tokens[$i]['parenthesis_opener'] = null; |
|
691 | + $this->tokens[$i]['parenthesis_closer'] = null; |
|
692 | + $this->tokens[$i]['parenthesis_owner'] = $i; |
|
693 | + $openOwner = $i; |
|
694 | + } else if ($this->tokens[$i]['code'] === T_OPEN_PARENTHESIS) { |
|
695 | + $openers[] = $i; |
|
696 | + $this->tokens[$i]['parenthesis_opener'] = $i; |
|
697 | + if ($openOwner !== null) { |
|
698 | + $this->tokens[$openOwner]['parenthesis_opener'] = $i; |
|
699 | + $this->tokens[$i]['parenthesis_owner'] = $openOwner; |
|
700 | + $openOwner = null; |
|
701 | + } |
|
702 | + } else if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { |
|
703 | + // Did we set an owner for this set of parenthesis? |
|
704 | + $numOpeners = count($openers); |
|
705 | + if ($numOpeners !== 0) { |
|
706 | + $opener = array_pop($openers); |
|
707 | + if (isset($this->tokens[$opener]['parenthesis_owner']) === true) { |
|
708 | + $owner = $this->tokens[$opener]['parenthesis_owner']; |
|
709 | + |
|
710 | + $this->tokens[$owner]['parenthesis_closer'] = $i; |
|
711 | + $this->tokens[$i]['parenthesis_owner'] = $owner; |
|
712 | + } |
|
713 | + |
|
714 | + $this->tokens[$i]['parenthesis_opener'] = $opener; |
|
715 | + $this->tokens[$i]['parenthesis_closer'] = $i; |
|
716 | + $this->tokens[$opener]['parenthesis_closer'] = $i; |
|
717 | + } |
|
718 | + }//end if |
|
719 | + |
|
720 | + /* |
|
721 | 721 | Bracket mapping. |
722 | 722 | */ |
723 | 723 | |
724 | - switch ($this->tokens[$i]['code']) { |
|
725 | - case T_OPEN_SQUARE_BRACKET: |
|
726 | - $squareOpeners[] = $i; |
|
727 | - |
|
728 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
729 | - echo str_repeat("\t", count($squareOpeners)); |
|
730 | - echo str_repeat("\t", count($curlyOpeners)); |
|
731 | - echo "=> Found square bracket opener at $i".PHP_EOL; |
|
732 | - } |
|
733 | - break; |
|
734 | - case T_OPEN_CURLY_BRACKET: |
|
735 | - if (isset($this->tokens[$i]['scope_closer']) === false) { |
|
736 | - $curlyOpeners[] = $i; |
|
737 | - |
|
738 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
739 | - echo str_repeat("\t", count($squareOpeners)); |
|
740 | - echo str_repeat("\t", count($curlyOpeners)); |
|
741 | - echo "=> Found curly bracket opener at $i".PHP_EOL; |
|
742 | - } |
|
743 | - } |
|
744 | - break; |
|
745 | - case T_CLOSE_SQUARE_BRACKET: |
|
746 | - if (empty($squareOpeners) === false) { |
|
747 | - $opener = array_pop($squareOpeners); |
|
748 | - $this->tokens[$i]['bracket_opener'] = $opener; |
|
749 | - $this->tokens[$i]['bracket_closer'] = $i; |
|
750 | - $this->tokens[$opener]['bracket_opener'] = $opener; |
|
751 | - $this->tokens[$opener]['bracket_closer'] = $i; |
|
752 | - |
|
753 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
754 | - echo str_repeat("\t", count($squareOpeners)); |
|
755 | - echo str_repeat("\t", count($curlyOpeners)); |
|
756 | - echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; |
|
757 | - } |
|
758 | - } |
|
759 | - break; |
|
760 | - case T_CLOSE_CURLY_BRACKET: |
|
761 | - if (empty($curlyOpeners) === false |
|
762 | - && isset($this->tokens[$i]['scope_opener']) === false |
|
763 | - ) { |
|
764 | - $opener = array_pop($curlyOpeners); |
|
765 | - $this->tokens[$i]['bracket_opener'] = $opener; |
|
766 | - $this->tokens[$i]['bracket_closer'] = $i; |
|
767 | - $this->tokens[$opener]['bracket_opener'] = $opener; |
|
768 | - $this->tokens[$opener]['bracket_closer'] = $i; |
|
769 | - |
|
770 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
771 | - echo str_repeat("\t", count($squareOpeners)); |
|
772 | - echo str_repeat("\t", count($curlyOpeners)); |
|
773 | - echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; |
|
774 | - } |
|
775 | - } |
|
776 | - break; |
|
777 | - default: |
|
778 | - continue 2; |
|
779 | - }//end switch |
|
780 | - }//end for |
|
781 | - |
|
782 | - // Cleanup for any openers that we didn't find closers for. |
|
783 | - // This typically means there was a syntax error breaking things. |
|
784 | - foreach ($openers as $opener) { |
|
785 | - unset($this->tokens[$opener]['parenthesis_opener']); |
|
786 | - unset($this->tokens[$opener]['parenthesis_owner']); |
|
787 | - } |
|
788 | - |
|
789 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
790 | - echo "\t*** END TOKEN MAP ***".PHP_EOL; |
|
791 | - } |
|
792 | - |
|
793 | - }//end createTokenMap() |
|
794 | - |
|
795 | - |
|
796 | - /** |
|
797 | - * Creates a map for the parenthesis tokens that surround other tokens. |
|
798 | - * |
|
799 | - * @return void |
|
800 | - */ |
|
801 | - private function createParenthesisNestingMap() |
|
802 | - { |
|
803 | - $map = []; |
|
804 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
805 | - if (isset($this->tokens[$i]['parenthesis_opener']) === true |
|
806 | - && $i === $this->tokens[$i]['parenthesis_opener'] |
|
807 | - ) { |
|
808 | - if (empty($map) === false) { |
|
809 | - $this->tokens[$i]['nested_parenthesis'] = $map; |
|
810 | - } |
|
811 | - |
|
812 | - if (isset($this->tokens[$i]['parenthesis_closer']) === true) { |
|
813 | - $map[$this->tokens[$i]['parenthesis_opener']] |
|
814 | - = $this->tokens[$i]['parenthesis_closer']; |
|
815 | - } |
|
816 | - } else if (isset($this->tokens[$i]['parenthesis_closer']) === true |
|
817 | - && $i === $this->tokens[$i]['parenthesis_closer'] |
|
818 | - ) { |
|
819 | - array_pop($map); |
|
820 | - if (empty($map) === false) { |
|
821 | - $this->tokens[$i]['nested_parenthesis'] = $map; |
|
822 | - } |
|
823 | - } else { |
|
824 | - if (empty($map) === false) { |
|
825 | - $this->tokens[$i]['nested_parenthesis'] = $map; |
|
826 | - } |
|
827 | - }//end if |
|
828 | - }//end for |
|
829 | - |
|
830 | - }//end createParenthesisNestingMap() |
|
831 | - |
|
832 | - |
|
833 | - /** |
|
834 | - * Creates a scope map of tokens that open scopes. |
|
835 | - * |
|
836 | - * @return void |
|
837 | - * @see recurseScopeMap() |
|
838 | - */ |
|
839 | - private function createScopeMap() |
|
840 | - { |
|
841 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
842 | - echo "\t*** START SCOPE MAP ***".PHP_EOL; |
|
843 | - } |
|
844 | - |
|
845 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
846 | - // Check to see if the current token starts a new scope. |
|
847 | - if (isset($this->scopeOpeners[$this->tokens[$i]['code']]) === true) { |
|
848 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
849 | - $type = $this->tokens[$i]['type']; |
|
850 | - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
851 | - echo "\tStart scope map at $i:$type => $content".PHP_EOL; |
|
852 | - } |
|
853 | - |
|
854 | - if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
855 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
856 | - echo "\t* already processed, skipping *".PHP_EOL; |
|
857 | - } |
|
858 | - |
|
859 | - continue; |
|
860 | - } |
|
861 | - |
|
862 | - $i = $this->recurseScopeMap($i); |
|
863 | - }//end if |
|
864 | - }//end for |
|
865 | - |
|
866 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
867 | - echo "\t*** END SCOPE MAP ***".PHP_EOL; |
|
868 | - } |
|
869 | - |
|
870 | - }//end createScopeMap() |
|
871 | - |
|
872 | - |
|
873 | - /** |
|
874 | - * Recurses though the scope openers to build a scope map. |
|
875 | - * |
|
876 | - * @param int $stackPtr The position in the stack of the token that |
|
877 | - * opened the scope (eg. an IF token or FOR token). |
|
878 | - * @param int $depth How many scope levels down we are. |
|
879 | - * @param int $ignore How many curly braces we are ignoring. |
|
880 | - * |
|
881 | - * @return int The position in the stack that closed the scope. |
|
882 | - */ |
|
883 | - private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) |
|
884 | - { |
|
885 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
886 | - echo str_repeat("\t", $depth); |
|
887 | - echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; |
|
888 | - } |
|
889 | - |
|
890 | - $opener = null; |
|
891 | - $currType = $this->tokens[$stackPtr]['code']; |
|
892 | - $startLine = $this->tokens[$stackPtr]['line']; |
|
893 | - |
|
894 | - // We will need this to restore the value if we end up |
|
895 | - // returning a token ID that causes our calling function to go back |
|
896 | - // over already ignored braces. |
|
897 | - $originalIgnore = $ignore; |
|
898 | - |
|
899 | - // If the start token for this scope opener is the same as |
|
900 | - // the scope token, we have already found our opener. |
|
901 | - if (isset($this->scopeOpeners[$currType]['start'][$currType]) === true) { |
|
902 | - $opener = $stackPtr; |
|
903 | - } |
|
904 | - |
|
905 | - for ($i = ($stackPtr + 1); $i < $this->numTokens; $i++) { |
|
906 | - $tokenType = $this->tokens[$i]['code']; |
|
907 | - |
|
908 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
909 | - $type = $this->tokens[$i]['type']; |
|
910 | - $line = $this->tokens[$i]['line']; |
|
911 | - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
912 | - |
|
913 | - echo str_repeat("\t", $depth); |
|
914 | - echo "Process token $i on line $line ["; |
|
915 | - if ($opener !== null) { |
|
916 | - echo "opener:$opener;"; |
|
917 | - } |
|
918 | - |
|
919 | - if ($ignore > 0) { |
|
920 | - echo "ignore=$ignore;"; |
|
921 | - } |
|
922 | - |
|
923 | - echo "]: $type => $content".PHP_EOL; |
|
924 | - }//end if |
|
925 | - |
|
926 | - // Very special case for IF statements in PHP that can be defined without |
|
927 | - // scope tokens. E.g., if (1) 1; 1 ? (1 ? 1 : 1) : 1; |
|
928 | - // If an IF statement below this one has an opener but no |
|
929 | - // keyword, the opener will be incorrectly assigned to this IF statement. |
|
930 | - // The same case also applies to USE statements, which don't have to have |
|
931 | - // openers, so a following USE statement can cause an incorrect brace match. |
|
932 | - if (($currType === T_IF || $currType === T_ELSE || $currType === T_USE) |
|
933 | - && $opener === null |
|
934 | - && ($this->tokens[$i]['code'] === T_SEMICOLON |
|
935 | - || $this->tokens[$i]['code'] === T_CLOSE_TAG) |
|
936 | - ) { |
|
937 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
938 | - $type = $this->tokens[$stackPtr]['type']; |
|
939 | - echo str_repeat("\t", $depth); |
|
940 | - if ($this->tokens[$i]['code'] === T_SEMICOLON) { |
|
941 | - $closerType = 'semicolon'; |
|
942 | - } else { |
|
943 | - $closerType = 'close tag'; |
|
944 | - } |
|
945 | - |
|
946 | - echo "=> Found $closerType before scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
947 | - } |
|
948 | - |
|
949 | - return $i; |
|
950 | - } |
|
951 | - |
|
952 | - // Special case for PHP control structures that have no braces. |
|
953 | - // If we find a curly brace closer before we find the opener, |
|
954 | - // we're not going to find an opener. That closer probably belongs to |
|
955 | - // a control structure higher up. |
|
956 | - if ($opener === null |
|
957 | - && $ignore === 0 |
|
958 | - && $tokenType === T_CLOSE_CURLY_BRACKET |
|
959 | - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true |
|
960 | - ) { |
|
961 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
962 | - $type = $this->tokens[$stackPtr]['type']; |
|
963 | - echo str_repeat("\t", $depth); |
|
964 | - echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
965 | - } |
|
966 | - |
|
967 | - return ($i - 1); |
|
968 | - } |
|
969 | - |
|
970 | - if ($opener !== null |
|
971 | - && (isset($this->tokens[$i]['scope_opener']) === false |
|
972 | - || $this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) |
|
973 | - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true |
|
974 | - ) { |
|
975 | - if ($ignore > 0 && $tokenType === T_CLOSE_CURLY_BRACKET) { |
|
976 | - // The last opening bracket must have been for a string |
|
977 | - // offset or alike, so let's ignore it. |
|
978 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
979 | - echo str_repeat("\t", $depth); |
|
980 | - echo '* finished ignoring curly brace *'.PHP_EOL; |
|
981 | - } |
|
982 | - |
|
983 | - $ignore--; |
|
984 | - continue; |
|
985 | - } else if ($this->tokens[$opener]['code'] === T_OPEN_CURLY_BRACKET |
|
986 | - && $tokenType !== T_CLOSE_CURLY_BRACKET |
|
987 | - ) { |
|
988 | - // The opener is a curly bracket so the closer must be a curly bracket as well. |
|
989 | - // We ignore this closer to handle cases such as T_ELSE or T_ELSEIF being considered |
|
990 | - // a closer of T_IF when it should not. |
|
991 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
992 | - $type = $this->tokens[$stackPtr]['type']; |
|
993 | - echo str_repeat("\t", $depth); |
|
994 | - echo "=> Ignoring non-curly scope closer for $stackPtr:$type".PHP_EOL; |
|
995 | - } |
|
996 | - } else { |
|
997 | - $scopeCloser = $i; |
|
998 | - $todo = [ |
|
999 | - $stackPtr, |
|
1000 | - $opener, |
|
1001 | - ]; |
|
1002 | - |
|
1003 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1004 | - $type = $this->tokens[$stackPtr]['type']; |
|
1005 | - $closerType = $this->tokens[$scopeCloser]['type']; |
|
1006 | - echo str_repeat("\t", $depth); |
|
1007 | - echo "=> Found scope closer ($scopeCloser:$closerType) for $stackPtr:$type".PHP_EOL; |
|
1008 | - } |
|
1009 | - |
|
1010 | - $validCloser = true; |
|
1011 | - if (($this->tokens[$stackPtr]['code'] === T_IF || $this->tokens[$stackPtr]['code'] === T_ELSEIF) |
|
1012 | - && ($tokenType === T_ELSE || $tokenType === T_ELSEIF) |
|
1013 | - ) { |
|
1014 | - // To be a closer, this token must have an opener. |
|
1015 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1016 | - echo str_repeat("\t", $depth); |
|
1017 | - echo "* closer needs to be tested *".PHP_EOL; |
|
1018 | - } |
|
1019 | - |
|
1020 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1021 | - |
|
1022 | - if (isset($this->tokens[$scopeCloser]['scope_opener']) === false) { |
|
1023 | - $validCloser = false; |
|
1024 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1025 | - echo str_repeat("\t", $depth); |
|
1026 | - echo "* closer is not valid (no opener found) *".PHP_EOL; |
|
1027 | - } |
|
1028 | - } else if ($this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['code'] !== $this->tokens[$opener]['code']) { |
|
1029 | - $validCloser = false; |
|
1030 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1031 | - echo str_repeat("\t", $depth); |
|
1032 | - $type = $this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['type']; |
|
1033 | - $openerType = $this->tokens[$opener]['type']; |
|
1034 | - echo "* closer is not valid (mismatched opener type; $type != $openerType) *".PHP_EOL; |
|
1035 | - } |
|
1036 | - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1037 | - echo str_repeat("\t", $depth); |
|
1038 | - echo "* closer was valid *".PHP_EOL; |
|
1039 | - } |
|
1040 | - } else { |
|
1041 | - // The closer was not processed, so we need to |
|
1042 | - // complete that token as well. |
|
1043 | - $todo[] = $scopeCloser; |
|
1044 | - }//end if |
|
1045 | - |
|
1046 | - if ($validCloser === true) { |
|
1047 | - foreach ($todo as $token) { |
|
1048 | - $this->tokens[$token]['scope_condition'] = $stackPtr; |
|
1049 | - $this->tokens[$token]['scope_opener'] = $opener; |
|
1050 | - $this->tokens[$token]['scope_closer'] = $scopeCloser; |
|
1051 | - } |
|
1052 | - |
|
1053 | - if ($this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) { |
|
1054 | - // As we are going back to where we started originally, restore |
|
1055 | - // the ignore value back to its original value. |
|
1056 | - $ignore = $originalIgnore; |
|
1057 | - return $opener; |
|
1058 | - } else if ($scopeCloser === $i |
|
1059 | - && isset($this->scopeOpeners[$tokenType]) === true |
|
1060 | - ) { |
|
1061 | - // Unset scope_condition here or else the token will appear to have |
|
1062 | - // already been processed, and it will be skipped. Normally we want that, |
|
1063 | - // but in this case, the token is both a closer and an opener, so |
|
1064 | - // it needs to act like an opener. This is also why we return the |
|
1065 | - // token before this one; so the closer has a chance to be processed |
|
1066 | - // a second time, but as an opener. |
|
1067 | - unset($this->tokens[$scopeCloser]['scope_condition']); |
|
1068 | - return ($i - 1); |
|
1069 | - } else { |
|
1070 | - return $i; |
|
1071 | - } |
|
1072 | - } else { |
|
1073 | - continue; |
|
1074 | - }//end if |
|
1075 | - }//end if |
|
1076 | - }//end if |
|
1077 | - |
|
1078 | - // Is this an opening condition ? |
|
1079 | - if (isset($this->scopeOpeners[$tokenType]) === true) { |
|
1080 | - if ($opener === null) { |
|
1081 | - if ($tokenType === T_USE) { |
|
1082 | - // PHP use keywords are special because they can be |
|
1083 | - // used as blocks but also inline in function definitions. |
|
1084 | - // So if we find them nested inside another opener, just skip them. |
|
1085 | - continue; |
|
1086 | - } |
|
1087 | - |
|
1088 | - if ($tokenType === T_FUNCTION |
|
1089 | - && $this->tokens[$stackPtr]['code'] !== T_FUNCTION |
|
1090 | - ) { |
|
1091 | - // Probably a closure, so process it manually. |
|
1092 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1093 | - $type = $this->tokens[$stackPtr]['type']; |
|
1094 | - echo str_repeat("\t", $depth); |
|
1095 | - echo "=> Found function before scope opener for $stackPtr:$type, processing manually".PHP_EOL; |
|
1096 | - } |
|
1097 | - |
|
1098 | - if (isset($this->tokens[$i]['scope_closer']) === true) { |
|
1099 | - // We've already processed this closure. |
|
1100 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1101 | - echo str_repeat("\t", $depth); |
|
1102 | - echo '* already processed, skipping *'.PHP_EOL; |
|
1103 | - } |
|
1104 | - |
|
1105 | - $i = $this->tokens[$i]['scope_closer']; |
|
1106 | - continue; |
|
1107 | - } |
|
1108 | - |
|
1109 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1110 | - continue; |
|
1111 | - }//end if |
|
1112 | - |
|
1113 | - if ($tokenType === T_CLASS) { |
|
1114 | - // Probably an anonymous class inside another anonymous class, |
|
1115 | - // so process it manually. |
|
1116 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1117 | - $type = $this->tokens[$stackPtr]['type']; |
|
1118 | - echo str_repeat("\t", $depth); |
|
1119 | - echo "=> Found class before scope opener for $stackPtr:$type, processing manually".PHP_EOL; |
|
1120 | - } |
|
1121 | - |
|
1122 | - if (isset($this->tokens[$i]['scope_closer']) === true) { |
|
1123 | - // We've already processed this anon class. |
|
1124 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1125 | - echo str_repeat("\t", $depth); |
|
1126 | - echo '* already processed, skipping *'.PHP_EOL; |
|
1127 | - } |
|
1128 | - |
|
1129 | - $i = $this->tokens[$i]['scope_closer']; |
|
1130 | - continue; |
|
1131 | - } |
|
1132 | - |
|
1133 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1134 | - continue; |
|
1135 | - }//end if |
|
1136 | - |
|
1137 | - // Found another opening condition but still haven't |
|
1138 | - // found our opener, so we are never going to find one. |
|
1139 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1140 | - $type = $this->tokens[$stackPtr]['type']; |
|
1141 | - echo str_repeat("\t", $depth); |
|
1142 | - echo "=> Found new opening condition before scope opener for $stackPtr:$type, "; |
|
1143 | - } |
|
1144 | - |
|
1145 | - if (($this->tokens[$stackPtr]['code'] === T_IF |
|
1146 | - || $this->tokens[$stackPtr]['code'] === T_ELSEIF |
|
1147 | - || $this->tokens[$stackPtr]['code'] === T_ELSE) |
|
1148 | - && ($this->tokens[$i]['code'] === T_ELSE |
|
1149 | - || $this->tokens[$i]['code'] === T_ELSEIF) |
|
1150 | - ) { |
|
1151 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1152 | - echo "continuing".PHP_EOL; |
|
1153 | - } |
|
1154 | - |
|
1155 | - return ($i - 1); |
|
1156 | - } else { |
|
1157 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1158 | - echo "backtracking".PHP_EOL; |
|
1159 | - } |
|
1160 | - |
|
1161 | - return $stackPtr; |
|
1162 | - } |
|
1163 | - }//end if |
|
1164 | - |
|
1165 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1166 | - echo str_repeat("\t", $depth); |
|
1167 | - echo '* token is an opening condition *'.PHP_EOL; |
|
1168 | - } |
|
1169 | - |
|
1170 | - $isShared = ($this->scopeOpeners[$tokenType]['shared'] === true); |
|
1171 | - |
|
1172 | - if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
1173 | - // We've been here before. |
|
1174 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1175 | - echo str_repeat("\t", $depth); |
|
1176 | - echo '* already processed, skipping *'.PHP_EOL; |
|
1177 | - } |
|
1178 | - |
|
1179 | - if ($isShared === false |
|
1180 | - && isset($this->tokens[$i]['scope_closer']) === true |
|
1181 | - ) { |
|
1182 | - $i = $this->tokens[$i]['scope_closer']; |
|
1183 | - } |
|
1184 | - |
|
1185 | - continue; |
|
1186 | - } else if ($currType === $tokenType |
|
1187 | - && $isShared === false |
|
1188 | - && $opener === null |
|
1189 | - ) { |
|
1190 | - // We haven't yet found our opener, but we have found another |
|
1191 | - // scope opener which is the same type as us, and we don't |
|
1192 | - // share openers, so we will never find one. |
|
1193 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1194 | - echo str_repeat("\t", $depth); |
|
1195 | - echo '* it was another token\'s opener, bailing *'.PHP_EOL; |
|
1196 | - } |
|
1197 | - |
|
1198 | - return $stackPtr; |
|
1199 | - } else { |
|
1200 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1201 | - echo str_repeat("\t", $depth); |
|
1202 | - echo '* searching for opener *'.PHP_EOL; |
|
1203 | - } |
|
1204 | - |
|
1205 | - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { |
|
1206 | - $oldIgnore = $ignore; |
|
1207 | - $ignore = 0; |
|
1208 | - } |
|
1209 | - |
|
1210 | - // PHP has a max nesting level for functions. Stop before we hit that limit |
|
1211 | - // because too many loops means we've run into trouble anyway. |
|
1212 | - if ($depth > 50) { |
|
1213 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1214 | - echo str_repeat("\t", $depth); |
|
1215 | - echo '* reached maximum nesting level; aborting *'.PHP_EOL; |
|
1216 | - } |
|
1217 | - |
|
1218 | - throw new RuntimeException('Maximum nesting level reached; file could not be processed'); |
|
1219 | - } |
|
1220 | - |
|
1221 | - $oldDepth = $depth; |
|
1222 | - if ($isShared === true |
|
1223 | - && isset($this->scopeOpeners[$tokenType]['with'][$currType]) === true |
|
1224 | - ) { |
|
1225 | - // Don't allow the depth to increment because this is |
|
1226 | - // possibly not a true nesting if we are sharing our closer. |
|
1227 | - // This can happen, for example, when a SWITCH has a large |
|
1228 | - // number of CASE statements with the same shared BREAK. |
|
1229 | - $depth--; |
|
1230 | - } |
|
1231 | - |
|
1232 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1233 | - $depth = $oldDepth; |
|
1234 | - |
|
1235 | - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { |
|
1236 | - $ignore = $oldIgnore; |
|
1237 | - } |
|
1238 | - }//end if |
|
1239 | - }//end if |
|
1240 | - |
|
1241 | - if (isset($this->scopeOpeners[$currType]['start'][$tokenType]) === true |
|
1242 | - && $opener === null |
|
1243 | - ) { |
|
1244 | - if ($tokenType === T_OPEN_CURLY_BRACKET) { |
|
1245 | - if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true |
|
1246 | - && $i < $this->tokens[$stackPtr]['parenthesis_closer'] |
|
1247 | - ) { |
|
1248 | - // We found a curly brace inside the condition of the |
|
1249 | - // current scope opener, so it must be a string offset. |
|
1250 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1251 | - echo str_repeat("\t", $depth); |
|
1252 | - echo '* ignoring curly brace inside condition *'.PHP_EOL; |
|
1253 | - } |
|
1254 | - |
|
1255 | - $ignore++; |
|
1256 | - } else { |
|
1257 | - // Make sure this is actually an opener and not a |
|
1258 | - // string offset (e.g., $var{0}). |
|
1259 | - for ($x = ($i - 1); $x > 0; $x--) { |
|
1260 | - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { |
|
1261 | - continue; |
|
1262 | - } else { |
|
1263 | - // If the first non-whitespace/comment token looks like this |
|
1264 | - // brace is a string offset, or this brace is mid-way through |
|
1265 | - // a new statement, it isn't a scope opener. |
|
1266 | - $disallowed = Util\Tokens::$assignmentTokens; |
|
1267 | - $disallowed += [ |
|
1268 | - T_DOLLAR => true, |
|
1269 | - T_VARIABLE => true, |
|
1270 | - T_OBJECT_OPERATOR => true, |
|
1271 | - T_COMMA => true, |
|
1272 | - T_OPEN_PARENTHESIS => true, |
|
1273 | - ]; |
|
1274 | - |
|
1275 | - if (isset($disallowed[$this->tokens[$x]['code']]) === true) { |
|
1276 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1277 | - echo str_repeat("\t", $depth); |
|
1278 | - echo '* ignoring curly brace *'.PHP_EOL; |
|
1279 | - } |
|
1280 | - |
|
1281 | - $ignore++; |
|
1282 | - } |
|
1283 | - |
|
1284 | - break; |
|
1285 | - }//end if |
|
1286 | - }//end for |
|
1287 | - }//end if |
|
1288 | - }//end if |
|
1289 | - |
|
1290 | - if ($ignore === 0 || $tokenType !== T_OPEN_CURLY_BRACKET) { |
|
1291 | - // We found the opening scope token for $currType. |
|
1292 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1293 | - $type = $this->tokens[$stackPtr]['type']; |
|
1294 | - echo str_repeat("\t", $depth); |
|
1295 | - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; |
|
1296 | - } |
|
1297 | - |
|
1298 | - $opener = $i; |
|
1299 | - } |
|
1300 | - } else if ($tokenType === T_OPEN_PARENTHESIS) { |
|
1301 | - if (isset($this->tokens[$i]['parenthesis_owner']) === true) { |
|
1302 | - $owner = $this->tokens[$i]['parenthesis_owner']; |
|
1303 | - if (isset(Util\Tokens::$scopeOpeners[$this->tokens[$owner]['code']]) === true |
|
1304 | - && isset($this->tokens[$i]['parenthesis_closer']) === true |
|
1305 | - ) { |
|
1306 | - // If we get into here, then we opened a parenthesis for |
|
1307 | - // a scope (eg. an if or else if) so we need to update the |
|
1308 | - // start of the line so that when we check to see |
|
1309 | - // if the closing parenthesis is more than 3 lines away from |
|
1310 | - // the statement, we check from the closing parenthesis. |
|
1311 | - $startLine = $this->tokens[$this->tokens[$i]['parenthesis_closer']]['line']; |
|
1312 | - } |
|
1313 | - } |
|
1314 | - } else if ($tokenType === T_OPEN_CURLY_BRACKET && $opener !== null) { |
|
1315 | - // We opened something that we don't have a scope opener for. |
|
1316 | - // Examples of this are curly brackets for string offsets etc. |
|
1317 | - // We want to ignore this so that we don't have an invalid scope |
|
1318 | - // map. |
|
1319 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1320 | - echo str_repeat("\t", $depth); |
|
1321 | - echo '* ignoring curly brace *'.PHP_EOL; |
|
1322 | - } |
|
1323 | - |
|
1324 | - $ignore++; |
|
1325 | - } else if ($tokenType === T_CLOSE_CURLY_BRACKET && $ignore > 0) { |
|
1326 | - // We found the end token for the opener we were ignoring. |
|
1327 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1328 | - echo str_repeat("\t", $depth); |
|
1329 | - echo '* finished ignoring curly brace *'.PHP_EOL; |
|
1330 | - } |
|
1331 | - |
|
1332 | - $ignore--; |
|
1333 | - } else if ($opener === null |
|
1334 | - && isset($this->scopeOpeners[$currType]) === true |
|
1335 | - ) { |
|
1336 | - // If we still haven't found the opener after 30 lines, |
|
1337 | - // we're not going to find it, unless we know it requires |
|
1338 | - // an opener (in which case we better keep looking) or the last |
|
1339 | - // token was empty (in which case we'll just confirm there is |
|
1340 | - // more code in this file and not just a big comment). |
|
1341 | - if ($this->tokens[$i]['line'] >= ($startLine + 30) |
|
1342 | - && isset(Util\Tokens::$emptyTokens[$this->tokens[($i - 1)]['code']]) === false |
|
1343 | - ) { |
|
1344 | - if ($this->scopeOpeners[$currType]['strict'] === true) { |
|
1345 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1346 | - $type = $this->tokens[$stackPtr]['type']; |
|
1347 | - $lines = ($this->tokens[$i]['line'] - $startLine); |
|
1348 | - echo str_repeat("\t", $depth); |
|
1349 | - echo "=> Still looking for $stackPtr:$type scope opener after $lines lines".PHP_EOL; |
|
1350 | - } |
|
1351 | - } else { |
|
1352 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1353 | - $type = $this->tokens[$stackPtr]['type']; |
|
1354 | - echo str_repeat("\t", $depth); |
|
1355 | - echo "=> Couldn't find scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
1356 | - } |
|
1357 | - |
|
1358 | - return $stackPtr; |
|
1359 | - } |
|
1360 | - } |
|
1361 | - } else if ($opener !== null |
|
1362 | - && $tokenType !== T_BREAK |
|
1363 | - && isset($this->endScopeTokens[$tokenType]) === true |
|
1364 | - ) { |
|
1365 | - if (isset($this->tokens[$i]['scope_condition']) === false) { |
|
1366 | - if ($ignore > 0) { |
|
1367 | - // We found the end token for the opener we were ignoring. |
|
1368 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1369 | - echo str_repeat("\t", $depth); |
|
1370 | - echo '* finished ignoring curly brace *'.PHP_EOL; |
|
1371 | - } |
|
1372 | - |
|
1373 | - $ignore--; |
|
1374 | - } else { |
|
1375 | - // We found a token that closes the scope but it doesn't |
|
1376 | - // have a condition, so it belongs to another token and |
|
1377 | - // our token doesn't have a closer, so pretend this is |
|
1378 | - // the closer. |
|
1379 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1380 | - $type = $this->tokens[$stackPtr]['type']; |
|
1381 | - echo str_repeat("\t", $depth); |
|
1382 | - echo "=> Found (unexpected) scope closer for $stackPtr:$type".PHP_EOL; |
|
1383 | - } |
|
1384 | - |
|
1385 | - foreach ([$stackPtr, $opener] as $token) { |
|
1386 | - $this->tokens[$token]['scope_condition'] = $stackPtr; |
|
1387 | - $this->tokens[$token]['scope_opener'] = $opener; |
|
1388 | - $this->tokens[$token]['scope_closer'] = $i; |
|
1389 | - } |
|
1390 | - |
|
1391 | - return ($i - 1); |
|
1392 | - }//end if |
|
1393 | - }//end if |
|
1394 | - }//end if |
|
1395 | - }//end for |
|
1396 | - |
|
1397 | - return $stackPtr; |
|
1398 | - |
|
1399 | - }//end recurseScopeMap() |
|
1400 | - |
|
1401 | - |
|
1402 | - /** |
|
1403 | - * Constructs the level map. |
|
1404 | - * |
|
1405 | - * The level map adds a 'level' index to each token which indicates the |
|
1406 | - * depth that a token within a set of scope blocks. It also adds a |
|
1407 | - * 'conditions' index which is an array of the scope conditions that opened |
|
1408 | - * each of the scopes - position 0 being the first scope opener. |
|
1409 | - * |
|
1410 | - * @return void |
|
1411 | - */ |
|
1412 | - private function createLevelMap() |
|
1413 | - { |
|
1414 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1415 | - echo "\t*** START LEVEL MAP ***".PHP_EOL; |
|
1416 | - } |
|
1417 | - |
|
1418 | - $this->numTokens = count($this->tokens); |
|
1419 | - $level = 0; |
|
1420 | - $conditions = []; |
|
1421 | - $lastOpener = null; |
|
1422 | - $openers = []; |
|
1423 | - |
|
1424 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
1425 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1426 | - $type = $this->tokens[$i]['type']; |
|
1427 | - $line = $this->tokens[$i]['line']; |
|
1428 | - $len = $this->tokens[$i]['length']; |
|
1429 | - $col = $this->tokens[$i]['column']; |
|
1430 | - |
|
1431 | - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
1432 | - |
|
1433 | - echo str_repeat("\t", ($level + 1)); |
|
1434 | - echo "Process token $i on line $line [col:$col;len:$len;lvl:$level;"; |
|
1435 | - if (empty($conditions) !== true) { |
|
1436 | - $condString = 'conds;'; |
|
1437 | - foreach ($conditions as $condition) { |
|
1438 | - $condString .= Util\Tokens::tokenName($condition).','; |
|
1439 | - } |
|
1440 | - |
|
1441 | - echo rtrim($condString, ',').';'; |
|
1442 | - } |
|
1443 | - |
|
1444 | - echo "]: $type => $content".PHP_EOL; |
|
1445 | - }//end if |
|
1446 | - |
|
1447 | - $this->tokens[$i]['level'] = $level; |
|
1448 | - $this->tokens[$i]['conditions'] = $conditions; |
|
1449 | - |
|
1450 | - if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
1451 | - // Check to see if this token opened the scope. |
|
1452 | - if ($this->tokens[$i]['scope_opener'] === $i) { |
|
1453 | - $stackPtr = $this->tokens[$i]['scope_condition']; |
|
1454 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1455 | - $type = $this->tokens[$stackPtr]['type']; |
|
1456 | - echo str_repeat("\t", ($level + 1)); |
|
1457 | - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; |
|
1458 | - } |
|
1459 | - |
|
1460 | - $stackPtr = $this->tokens[$i]['scope_condition']; |
|
1461 | - |
|
1462 | - // If we find a scope opener that has a shared closer, |
|
1463 | - // then we need to go back over the condition map that we |
|
1464 | - // just created and fix ourselves as we just added some |
|
1465 | - // conditions where there was none. This happens for T_CASE |
|
1466 | - // statements that are using the same break statement. |
|
1467 | - if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $this->tokens[$i]['scope_closer']) { |
|
1468 | - // This opener shares its closer with the previous opener, |
|
1469 | - // but we still need to check if the two openers share their |
|
1470 | - // closer with each other directly (like CASE and DEFAULT) |
|
1471 | - // or if they are just sharing because one doesn't have a |
|
1472 | - // closer (like CASE with no BREAK using a SWITCHes closer). |
|
1473 | - $thisType = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; |
|
1474 | - $opener = $this->tokens[$lastOpener]['scope_condition']; |
|
1475 | - |
|
1476 | - $isShared = isset($this->scopeOpeners[$thisType]['with'][$this->tokens[$opener]['code']]); |
|
1477 | - |
|
1478 | - reset($this->scopeOpeners[$thisType]['end']); |
|
1479 | - reset($this->scopeOpeners[$this->tokens[$opener]['code']]['end']); |
|
1480 | - $sameEnd = (current($this->scopeOpeners[$thisType]['end']) === current($this->scopeOpeners[$this->tokens[$opener]['code']]['end'])); |
|
1481 | - |
|
1482 | - if ($isShared === true && $sameEnd === true) { |
|
1483 | - $badToken = $opener; |
|
1484 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1485 | - $type = $this->tokens[$badToken]['type']; |
|
1486 | - echo str_repeat("\t", ($level + 1)); |
|
1487 | - echo "* shared closer, cleaning up $badToken:$type *".PHP_EOL; |
|
1488 | - } |
|
1489 | - |
|
1490 | - for ($x = $this->tokens[$i]['scope_condition']; $x <= $i; $x++) { |
|
1491 | - $oldConditions = $this->tokens[$x]['conditions']; |
|
1492 | - $oldLevel = $this->tokens[$x]['level']; |
|
1493 | - $this->tokens[$x]['level']--; |
|
1494 | - unset($this->tokens[$x]['conditions'][$badToken]); |
|
1495 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1496 | - $type = $this->tokens[$x]['type']; |
|
1497 | - $oldConds = ''; |
|
1498 | - foreach ($oldConditions as $condition) { |
|
1499 | - $oldConds .= Util\Tokens::tokenName($condition).','; |
|
1500 | - } |
|
1501 | - |
|
1502 | - $oldConds = rtrim($oldConds, ','); |
|
1503 | - |
|
1504 | - $newConds = ''; |
|
1505 | - foreach ($this->tokens[$x]['conditions'] as $condition) { |
|
1506 | - $newConds .= Util\Tokens::tokenName($condition).','; |
|
1507 | - } |
|
1508 | - |
|
1509 | - $newConds = rtrim($newConds, ','); |
|
1510 | - |
|
1511 | - $newLevel = $this->tokens[$x]['level']; |
|
1512 | - echo str_repeat("\t", ($level + 1)); |
|
1513 | - echo "* cleaned $x:$type *".PHP_EOL; |
|
1514 | - echo str_repeat("\t", ($level + 2)); |
|
1515 | - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; |
|
1516 | - echo str_repeat("\t", ($level + 2)); |
|
1517 | - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; |
|
1518 | - }//end if |
|
1519 | - }//end for |
|
1520 | - |
|
1521 | - unset($conditions[$badToken]); |
|
1522 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1523 | - $type = $this->tokens[$badToken]['type']; |
|
1524 | - echo str_repeat("\t", ($level + 1)); |
|
1525 | - echo "* token $badToken:$type removed from conditions array *".PHP_EOL; |
|
1526 | - } |
|
1527 | - |
|
1528 | - unset($openers[$lastOpener]); |
|
1529 | - |
|
1530 | - $level--; |
|
1531 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1532 | - echo str_repeat("\t", ($level + 2)); |
|
1533 | - echo '* level decreased *'.PHP_EOL; |
|
1534 | - } |
|
1535 | - }//end if |
|
1536 | - }//end if |
|
1537 | - |
|
1538 | - $level++; |
|
1539 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1540 | - echo str_repeat("\t", ($level + 1)); |
|
1541 | - echo '* level increased *'.PHP_EOL; |
|
1542 | - } |
|
1543 | - |
|
1544 | - $conditions[$stackPtr] = $this->tokens[$stackPtr]['code']; |
|
1545 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1546 | - $type = $this->tokens[$stackPtr]['type']; |
|
1547 | - echo str_repeat("\t", ($level + 1)); |
|
1548 | - echo "* token $stackPtr:$type added to conditions array *".PHP_EOL; |
|
1549 | - } |
|
1550 | - |
|
1551 | - $lastOpener = $this->tokens[$i]['scope_opener']; |
|
1552 | - if ($lastOpener !== null) { |
|
1553 | - $openers[$lastOpener] = $lastOpener; |
|
1554 | - } |
|
1555 | - } else if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $i) { |
|
1556 | - foreach (array_reverse($openers) as $opener) { |
|
1557 | - if ($this->tokens[$opener]['scope_closer'] === $i) { |
|
1558 | - $oldOpener = array_pop($openers); |
|
1559 | - if (empty($openers) === false) { |
|
1560 | - $lastOpener = array_pop($openers); |
|
1561 | - $openers[$lastOpener] = $lastOpener; |
|
1562 | - } else { |
|
1563 | - $lastOpener = null; |
|
1564 | - } |
|
1565 | - |
|
1566 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1567 | - $type = $this->tokens[$oldOpener]['type']; |
|
1568 | - echo str_repeat("\t", ($level + 1)); |
|
1569 | - echo "=> Found scope closer for $oldOpener:$type".PHP_EOL; |
|
1570 | - } |
|
1571 | - |
|
1572 | - $oldCondition = array_pop($conditions); |
|
1573 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1574 | - echo str_repeat("\t", ($level + 1)); |
|
1575 | - echo '* token '.Util\Tokens::tokenName($oldCondition).' removed from conditions array *'.PHP_EOL; |
|
1576 | - } |
|
1577 | - |
|
1578 | - // Make sure this closer actually belongs to us. |
|
1579 | - // Either the condition also has to think this is the |
|
1580 | - // closer, or it has to allow sharing with us. |
|
1581 | - $condition = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; |
|
1582 | - if ($condition !== $oldCondition) { |
|
1583 | - if (isset($this->scopeOpeners[$oldCondition]['with'][$condition]) === false) { |
|
1584 | - $badToken = $this->tokens[$oldOpener]['scope_condition']; |
|
1585 | - |
|
1586 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1587 | - $type = Util\Tokens::tokenName($oldCondition); |
|
1588 | - echo str_repeat("\t", ($level + 1)); |
|
1589 | - echo "* scope closer was bad, cleaning up $badToken:$type *".PHP_EOL; |
|
1590 | - } |
|
1591 | - |
|
1592 | - for ($x = ($oldOpener + 1); $x <= $i; $x++) { |
|
1593 | - $oldConditions = $this->tokens[$x]['conditions']; |
|
1594 | - $oldLevel = $this->tokens[$x]['level']; |
|
1595 | - $this->tokens[$x]['level']--; |
|
1596 | - unset($this->tokens[$x]['conditions'][$badToken]); |
|
1597 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1598 | - $type = $this->tokens[$x]['type']; |
|
1599 | - $oldConds = ''; |
|
1600 | - foreach ($oldConditions as $condition) { |
|
1601 | - $oldConds .= Util\Tokens::tokenName($condition).','; |
|
1602 | - } |
|
1603 | - |
|
1604 | - $oldConds = rtrim($oldConds, ','); |
|
1605 | - |
|
1606 | - $newConds = ''; |
|
1607 | - foreach ($this->tokens[$x]['conditions'] as $condition) { |
|
1608 | - $newConds .= Util\Tokens::tokenName($condition).','; |
|
1609 | - } |
|
1610 | - |
|
1611 | - $newConds = rtrim($newConds, ','); |
|
1612 | - |
|
1613 | - $newLevel = $this->tokens[$x]['level']; |
|
1614 | - echo str_repeat("\t", ($level + 1)); |
|
1615 | - echo "* cleaned $x:$type *".PHP_EOL; |
|
1616 | - echo str_repeat("\t", ($level + 2)); |
|
1617 | - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; |
|
1618 | - echo str_repeat("\t", ($level + 2)); |
|
1619 | - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; |
|
1620 | - }//end if |
|
1621 | - }//end for |
|
1622 | - }//end if |
|
1623 | - }//end if |
|
1624 | - |
|
1625 | - $level--; |
|
1626 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1627 | - echo str_repeat("\t", ($level + 2)); |
|
1628 | - echo '* level decreased *'.PHP_EOL; |
|
1629 | - } |
|
1630 | - |
|
1631 | - $this->tokens[$i]['level'] = $level; |
|
1632 | - $this->tokens[$i]['conditions'] = $conditions; |
|
1633 | - }//end if |
|
1634 | - }//end foreach |
|
1635 | - }//end if |
|
1636 | - }//end if |
|
1637 | - }//end for |
|
1638 | - |
|
1639 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1640 | - echo "\t*** END LEVEL MAP ***".PHP_EOL; |
|
1641 | - } |
|
1642 | - |
|
1643 | - }//end createLevelMap() |
|
724 | + switch ($this->tokens[$i]['code']) { |
|
725 | + case T_OPEN_SQUARE_BRACKET: |
|
726 | + $squareOpeners[] = $i; |
|
727 | + |
|
728 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
729 | + echo str_repeat("\t", count($squareOpeners)); |
|
730 | + echo str_repeat("\t", count($curlyOpeners)); |
|
731 | + echo "=> Found square bracket opener at $i".PHP_EOL; |
|
732 | + } |
|
733 | + break; |
|
734 | + case T_OPEN_CURLY_BRACKET: |
|
735 | + if (isset($this->tokens[$i]['scope_closer']) === false) { |
|
736 | + $curlyOpeners[] = $i; |
|
737 | + |
|
738 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
739 | + echo str_repeat("\t", count($squareOpeners)); |
|
740 | + echo str_repeat("\t", count($curlyOpeners)); |
|
741 | + echo "=> Found curly bracket opener at $i".PHP_EOL; |
|
742 | + } |
|
743 | + } |
|
744 | + break; |
|
745 | + case T_CLOSE_SQUARE_BRACKET: |
|
746 | + if (empty($squareOpeners) === false) { |
|
747 | + $opener = array_pop($squareOpeners); |
|
748 | + $this->tokens[$i]['bracket_opener'] = $opener; |
|
749 | + $this->tokens[$i]['bracket_closer'] = $i; |
|
750 | + $this->tokens[$opener]['bracket_opener'] = $opener; |
|
751 | + $this->tokens[$opener]['bracket_closer'] = $i; |
|
752 | + |
|
753 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
754 | + echo str_repeat("\t", count($squareOpeners)); |
|
755 | + echo str_repeat("\t", count($curlyOpeners)); |
|
756 | + echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; |
|
757 | + } |
|
758 | + } |
|
759 | + break; |
|
760 | + case T_CLOSE_CURLY_BRACKET: |
|
761 | + if (empty($curlyOpeners) === false |
|
762 | + && isset($this->tokens[$i]['scope_opener']) === false |
|
763 | + ) { |
|
764 | + $opener = array_pop($curlyOpeners); |
|
765 | + $this->tokens[$i]['bracket_opener'] = $opener; |
|
766 | + $this->tokens[$i]['bracket_closer'] = $i; |
|
767 | + $this->tokens[$opener]['bracket_opener'] = $opener; |
|
768 | + $this->tokens[$opener]['bracket_closer'] = $i; |
|
769 | + |
|
770 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
771 | + echo str_repeat("\t", count($squareOpeners)); |
|
772 | + echo str_repeat("\t", count($curlyOpeners)); |
|
773 | + echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; |
|
774 | + } |
|
775 | + } |
|
776 | + break; |
|
777 | + default: |
|
778 | + continue 2; |
|
779 | + }//end switch |
|
780 | + }//end for |
|
781 | + |
|
782 | + // Cleanup for any openers that we didn't find closers for. |
|
783 | + // This typically means there was a syntax error breaking things. |
|
784 | + foreach ($openers as $opener) { |
|
785 | + unset($this->tokens[$opener]['parenthesis_opener']); |
|
786 | + unset($this->tokens[$opener]['parenthesis_owner']); |
|
787 | + } |
|
788 | + |
|
789 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
790 | + echo "\t*** END TOKEN MAP ***".PHP_EOL; |
|
791 | + } |
|
792 | + |
|
793 | + }//end createTokenMap() |
|
794 | + |
|
795 | + |
|
796 | + /** |
|
797 | + * Creates a map for the parenthesis tokens that surround other tokens. |
|
798 | + * |
|
799 | + * @return void |
|
800 | + */ |
|
801 | + private function createParenthesisNestingMap() |
|
802 | + { |
|
803 | + $map = []; |
|
804 | + for ($i = 0; $i < $this->numTokens; $i++) { |
|
805 | + if (isset($this->tokens[$i]['parenthesis_opener']) === true |
|
806 | + && $i === $this->tokens[$i]['parenthesis_opener'] |
|
807 | + ) { |
|
808 | + if (empty($map) === false) { |
|
809 | + $this->tokens[$i]['nested_parenthesis'] = $map; |
|
810 | + } |
|
811 | + |
|
812 | + if (isset($this->tokens[$i]['parenthesis_closer']) === true) { |
|
813 | + $map[$this->tokens[$i]['parenthesis_opener']] |
|
814 | + = $this->tokens[$i]['parenthesis_closer']; |
|
815 | + } |
|
816 | + } else if (isset($this->tokens[$i]['parenthesis_closer']) === true |
|
817 | + && $i === $this->tokens[$i]['parenthesis_closer'] |
|
818 | + ) { |
|
819 | + array_pop($map); |
|
820 | + if (empty($map) === false) { |
|
821 | + $this->tokens[$i]['nested_parenthesis'] = $map; |
|
822 | + } |
|
823 | + } else { |
|
824 | + if (empty($map) === false) { |
|
825 | + $this->tokens[$i]['nested_parenthesis'] = $map; |
|
826 | + } |
|
827 | + }//end if |
|
828 | + }//end for |
|
829 | + |
|
830 | + }//end createParenthesisNestingMap() |
|
831 | + |
|
832 | + |
|
833 | + /** |
|
834 | + * Creates a scope map of tokens that open scopes. |
|
835 | + * |
|
836 | + * @return void |
|
837 | + * @see recurseScopeMap() |
|
838 | + */ |
|
839 | + private function createScopeMap() |
|
840 | + { |
|
841 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
842 | + echo "\t*** START SCOPE MAP ***".PHP_EOL; |
|
843 | + } |
|
844 | + |
|
845 | + for ($i = 0; $i < $this->numTokens; $i++) { |
|
846 | + // Check to see if the current token starts a new scope. |
|
847 | + if (isset($this->scopeOpeners[$this->tokens[$i]['code']]) === true) { |
|
848 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
849 | + $type = $this->tokens[$i]['type']; |
|
850 | + $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
851 | + echo "\tStart scope map at $i:$type => $content".PHP_EOL; |
|
852 | + } |
|
853 | + |
|
854 | + if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
855 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
856 | + echo "\t* already processed, skipping *".PHP_EOL; |
|
857 | + } |
|
858 | + |
|
859 | + continue; |
|
860 | + } |
|
861 | + |
|
862 | + $i = $this->recurseScopeMap($i); |
|
863 | + }//end if |
|
864 | + }//end for |
|
865 | + |
|
866 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
867 | + echo "\t*** END SCOPE MAP ***".PHP_EOL; |
|
868 | + } |
|
869 | + |
|
870 | + }//end createScopeMap() |
|
871 | + |
|
872 | + |
|
873 | + /** |
|
874 | + * Recurses though the scope openers to build a scope map. |
|
875 | + * |
|
876 | + * @param int $stackPtr The position in the stack of the token that |
|
877 | + * opened the scope (eg. an IF token or FOR token). |
|
878 | + * @param int $depth How many scope levels down we are. |
|
879 | + * @param int $ignore How many curly braces we are ignoring. |
|
880 | + * |
|
881 | + * @return int The position in the stack that closed the scope. |
|
882 | + */ |
|
883 | + private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) |
|
884 | + { |
|
885 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
886 | + echo str_repeat("\t", $depth); |
|
887 | + echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; |
|
888 | + } |
|
889 | + |
|
890 | + $opener = null; |
|
891 | + $currType = $this->tokens[$stackPtr]['code']; |
|
892 | + $startLine = $this->tokens[$stackPtr]['line']; |
|
893 | + |
|
894 | + // We will need this to restore the value if we end up |
|
895 | + // returning a token ID that causes our calling function to go back |
|
896 | + // over already ignored braces. |
|
897 | + $originalIgnore = $ignore; |
|
898 | + |
|
899 | + // If the start token for this scope opener is the same as |
|
900 | + // the scope token, we have already found our opener. |
|
901 | + if (isset($this->scopeOpeners[$currType]['start'][$currType]) === true) { |
|
902 | + $opener = $stackPtr; |
|
903 | + } |
|
904 | + |
|
905 | + for ($i = ($stackPtr + 1); $i < $this->numTokens; $i++) { |
|
906 | + $tokenType = $this->tokens[$i]['code']; |
|
907 | + |
|
908 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
909 | + $type = $this->tokens[$i]['type']; |
|
910 | + $line = $this->tokens[$i]['line']; |
|
911 | + $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
912 | + |
|
913 | + echo str_repeat("\t", $depth); |
|
914 | + echo "Process token $i on line $line ["; |
|
915 | + if ($opener !== null) { |
|
916 | + echo "opener:$opener;"; |
|
917 | + } |
|
918 | + |
|
919 | + if ($ignore > 0) { |
|
920 | + echo "ignore=$ignore;"; |
|
921 | + } |
|
922 | + |
|
923 | + echo "]: $type => $content".PHP_EOL; |
|
924 | + }//end if |
|
925 | + |
|
926 | + // Very special case for IF statements in PHP that can be defined without |
|
927 | + // scope tokens. E.g., if (1) 1; 1 ? (1 ? 1 : 1) : 1; |
|
928 | + // If an IF statement below this one has an opener but no |
|
929 | + // keyword, the opener will be incorrectly assigned to this IF statement. |
|
930 | + // The same case also applies to USE statements, which don't have to have |
|
931 | + // openers, so a following USE statement can cause an incorrect brace match. |
|
932 | + if (($currType === T_IF || $currType === T_ELSE || $currType === T_USE) |
|
933 | + && $opener === null |
|
934 | + && ($this->tokens[$i]['code'] === T_SEMICOLON |
|
935 | + || $this->tokens[$i]['code'] === T_CLOSE_TAG) |
|
936 | + ) { |
|
937 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
938 | + $type = $this->tokens[$stackPtr]['type']; |
|
939 | + echo str_repeat("\t", $depth); |
|
940 | + if ($this->tokens[$i]['code'] === T_SEMICOLON) { |
|
941 | + $closerType = 'semicolon'; |
|
942 | + } else { |
|
943 | + $closerType = 'close tag'; |
|
944 | + } |
|
945 | + |
|
946 | + echo "=> Found $closerType before scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
947 | + } |
|
948 | + |
|
949 | + return $i; |
|
950 | + } |
|
951 | + |
|
952 | + // Special case for PHP control structures that have no braces. |
|
953 | + // If we find a curly brace closer before we find the opener, |
|
954 | + // we're not going to find an opener. That closer probably belongs to |
|
955 | + // a control structure higher up. |
|
956 | + if ($opener === null |
|
957 | + && $ignore === 0 |
|
958 | + && $tokenType === T_CLOSE_CURLY_BRACKET |
|
959 | + && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true |
|
960 | + ) { |
|
961 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
962 | + $type = $this->tokens[$stackPtr]['type']; |
|
963 | + echo str_repeat("\t", $depth); |
|
964 | + echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
965 | + } |
|
966 | + |
|
967 | + return ($i - 1); |
|
968 | + } |
|
969 | + |
|
970 | + if ($opener !== null |
|
971 | + && (isset($this->tokens[$i]['scope_opener']) === false |
|
972 | + || $this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) |
|
973 | + && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true |
|
974 | + ) { |
|
975 | + if ($ignore > 0 && $tokenType === T_CLOSE_CURLY_BRACKET) { |
|
976 | + // The last opening bracket must have been for a string |
|
977 | + // offset or alike, so let's ignore it. |
|
978 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
979 | + echo str_repeat("\t", $depth); |
|
980 | + echo '* finished ignoring curly brace *'.PHP_EOL; |
|
981 | + } |
|
982 | + |
|
983 | + $ignore--; |
|
984 | + continue; |
|
985 | + } else if ($this->tokens[$opener]['code'] === T_OPEN_CURLY_BRACKET |
|
986 | + && $tokenType !== T_CLOSE_CURLY_BRACKET |
|
987 | + ) { |
|
988 | + // The opener is a curly bracket so the closer must be a curly bracket as well. |
|
989 | + // We ignore this closer to handle cases such as T_ELSE or T_ELSEIF being considered |
|
990 | + // a closer of T_IF when it should not. |
|
991 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
992 | + $type = $this->tokens[$stackPtr]['type']; |
|
993 | + echo str_repeat("\t", $depth); |
|
994 | + echo "=> Ignoring non-curly scope closer for $stackPtr:$type".PHP_EOL; |
|
995 | + } |
|
996 | + } else { |
|
997 | + $scopeCloser = $i; |
|
998 | + $todo = [ |
|
999 | + $stackPtr, |
|
1000 | + $opener, |
|
1001 | + ]; |
|
1002 | + |
|
1003 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1004 | + $type = $this->tokens[$stackPtr]['type']; |
|
1005 | + $closerType = $this->tokens[$scopeCloser]['type']; |
|
1006 | + echo str_repeat("\t", $depth); |
|
1007 | + echo "=> Found scope closer ($scopeCloser:$closerType) for $stackPtr:$type".PHP_EOL; |
|
1008 | + } |
|
1009 | + |
|
1010 | + $validCloser = true; |
|
1011 | + if (($this->tokens[$stackPtr]['code'] === T_IF || $this->tokens[$stackPtr]['code'] === T_ELSEIF) |
|
1012 | + && ($tokenType === T_ELSE || $tokenType === T_ELSEIF) |
|
1013 | + ) { |
|
1014 | + // To be a closer, this token must have an opener. |
|
1015 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1016 | + echo str_repeat("\t", $depth); |
|
1017 | + echo "* closer needs to be tested *".PHP_EOL; |
|
1018 | + } |
|
1019 | + |
|
1020 | + $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1021 | + |
|
1022 | + if (isset($this->tokens[$scopeCloser]['scope_opener']) === false) { |
|
1023 | + $validCloser = false; |
|
1024 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1025 | + echo str_repeat("\t", $depth); |
|
1026 | + echo "* closer is not valid (no opener found) *".PHP_EOL; |
|
1027 | + } |
|
1028 | + } else if ($this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['code'] !== $this->tokens[$opener]['code']) { |
|
1029 | + $validCloser = false; |
|
1030 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1031 | + echo str_repeat("\t", $depth); |
|
1032 | + $type = $this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['type']; |
|
1033 | + $openerType = $this->tokens[$opener]['type']; |
|
1034 | + echo "* closer is not valid (mismatched opener type; $type != $openerType) *".PHP_EOL; |
|
1035 | + } |
|
1036 | + } else if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1037 | + echo str_repeat("\t", $depth); |
|
1038 | + echo "* closer was valid *".PHP_EOL; |
|
1039 | + } |
|
1040 | + } else { |
|
1041 | + // The closer was not processed, so we need to |
|
1042 | + // complete that token as well. |
|
1043 | + $todo[] = $scopeCloser; |
|
1044 | + }//end if |
|
1045 | + |
|
1046 | + if ($validCloser === true) { |
|
1047 | + foreach ($todo as $token) { |
|
1048 | + $this->tokens[$token]['scope_condition'] = $stackPtr; |
|
1049 | + $this->tokens[$token]['scope_opener'] = $opener; |
|
1050 | + $this->tokens[$token]['scope_closer'] = $scopeCloser; |
|
1051 | + } |
|
1052 | + |
|
1053 | + if ($this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) { |
|
1054 | + // As we are going back to where we started originally, restore |
|
1055 | + // the ignore value back to its original value. |
|
1056 | + $ignore = $originalIgnore; |
|
1057 | + return $opener; |
|
1058 | + } else if ($scopeCloser === $i |
|
1059 | + && isset($this->scopeOpeners[$tokenType]) === true |
|
1060 | + ) { |
|
1061 | + // Unset scope_condition here or else the token will appear to have |
|
1062 | + // already been processed, and it will be skipped. Normally we want that, |
|
1063 | + // but in this case, the token is both a closer and an opener, so |
|
1064 | + // it needs to act like an opener. This is also why we return the |
|
1065 | + // token before this one; so the closer has a chance to be processed |
|
1066 | + // a second time, but as an opener. |
|
1067 | + unset($this->tokens[$scopeCloser]['scope_condition']); |
|
1068 | + return ($i - 1); |
|
1069 | + } else { |
|
1070 | + return $i; |
|
1071 | + } |
|
1072 | + } else { |
|
1073 | + continue; |
|
1074 | + }//end if |
|
1075 | + }//end if |
|
1076 | + }//end if |
|
1077 | + |
|
1078 | + // Is this an opening condition ? |
|
1079 | + if (isset($this->scopeOpeners[$tokenType]) === true) { |
|
1080 | + if ($opener === null) { |
|
1081 | + if ($tokenType === T_USE) { |
|
1082 | + // PHP use keywords are special because they can be |
|
1083 | + // used as blocks but also inline in function definitions. |
|
1084 | + // So if we find them nested inside another opener, just skip them. |
|
1085 | + continue; |
|
1086 | + } |
|
1087 | + |
|
1088 | + if ($tokenType === T_FUNCTION |
|
1089 | + && $this->tokens[$stackPtr]['code'] !== T_FUNCTION |
|
1090 | + ) { |
|
1091 | + // Probably a closure, so process it manually. |
|
1092 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1093 | + $type = $this->tokens[$stackPtr]['type']; |
|
1094 | + echo str_repeat("\t", $depth); |
|
1095 | + echo "=> Found function before scope opener for $stackPtr:$type, processing manually".PHP_EOL; |
|
1096 | + } |
|
1097 | + |
|
1098 | + if (isset($this->tokens[$i]['scope_closer']) === true) { |
|
1099 | + // We've already processed this closure. |
|
1100 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1101 | + echo str_repeat("\t", $depth); |
|
1102 | + echo '* already processed, skipping *'.PHP_EOL; |
|
1103 | + } |
|
1104 | + |
|
1105 | + $i = $this->tokens[$i]['scope_closer']; |
|
1106 | + continue; |
|
1107 | + } |
|
1108 | + |
|
1109 | + $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1110 | + continue; |
|
1111 | + }//end if |
|
1112 | + |
|
1113 | + if ($tokenType === T_CLASS) { |
|
1114 | + // Probably an anonymous class inside another anonymous class, |
|
1115 | + // so process it manually. |
|
1116 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1117 | + $type = $this->tokens[$stackPtr]['type']; |
|
1118 | + echo str_repeat("\t", $depth); |
|
1119 | + echo "=> Found class before scope opener for $stackPtr:$type, processing manually".PHP_EOL; |
|
1120 | + } |
|
1121 | + |
|
1122 | + if (isset($this->tokens[$i]['scope_closer']) === true) { |
|
1123 | + // We've already processed this anon class. |
|
1124 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1125 | + echo str_repeat("\t", $depth); |
|
1126 | + echo '* already processed, skipping *'.PHP_EOL; |
|
1127 | + } |
|
1128 | + |
|
1129 | + $i = $this->tokens[$i]['scope_closer']; |
|
1130 | + continue; |
|
1131 | + } |
|
1132 | + |
|
1133 | + $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1134 | + continue; |
|
1135 | + }//end if |
|
1136 | + |
|
1137 | + // Found another opening condition but still haven't |
|
1138 | + // found our opener, so we are never going to find one. |
|
1139 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1140 | + $type = $this->tokens[$stackPtr]['type']; |
|
1141 | + echo str_repeat("\t", $depth); |
|
1142 | + echo "=> Found new opening condition before scope opener for $stackPtr:$type, "; |
|
1143 | + } |
|
1144 | + |
|
1145 | + if (($this->tokens[$stackPtr]['code'] === T_IF |
|
1146 | + || $this->tokens[$stackPtr]['code'] === T_ELSEIF |
|
1147 | + || $this->tokens[$stackPtr]['code'] === T_ELSE) |
|
1148 | + && ($this->tokens[$i]['code'] === T_ELSE |
|
1149 | + || $this->tokens[$i]['code'] === T_ELSEIF) |
|
1150 | + ) { |
|
1151 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1152 | + echo "continuing".PHP_EOL; |
|
1153 | + } |
|
1154 | + |
|
1155 | + return ($i - 1); |
|
1156 | + } else { |
|
1157 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1158 | + echo "backtracking".PHP_EOL; |
|
1159 | + } |
|
1160 | + |
|
1161 | + return $stackPtr; |
|
1162 | + } |
|
1163 | + }//end if |
|
1164 | + |
|
1165 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1166 | + echo str_repeat("\t", $depth); |
|
1167 | + echo '* token is an opening condition *'.PHP_EOL; |
|
1168 | + } |
|
1169 | + |
|
1170 | + $isShared = ($this->scopeOpeners[$tokenType]['shared'] === true); |
|
1171 | + |
|
1172 | + if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
1173 | + // We've been here before. |
|
1174 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1175 | + echo str_repeat("\t", $depth); |
|
1176 | + echo '* already processed, skipping *'.PHP_EOL; |
|
1177 | + } |
|
1178 | + |
|
1179 | + if ($isShared === false |
|
1180 | + && isset($this->tokens[$i]['scope_closer']) === true |
|
1181 | + ) { |
|
1182 | + $i = $this->tokens[$i]['scope_closer']; |
|
1183 | + } |
|
1184 | + |
|
1185 | + continue; |
|
1186 | + } else if ($currType === $tokenType |
|
1187 | + && $isShared === false |
|
1188 | + && $opener === null |
|
1189 | + ) { |
|
1190 | + // We haven't yet found our opener, but we have found another |
|
1191 | + // scope opener which is the same type as us, and we don't |
|
1192 | + // share openers, so we will never find one. |
|
1193 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1194 | + echo str_repeat("\t", $depth); |
|
1195 | + echo '* it was another token\'s opener, bailing *'.PHP_EOL; |
|
1196 | + } |
|
1197 | + |
|
1198 | + return $stackPtr; |
|
1199 | + } else { |
|
1200 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1201 | + echo str_repeat("\t", $depth); |
|
1202 | + echo '* searching for opener *'.PHP_EOL; |
|
1203 | + } |
|
1204 | + |
|
1205 | + if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { |
|
1206 | + $oldIgnore = $ignore; |
|
1207 | + $ignore = 0; |
|
1208 | + } |
|
1209 | + |
|
1210 | + // PHP has a max nesting level for functions. Stop before we hit that limit |
|
1211 | + // because too many loops means we've run into trouble anyway. |
|
1212 | + if ($depth > 50) { |
|
1213 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1214 | + echo str_repeat("\t", $depth); |
|
1215 | + echo '* reached maximum nesting level; aborting *'.PHP_EOL; |
|
1216 | + } |
|
1217 | + |
|
1218 | + throw new RuntimeException('Maximum nesting level reached; file could not be processed'); |
|
1219 | + } |
|
1220 | + |
|
1221 | + $oldDepth = $depth; |
|
1222 | + if ($isShared === true |
|
1223 | + && isset($this->scopeOpeners[$tokenType]['with'][$currType]) === true |
|
1224 | + ) { |
|
1225 | + // Don't allow the depth to increment because this is |
|
1226 | + // possibly not a true nesting if we are sharing our closer. |
|
1227 | + // This can happen, for example, when a SWITCH has a large |
|
1228 | + // number of CASE statements with the same shared BREAK. |
|
1229 | + $depth--; |
|
1230 | + } |
|
1231 | + |
|
1232 | + $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1233 | + $depth = $oldDepth; |
|
1234 | + |
|
1235 | + if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { |
|
1236 | + $ignore = $oldIgnore; |
|
1237 | + } |
|
1238 | + }//end if |
|
1239 | + }//end if |
|
1240 | + |
|
1241 | + if (isset($this->scopeOpeners[$currType]['start'][$tokenType]) === true |
|
1242 | + && $opener === null |
|
1243 | + ) { |
|
1244 | + if ($tokenType === T_OPEN_CURLY_BRACKET) { |
|
1245 | + if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true |
|
1246 | + && $i < $this->tokens[$stackPtr]['parenthesis_closer'] |
|
1247 | + ) { |
|
1248 | + // We found a curly brace inside the condition of the |
|
1249 | + // current scope opener, so it must be a string offset. |
|
1250 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1251 | + echo str_repeat("\t", $depth); |
|
1252 | + echo '* ignoring curly brace inside condition *'.PHP_EOL; |
|
1253 | + } |
|
1254 | + |
|
1255 | + $ignore++; |
|
1256 | + } else { |
|
1257 | + // Make sure this is actually an opener and not a |
|
1258 | + // string offset (e.g., $var{0}). |
|
1259 | + for ($x = ($i - 1); $x > 0; $x--) { |
|
1260 | + if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { |
|
1261 | + continue; |
|
1262 | + } else { |
|
1263 | + // If the first non-whitespace/comment token looks like this |
|
1264 | + // brace is a string offset, or this brace is mid-way through |
|
1265 | + // a new statement, it isn't a scope opener. |
|
1266 | + $disallowed = Util\Tokens::$assignmentTokens; |
|
1267 | + $disallowed += [ |
|
1268 | + T_DOLLAR => true, |
|
1269 | + T_VARIABLE => true, |
|
1270 | + T_OBJECT_OPERATOR => true, |
|
1271 | + T_COMMA => true, |
|
1272 | + T_OPEN_PARENTHESIS => true, |
|
1273 | + ]; |
|
1274 | + |
|
1275 | + if (isset($disallowed[$this->tokens[$x]['code']]) === true) { |
|
1276 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1277 | + echo str_repeat("\t", $depth); |
|
1278 | + echo '* ignoring curly brace *'.PHP_EOL; |
|
1279 | + } |
|
1280 | + |
|
1281 | + $ignore++; |
|
1282 | + } |
|
1283 | + |
|
1284 | + break; |
|
1285 | + }//end if |
|
1286 | + }//end for |
|
1287 | + }//end if |
|
1288 | + }//end if |
|
1289 | + |
|
1290 | + if ($ignore === 0 || $tokenType !== T_OPEN_CURLY_BRACKET) { |
|
1291 | + // We found the opening scope token for $currType. |
|
1292 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1293 | + $type = $this->tokens[$stackPtr]['type']; |
|
1294 | + echo str_repeat("\t", $depth); |
|
1295 | + echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; |
|
1296 | + } |
|
1297 | + |
|
1298 | + $opener = $i; |
|
1299 | + } |
|
1300 | + } else if ($tokenType === T_OPEN_PARENTHESIS) { |
|
1301 | + if (isset($this->tokens[$i]['parenthesis_owner']) === true) { |
|
1302 | + $owner = $this->tokens[$i]['parenthesis_owner']; |
|
1303 | + if (isset(Util\Tokens::$scopeOpeners[$this->tokens[$owner]['code']]) === true |
|
1304 | + && isset($this->tokens[$i]['parenthesis_closer']) === true |
|
1305 | + ) { |
|
1306 | + // If we get into here, then we opened a parenthesis for |
|
1307 | + // a scope (eg. an if or else if) so we need to update the |
|
1308 | + // start of the line so that when we check to see |
|
1309 | + // if the closing parenthesis is more than 3 lines away from |
|
1310 | + // the statement, we check from the closing parenthesis. |
|
1311 | + $startLine = $this->tokens[$this->tokens[$i]['parenthesis_closer']]['line']; |
|
1312 | + } |
|
1313 | + } |
|
1314 | + } else if ($tokenType === T_OPEN_CURLY_BRACKET && $opener !== null) { |
|
1315 | + // We opened something that we don't have a scope opener for. |
|
1316 | + // Examples of this are curly brackets for string offsets etc. |
|
1317 | + // We want to ignore this so that we don't have an invalid scope |
|
1318 | + // map. |
|
1319 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1320 | + echo str_repeat("\t", $depth); |
|
1321 | + echo '* ignoring curly brace *'.PHP_EOL; |
|
1322 | + } |
|
1323 | + |
|
1324 | + $ignore++; |
|
1325 | + } else if ($tokenType === T_CLOSE_CURLY_BRACKET && $ignore > 0) { |
|
1326 | + // We found the end token for the opener we were ignoring. |
|
1327 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1328 | + echo str_repeat("\t", $depth); |
|
1329 | + echo '* finished ignoring curly brace *'.PHP_EOL; |
|
1330 | + } |
|
1331 | + |
|
1332 | + $ignore--; |
|
1333 | + } else if ($opener === null |
|
1334 | + && isset($this->scopeOpeners[$currType]) === true |
|
1335 | + ) { |
|
1336 | + // If we still haven't found the opener after 30 lines, |
|
1337 | + // we're not going to find it, unless we know it requires |
|
1338 | + // an opener (in which case we better keep looking) or the last |
|
1339 | + // token was empty (in which case we'll just confirm there is |
|
1340 | + // more code in this file and not just a big comment). |
|
1341 | + if ($this->tokens[$i]['line'] >= ($startLine + 30) |
|
1342 | + && isset(Util\Tokens::$emptyTokens[$this->tokens[($i - 1)]['code']]) === false |
|
1343 | + ) { |
|
1344 | + if ($this->scopeOpeners[$currType]['strict'] === true) { |
|
1345 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1346 | + $type = $this->tokens[$stackPtr]['type']; |
|
1347 | + $lines = ($this->tokens[$i]['line'] - $startLine); |
|
1348 | + echo str_repeat("\t", $depth); |
|
1349 | + echo "=> Still looking for $stackPtr:$type scope opener after $lines lines".PHP_EOL; |
|
1350 | + } |
|
1351 | + } else { |
|
1352 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1353 | + $type = $this->tokens[$stackPtr]['type']; |
|
1354 | + echo str_repeat("\t", $depth); |
|
1355 | + echo "=> Couldn't find scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
1356 | + } |
|
1357 | + |
|
1358 | + return $stackPtr; |
|
1359 | + } |
|
1360 | + } |
|
1361 | + } else if ($opener !== null |
|
1362 | + && $tokenType !== T_BREAK |
|
1363 | + && isset($this->endScopeTokens[$tokenType]) === true |
|
1364 | + ) { |
|
1365 | + if (isset($this->tokens[$i]['scope_condition']) === false) { |
|
1366 | + if ($ignore > 0) { |
|
1367 | + // We found the end token for the opener we were ignoring. |
|
1368 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1369 | + echo str_repeat("\t", $depth); |
|
1370 | + echo '* finished ignoring curly brace *'.PHP_EOL; |
|
1371 | + } |
|
1372 | + |
|
1373 | + $ignore--; |
|
1374 | + } else { |
|
1375 | + // We found a token that closes the scope but it doesn't |
|
1376 | + // have a condition, so it belongs to another token and |
|
1377 | + // our token doesn't have a closer, so pretend this is |
|
1378 | + // the closer. |
|
1379 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1380 | + $type = $this->tokens[$stackPtr]['type']; |
|
1381 | + echo str_repeat("\t", $depth); |
|
1382 | + echo "=> Found (unexpected) scope closer for $stackPtr:$type".PHP_EOL; |
|
1383 | + } |
|
1384 | + |
|
1385 | + foreach ([$stackPtr, $opener] as $token) { |
|
1386 | + $this->tokens[$token]['scope_condition'] = $stackPtr; |
|
1387 | + $this->tokens[$token]['scope_opener'] = $opener; |
|
1388 | + $this->tokens[$token]['scope_closer'] = $i; |
|
1389 | + } |
|
1390 | + |
|
1391 | + return ($i - 1); |
|
1392 | + }//end if |
|
1393 | + }//end if |
|
1394 | + }//end if |
|
1395 | + }//end for |
|
1396 | + |
|
1397 | + return $stackPtr; |
|
1398 | + |
|
1399 | + }//end recurseScopeMap() |
|
1400 | + |
|
1401 | + |
|
1402 | + /** |
|
1403 | + * Constructs the level map. |
|
1404 | + * |
|
1405 | + * The level map adds a 'level' index to each token which indicates the |
|
1406 | + * depth that a token within a set of scope blocks. It also adds a |
|
1407 | + * 'conditions' index which is an array of the scope conditions that opened |
|
1408 | + * each of the scopes - position 0 being the first scope opener. |
|
1409 | + * |
|
1410 | + * @return void |
|
1411 | + */ |
|
1412 | + private function createLevelMap() |
|
1413 | + { |
|
1414 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1415 | + echo "\t*** START LEVEL MAP ***".PHP_EOL; |
|
1416 | + } |
|
1417 | + |
|
1418 | + $this->numTokens = count($this->tokens); |
|
1419 | + $level = 0; |
|
1420 | + $conditions = []; |
|
1421 | + $lastOpener = null; |
|
1422 | + $openers = []; |
|
1423 | + |
|
1424 | + for ($i = 0; $i < $this->numTokens; $i++) { |
|
1425 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1426 | + $type = $this->tokens[$i]['type']; |
|
1427 | + $line = $this->tokens[$i]['line']; |
|
1428 | + $len = $this->tokens[$i]['length']; |
|
1429 | + $col = $this->tokens[$i]['column']; |
|
1430 | + |
|
1431 | + $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
1432 | + |
|
1433 | + echo str_repeat("\t", ($level + 1)); |
|
1434 | + echo "Process token $i on line $line [col:$col;len:$len;lvl:$level;"; |
|
1435 | + if (empty($conditions) !== true) { |
|
1436 | + $condString = 'conds;'; |
|
1437 | + foreach ($conditions as $condition) { |
|
1438 | + $condString .= Util\Tokens::tokenName($condition).','; |
|
1439 | + } |
|
1440 | + |
|
1441 | + echo rtrim($condString, ',').';'; |
|
1442 | + } |
|
1443 | + |
|
1444 | + echo "]: $type => $content".PHP_EOL; |
|
1445 | + }//end if |
|
1446 | + |
|
1447 | + $this->tokens[$i]['level'] = $level; |
|
1448 | + $this->tokens[$i]['conditions'] = $conditions; |
|
1449 | + |
|
1450 | + if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
1451 | + // Check to see if this token opened the scope. |
|
1452 | + if ($this->tokens[$i]['scope_opener'] === $i) { |
|
1453 | + $stackPtr = $this->tokens[$i]['scope_condition']; |
|
1454 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1455 | + $type = $this->tokens[$stackPtr]['type']; |
|
1456 | + echo str_repeat("\t", ($level + 1)); |
|
1457 | + echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; |
|
1458 | + } |
|
1459 | + |
|
1460 | + $stackPtr = $this->tokens[$i]['scope_condition']; |
|
1461 | + |
|
1462 | + // If we find a scope opener that has a shared closer, |
|
1463 | + // then we need to go back over the condition map that we |
|
1464 | + // just created and fix ourselves as we just added some |
|
1465 | + // conditions where there was none. This happens for T_CASE |
|
1466 | + // statements that are using the same break statement. |
|
1467 | + if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $this->tokens[$i]['scope_closer']) { |
|
1468 | + // This opener shares its closer with the previous opener, |
|
1469 | + // but we still need to check if the two openers share their |
|
1470 | + // closer with each other directly (like CASE and DEFAULT) |
|
1471 | + // or if they are just sharing because one doesn't have a |
|
1472 | + // closer (like CASE with no BREAK using a SWITCHes closer). |
|
1473 | + $thisType = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; |
|
1474 | + $opener = $this->tokens[$lastOpener]['scope_condition']; |
|
1475 | + |
|
1476 | + $isShared = isset($this->scopeOpeners[$thisType]['with'][$this->tokens[$opener]['code']]); |
|
1477 | + |
|
1478 | + reset($this->scopeOpeners[$thisType]['end']); |
|
1479 | + reset($this->scopeOpeners[$this->tokens[$opener]['code']]['end']); |
|
1480 | + $sameEnd = (current($this->scopeOpeners[$thisType]['end']) === current($this->scopeOpeners[$this->tokens[$opener]['code']]['end'])); |
|
1481 | + |
|
1482 | + if ($isShared === true && $sameEnd === true) { |
|
1483 | + $badToken = $opener; |
|
1484 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1485 | + $type = $this->tokens[$badToken]['type']; |
|
1486 | + echo str_repeat("\t", ($level + 1)); |
|
1487 | + echo "* shared closer, cleaning up $badToken:$type *".PHP_EOL; |
|
1488 | + } |
|
1489 | + |
|
1490 | + for ($x = $this->tokens[$i]['scope_condition']; $x <= $i; $x++) { |
|
1491 | + $oldConditions = $this->tokens[$x]['conditions']; |
|
1492 | + $oldLevel = $this->tokens[$x]['level']; |
|
1493 | + $this->tokens[$x]['level']--; |
|
1494 | + unset($this->tokens[$x]['conditions'][$badToken]); |
|
1495 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1496 | + $type = $this->tokens[$x]['type']; |
|
1497 | + $oldConds = ''; |
|
1498 | + foreach ($oldConditions as $condition) { |
|
1499 | + $oldConds .= Util\Tokens::tokenName($condition).','; |
|
1500 | + } |
|
1501 | + |
|
1502 | + $oldConds = rtrim($oldConds, ','); |
|
1503 | + |
|
1504 | + $newConds = ''; |
|
1505 | + foreach ($this->tokens[$x]['conditions'] as $condition) { |
|
1506 | + $newConds .= Util\Tokens::tokenName($condition).','; |
|
1507 | + } |
|
1508 | + |
|
1509 | + $newConds = rtrim($newConds, ','); |
|
1510 | + |
|
1511 | + $newLevel = $this->tokens[$x]['level']; |
|
1512 | + echo str_repeat("\t", ($level + 1)); |
|
1513 | + echo "* cleaned $x:$type *".PHP_EOL; |
|
1514 | + echo str_repeat("\t", ($level + 2)); |
|
1515 | + echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; |
|
1516 | + echo str_repeat("\t", ($level + 2)); |
|
1517 | + echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; |
|
1518 | + }//end if |
|
1519 | + }//end for |
|
1520 | + |
|
1521 | + unset($conditions[$badToken]); |
|
1522 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1523 | + $type = $this->tokens[$badToken]['type']; |
|
1524 | + echo str_repeat("\t", ($level + 1)); |
|
1525 | + echo "* token $badToken:$type removed from conditions array *".PHP_EOL; |
|
1526 | + } |
|
1527 | + |
|
1528 | + unset($openers[$lastOpener]); |
|
1529 | + |
|
1530 | + $level--; |
|
1531 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1532 | + echo str_repeat("\t", ($level + 2)); |
|
1533 | + echo '* level decreased *'.PHP_EOL; |
|
1534 | + } |
|
1535 | + }//end if |
|
1536 | + }//end if |
|
1537 | + |
|
1538 | + $level++; |
|
1539 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1540 | + echo str_repeat("\t", ($level + 1)); |
|
1541 | + echo '* level increased *'.PHP_EOL; |
|
1542 | + } |
|
1543 | + |
|
1544 | + $conditions[$stackPtr] = $this->tokens[$stackPtr]['code']; |
|
1545 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1546 | + $type = $this->tokens[$stackPtr]['type']; |
|
1547 | + echo str_repeat("\t", ($level + 1)); |
|
1548 | + echo "* token $stackPtr:$type added to conditions array *".PHP_EOL; |
|
1549 | + } |
|
1550 | + |
|
1551 | + $lastOpener = $this->tokens[$i]['scope_opener']; |
|
1552 | + if ($lastOpener !== null) { |
|
1553 | + $openers[$lastOpener] = $lastOpener; |
|
1554 | + } |
|
1555 | + } else if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $i) { |
|
1556 | + foreach (array_reverse($openers) as $opener) { |
|
1557 | + if ($this->tokens[$opener]['scope_closer'] === $i) { |
|
1558 | + $oldOpener = array_pop($openers); |
|
1559 | + if (empty($openers) === false) { |
|
1560 | + $lastOpener = array_pop($openers); |
|
1561 | + $openers[$lastOpener] = $lastOpener; |
|
1562 | + } else { |
|
1563 | + $lastOpener = null; |
|
1564 | + } |
|
1565 | + |
|
1566 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1567 | + $type = $this->tokens[$oldOpener]['type']; |
|
1568 | + echo str_repeat("\t", ($level + 1)); |
|
1569 | + echo "=> Found scope closer for $oldOpener:$type".PHP_EOL; |
|
1570 | + } |
|
1571 | + |
|
1572 | + $oldCondition = array_pop($conditions); |
|
1573 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1574 | + echo str_repeat("\t", ($level + 1)); |
|
1575 | + echo '* token '.Util\Tokens::tokenName($oldCondition).' removed from conditions array *'.PHP_EOL; |
|
1576 | + } |
|
1577 | + |
|
1578 | + // Make sure this closer actually belongs to us. |
|
1579 | + // Either the condition also has to think this is the |
|
1580 | + // closer, or it has to allow sharing with us. |
|
1581 | + $condition = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; |
|
1582 | + if ($condition !== $oldCondition) { |
|
1583 | + if (isset($this->scopeOpeners[$oldCondition]['with'][$condition]) === false) { |
|
1584 | + $badToken = $this->tokens[$oldOpener]['scope_condition']; |
|
1585 | + |
|
1586 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1587 | + $type = Util\Tokens::tokenName($oldCondition); |
|
1588 | + echo str_repeat("\t", ($level + 1)); |
|
1589 | + echo "* scope closer was bad, cleaning up $badToken:$type *".PHP_EOL; |
|
1590 | + } |
|
1591 | + |
|
1592 | + for ($x = ($oldOpener + 1); $x <= $i; $x++) { |
|
1593 | + $oldConditions = $this->tokens[$x]['conditions']; |
|
1594 | + $oldLevel = $this->tokens[$x]['level']; |
|
1595 | + $this->tokens[$x]['level']--; |
|
1596 | + unset($this->tokens[$x]['conditions'][$badToken]); |
|
1597 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1598 | + $type = $this->tokens[$x]['type']; |
|
1599 | + $oldConds = ''; |
|
1600 | + foreach ($oldConditions as $condition) { |
|
1601 | + $oldConds .= Util\Tokens::tokenName($condition).','; |
|
1602 | + } |
|
1603 | + |
|
1604 | + $oldConds = rtrim($oldConds, ','); |
|
1605 | + |
|
1606 | + $newConds = ''; |
|
1607 | + foreach ($this->tokens[$x]['conditions'] as $condition) { |
|
1608 | + $newConds .= Util\Tokens::tokenName($condition).','; |
|
1609 | + } |
|
1610 | + |
|
1611 | + $newConds = rtrim($newConds, ','); |
|
1612 | + |
|
1613 | + $newLevel = $this->tokens[$x]['level']; |
|
1614 | + echo str_repeat("\t", ($level + 1)); |
|
1615 | + echo "* cleaned $x:$type *".PHP_EOL; |
|
1616 | + echo str_repeat("\t", ($level + 2)); |
|
1617 | + echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; |
|
1618 | + echo str_repeat("\t", ($level + 2)); |
|
1619 | + echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; |
|
1620 | + }//end if |
|
1621 | + }//end for |
|
1622 | + }//end if |
|
1623 | + }//end if |
|
1624 | + |
|
1625 | + $level--; |
|
1626 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1627 | + echo str_repeat("\t", ($level + 2)); |
|
1628 | + echo '* level decreased *'.PHP_EOL; |
|
1629 | + } |
|
1630 | + |
|
1631 | + $this->tokens[$i]['level'] = $level; |
|
1632 | + $this->tokens[$i]['conditions'] = $conditions; |
|
1633 | + }//end if |
|
1634 | + }//end foreach |
|
1635 | + }//end if |
|
1636 | + }//end if |
|
1637 | + }//end for |
|
1638 | + |
|
1639 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1640 | + echo "\t*** END LEVEL MAP ***".PHP_EOL; |
|
1641 | + } |
|
1642 | + |
|
1643 | + }//end createLevelMap() |
|
1644 | 1644 | |
1645 | 1645 | |
1646 | 1646 | }//end class |
@@ -722,60 +722,60 @@ |
||
722 | 722 | */ |
723 | 723 | |
724 | 724 | switch ($this->tokens[$i]['code']) { |
725 | - case T_OPEN_SQUARE_BRACKET: |
|
726 | - $squareOpeners[] = $i; |
|
727 | - |
|
728 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
729 | - echo str_repeat("\t", count($squareOpeners)); |
|
730 | - echo str_repeat("\t", count($curlyOpeners)); |
|
731 | - echo "=> Found square bracket opener at $i".PHP_EOL; |
|
732 | - } |
|
733 | - break; |
|
734 | - case T_OPEN_CURLY_BRACKET: |
|
735 | - if (isset($this->tokens[$i]['scope_closer']) === false) { |
|
736 | - $curlyOpeners[] = $i; |
|
737 | - |
|
738 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
739 | - echo str_repeat("\t", count($squareOpeners)); |
|
740 | - echo str_repeat("\t", count($curlyOpeners)); |
|
741 | - echo "=> Found curly bracket opener at $i".PHP_EOL; |
|
742 | - } |
|
743 | - } |
|
744 | - break; |
|
745 | - case T_CLOSE_SQUARE_BRACKET: |
|
746 | - if (empty($squareOpeners) === false) { |
|
747 | - $opener = array_pop($squareOpeners); |
|
748 | - $this->tokens[$i]['bracket_opener'] = $opener; |
|
749 | - $this->tokens[$i]['bracket_closer'] = $i; |
|
750 | - $this->tokens[$opener]['bracket_opener'] = $opener; |
|
751 | - $this->tokens[$opener]['bracket_closer'] = $i; |
|
752 | - |
|
753 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
754 | - echo str_repeat("\t", count($squareOpeners)); |
|
755 | - echo str_repeat("\t", count($curlyOpeners)); |
|
756 | - echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; |
|
757 | - } |
|
758 | - } |
|
759 | - break; |
|
760 | - case T_CLOSE_CURLY_BRACKET: |
|
761 | - if (empty($curlyOpeners) === false |
|
762 | - && isset($this->tokens[$i]['scope_opener']) === false |
|
763 | - ) { |
|
764 | - $opener = array_pop($curlyOpeners); |
|
765 | - $this->tokens[$i]['bracket_opener'] = $opener; |
|
766 | - $this->tokens[$i]['bracket_closer'] = $i; |
|
767 | - $this->tokens[$opener]['bracket_opener'] = $opener; |
|
768 | - $this->tokens[$opener]['bracket_closer'] = $i; |
|
769 | - |
|
770 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
771 | - echo str_repeat("\t", count($squareOpeners)); |
|
772 | - echo str_repeat("\t", count($curlyOpeners)); |
|
773 | - echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; |
|
774 | - } |
|
775 | - } |
|
776 | - break; |
|
777 | - default: |
|
778 | - continue 2; |
|
725 | + case T_OPEN_SQUARE_BRACKET: |
|
726 | + $squareOpeners[] = $i; |
|
727 | + |
|
728 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
729 | + echo str_repeat("\t", count($squareOpeners)); |
|
730 | + echo str_repeat("\t", count($curlyOpeners)); |
|
731 | + echo "=> Found square bracket opener at $i".PHP_EOL; |
|
732 | + } |
|
733 | + break; |
|
734 | + case T_OPEN_CURLY_BRACKET: |
|
735 | + if (isset($this->tokens[$i]['scope_closer']) === false) { |
|
736 | + $curlyOpeners[] = $i; |
|
737 | + |
|
738 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
739 | + echo str_repeat("\t", count($squareOpeners)); |
|
740 | + echo str_repeat("\t", count($curlyOpeners)); |
|
741 | + echo "=> Found curly bracket opener at $i".PHP_EOL; |
|
742 | + } |
|
743 | + } |
|
744 | + break; |
|
745 | + case T_CLOSE_SQUARE_BRACKET: |
|
746 | + if (empty($squareOpeners) === false) { |
|
747 | + $opener = array_pop($squareOpeners); |
|
748 | + $this->tokens[$i]['bracket_opener'] = $opener; |
|
749 | + $this->tokens[$i]['bracket_closer'] = $i; |
|
750 | + $this->tokens[$opener]['bracket_opener'] = $opener; |
|
751 | + $this->tokens[$opener]['bracket_closer'] = $i; |
|
752 | + |
|
753 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
754 | + echo str_repeat("\t", count($squareOpeners)); |
|
755 | + echo str_repeat("\t", count($curlyOpeners)); |
|
756 | + echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; |
|
757 | + } |
|
758 | + } |
|
759 | + break; |
|
760 | + case T_CLOSE_CURLY_BRACKET: |
|
761 | + if (empty($curlyOpeners) === false |
|
762 | + && isset($this->tokens[$i]['scope_opener']) === false |
|
763 | + ) { |
|
764 | + $opener = array_pop($curlyOpeners); |
|
765 | + $this->tokens[$i]['bracket_opener'] = $opener; |
|
766 | + $this->tokens[$i]['bracket_closer'] = $i; |
|
767 | + $this->tokens[$opener]['bracket_opener'] = $opener; |
|
768 | + $this->tokens[$opener]['bracket_closer'] = $i; |
|
769 | + |
|
770 | + if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
771 | + echo str_repeat("\t", count($squareOpeners)); |
|
772 | + echo str_repeat("\t", count($curlyOpeners)); |
|
773 | + echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; |
|
774 | + } |
|
775 | + } |
|
776 | + break; |
|
777 | + default: |
|
778 | + continue 2; |
|
779 | 779 | }//end switch |
780 | 780 | }//end for |
781 | 781 |
@@ -27,14 +27,14 @@ discard block |
||
27 | 27 | * |
28 | 28 | * @var string |
29 | 29 | */ |
30 | - protected $eolChar = []; |
|
30 | + protected $eolChar = [ ]; |
|
31 | 31 | |
32 | 32 | /** |
33 | 33 | * A token-based representation of the content. |
34 | 34 | * |
35 | 35 | * @var array |
36 | 36 | */ |
37 | - protected $tokens = []; |
|
37 | + protected $tokens = [ ]; |
|
38 | 38 | |
39 | 39 | /** |
40 | 40 | * The number of tokens in the tokens array. |
@@ -48,28 +48,28 @@ discard block |
||
48 | 48 | * |
49 | 49 | * @var array |
50 | 50 | */ |
51 | - public $scopeOpeners = []; |
|
51 | + public $scopeOpeners = [ ]; |
|
52 | 52 | |
53 | 53 | /** |
54 | 54 | * A list of tokens that end the scope. |
55 | 55 | * |
56 | 56 | * @var array |
57 | 57 | */ |
58 | - public $endScopeTokens = []; |
|
58 | + public $endScopeTokens = [ ]; |
|
59 | 59 | |
60 | 60 | /** |
61 | 61 | * Known lengths of tokens. |
62 | 62 | * |
63 | 63 | * @var array<int, int> |
64 | 64 | */ |
65 | - public $knownLengths = []; |
|
65 | + public $knownLengths = [ ]; |
|
66 | 66 | |
67 | 67 | /** |
68 | 68 | * A list of lines being ignored due to error suppression comments. |
69 | 69 | * |
70 | 70 | * @var array |
71 | 71 | */ |
72 | - public $ignoredLines = []; |
|
72 | + public $ignoredLines = [ ]; |
|
73 | 73 | |
74 | 74 | |
75 | 75 | /** |
@@ -82,14 +82,14 @@ discard block |
||
82 | 82 | * @return void |
83 | 83 | * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. |
84 | 84 | */ |
85 | - public function __construct($content, $config, $eolChar='\n') |
|
85 | + public function __construct( $content, $config, $eolChar = '\n' ) |
|
86 | 86 | { |
87 | 87 | $this->eolChar = $eolChar; |
88 | 88 | |
89 | 89 | $this->config = $config; |
90 | - $this->tokens = $this->tokenize($content); |
|
90 | + $this->tokens = $this->tokenize( $content ); |
|
91 | 91 | |
92 | - if ($config === null) { |
|
92 | + if ( $config === null ) { |
|
93 | 93 | return; |
94 | 94 | } |
95 | 95 | |
@@ -113,14 +113,14 @@ discard block |
||
113 | 113 | * |
114 | 114 | * @return boolean |
115 | 115 | */ |
116 | - protected function isMinifiedContent($content, $eolChar='\n') |
|
116 | + protected function isMinifiedContent( $content, $eolChar = '\n' ) |
|
117 | 117 | { |
118 | 118 | // Minified files often have a very large number of characters per line |
119 | 119 | // and cause issues when tokenizing. |
120 | - $numChars = strlen($content); |
|
121 | - $numLines = (substr_count($content, $eolChar) + 1); |
|
122 | - $average = ($numChars / $numLines); |
|
123 | - if ($average > 100) { |
|
120 | + $numChars = strlen( $content ); |
|
121 | + $numLines = ( substr_count( $content, $eolChar ) + 1 ); |
|
122 | + $average = ( $numChars / $numLines ); |
|
123 | + if ( $average > 100 ) { |
|
124 | 124 | return true; |
125 | 125 | } |
126 | 126 | |
@@ -148,7 +148,7 @@ discard block |
||
148 | 148 | * |
149 | 149 | * @return array |
150 | 150 | */ |
151 | - abstract protected function tokenize($string); |
|
151 | + abstract protected function tokenize( $string ); |
|
152 | 152 | |
153 | 153 | |
154 | 154 | /** |
@@ -171,12 +171,12 @@ discard block |
||
171 | 171 | { |
172 | 172 | $currColumn = 1; |
173 | 173 | $lineNumber = 1; |
174 | - $eolLen = strlen($this->eolChar); |
|
174 | + $eolLen = strlen( $this->eolChar ); |
|
175 | 175 | $ignoring = null; |
176 | - $inTests = defined('PHP_CODESNIFFER_IN_TESTS'); |
|
176 | + $inTests = defined( 'PHP_CODESNIFFER_IN_TESTS' ); |
|
177 | 177 | |
178 | 178 | $checkEncoding = false; |
179 | - if (function_exists('iconv_strlen') === true) { |
|
179 | + if ( function_exists( 'iconv_strlen' ) === true ) { |
|
180 | 180 | $checkEncoding = true; |
181 | 181 | } |
182 | 182 | |
@@ -197,126 +197,126 @@ discard block |
||
197 | 197 | T_INLINE_HTML => true, |
198 | 198 | ]; |
199 | 199 | |
200 | - $this->numTokens = count($this->tokens); |
|
201 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
202 | - $this->tokens[$i]['line'] = $lineNumber; |
|
203 | - $this->tokens[$i]['column'] = $currColumn; |
|
200 | + $this->numTokens = count( $this->tokens ); |
|
201 | + for ( $i = 0; $i < $this->numTokens; $i++ ) { |
|
202 | + $this->tokens[ $i ][ 'line' ] = $lineNumber; |
|
203 | + $this->tokens[ $i ][ 'column' ] = $currColumn; |
|
204 | 204 | |
205 | - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === true) { |
|
205 | + if ( isset( $this->knownLengths[ $this->tokens[ $i ][ 'code' ] ] ) === true ) { |
|
206 | 206 | // There are no tabs in the tokens we know the length of. |
207 | - $length = $this->knownLengths[$this->tokens[$i]['code']]; |
|
207 | + $length = $this->knownLengths[ $this->tokens[ $i ][ 'code' ] ]; |
|
208 | 208 | $currColumn += $length; |
209 | - } else if ($tabWidth === 0 |
|
210 | - || isset($tokensWithTabs[$this->tokens[$i]['code']]) === false |
|
211 | - || strpos($this->tokens[$i]['content'], "\t") === false |
|
209 | + } else if ( $tabWidth === 0 |
|
210 | + || isset( $tokensWithTabs[ $this->tokens[ $i ][ 'code' ] ] ) === false |
|
211 | + || strpos( $this->tokens[ $i ][ 'content' ], "\t" ) === false |
|
212 | 212 | ) { |
213 | 213 | // There are no tabs in this content, or we aren't replacing them. |
214 | - if ($checkEncoding === true) { |
|
214 | + if ( $checkEncoding === true ) { |
|
215 | 215 | // Not using the default encoding, so take a bit more care. |
216 | 216 | $oldLevel = error_reporting(); |
217 | - error_reporting(0); |
|
218 | - $length = iconv_strlen($this->tokens[$i]['content'], $encoding); |
|
219 | - error_reporting($oldLevel); |
|
217 | + error_reporting( 0 ); |
|
218 | + $length = iconv_strlen( $this->tokens[ $i ][ 'content' ], $encoding ); |
|
219 | + error_reporting( $oldLevel ); |
|
220 | 220 | |
221 | - if ($length === false) { |
|
221 | + if ( $length === false ) { |
|
222 | 222 | // String contained invalid characters, so revert to default. |
223 | - $length = strlen($this->tokens[$i]['content']); |
|
223 | + $length = strlen( $this->tokens[ $i ][ 'content' ] ); |
|
224 | 224 | } |
225 | 225 | } else { |
226 | - $length = strlen($this->tokens[$i]['content']); |
|
226 | + $length = strlen( $this->tokens[ $i ][ 'content' ] ); |
|
227 | 227 | } |
228 | 228 | |
229 | 229 | $currColumn += $length; |
230 | 230 | } else { |
231 | - $this->replaceTabsInToken($this->tokens[$i]); |
|
232 | - $length = $this->tokens[$i]['length']; |
|
231 | + $this->replaceTabsInToken( $this->tokens[ $i ] ); |
|
232 | + $length = $this->tokens[ $i ][ 'length' ]; |
|
233 | 233 | $currColumn += $length; |
234 | 234 | }//end if |
235 | 235 | |
236 | - $this->tokens[$i]['length'] = $length; |
|
236 | + $this->tokens[ $i ][ 'length' ] = $length; |
|
237 | 237 | |
238 | - if (isset($this->knownLengths[$this->tokens[$i]['code']]) === false |
|
239 | - && strpos($this->tokens[$i]['content'], $this->eolChar) !== false |
|
238 | + if ( isset( $this->knownLengths[ $this->tokens[ $i ][ 'code' ] ] ) === false |
|
239 | + && strpos( $this->tokens[ $i ][ 'content' ], $this->eolChar ) !== false |
|
240 | 240 | ) { |
241 | 241 | $lineNumber++; |
242 | 242 | $currColumn = 1; |
243 | 243 | |
244 | 244 | // Newline chars are not counted in the token length. |
245 | - $this->tokens[$i]['length'] -= $eolLen; |
|
245 | + $this->tokens[ $i ][ 'length' ] -= $eolLen; |
|
246 | 246 | } |
247 | 247 | |
248 | - if ($this->tokens[$i]['code'] === T_COMMENT |
|
249 | - || $this->tokens[$i]['code'] === T_DOC_COMMENT_STRING |
|
250 | - || $this->tokens[$i]['code'] === T_DOC_COMMENT_TAG |
|
251 | - || ($inTests === true && $this->tokens[$i]['code'] === T_INLINE_HTML) |
|
248 | + if ( $this->tokens[ $i ][ 'code' ] === T_COMMENT |
|
249 | + || $this->tokens[ $i ][ 'code' ] === T_DOC_COMMENT_STRING |
|
250 | + || $this->tokens[ $i ][ 'code' ] === T_DOC_COMMENT_TAG |
|
251 | + || ( $inTests === true && $this->tokens[ $i ][ 'code' ] === T_INLINE_HTML ) |
|
252 | 252 | ) { |
253 | - $commentText = ltrim($this->tokens[$i]['content'], " \t/*"); |
|
254 | - $commentText = rtrim($commentText, " */\t\r\n"); |
|
255 | - $commentTextLower = strtolower($commentText); |
|
256 | - if (strpos($commentText, '@codingStandards') !== false) { |
|
253 | + $commentText = ltrim( $this->tokens[ $i ][ 'content' ], " \t/*" ); |
|
254 | + $commentText = rtrim( $commentText, " */\t\r\n" ); |
|
255 | + $commentTextLower = strtolower( $commentText ); |
|
256 | + if ( strpos( $commentText, '@codingStandards' ) !== false ) { |
|
257 | 257 | // If this comment is the only thing on the line, it tells us |
258 | 258 | // to ignore the following line. If the line contains other content |
259 | 259 | // then we are just ignoring this one single line. |
260 | 260 | $ownLine = false; |
261 | - if ($i > 0) { |
|
262 | - for ($prev = ($i - 1); $prev >= 0; $prev--) { |
|
263 | - if ($this->tokens[$prev]['code'] === T_WHITESPACE) { |
|
261 | + if ( $i > 0 ) { |
|
262 | + for ( $prev = ( $i - 1 ); $prev >= 0; $prev-- ) { |
|
263 | + if ( $this->tokens[ $prev ][ 'code' ] === T_WHITESPACE ) { |
|
264 | 264 | continue; |
265 | 265 | } |
266 | 266 | |
267 | 267 | break; |
268 | 268 | } |
269 | 269 | |
270 | - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { |
|
270 | + if ( $this->tokens[ $prev ][ 'line' ] !== $this->tokens[ $i ][ 'line' ] ) { |
|
271 | 271 | $ownLine = true; |
272 | 272 | } |
273 | 273 | } |
274 | 274 | |
275 | - if ($ignoring === null |
|
276 | - && strpos($commentText, '@codingStandardsIgnoreStart') !== false |
|
275 | + if ( $ignoring === null |
|
276 | + && strpos( $commentText, '@codingStandardsIgnoreStart' ) !== false |
|
277 | 277 | ) { |
278 | - $ignoring = ['.all' => true]; |
|
279 | - if ($ownLine === true) { |
|
280 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
278 | + $ignoring = [ '.all' => true ]; |
|
279 | + if ( $ownLine === true ) { |
|
280 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoring; |
|
281 | 281 | } |
282 | - } else if ($ignoring !== null |
|
283 | - && strpos($commentText, '@codingStandardsIgnoreEnd') !== false |
|
282 | + } else if ( $ignoring !== null |
|
283 | + && strpos( $commentText, '@codingStandardsIgnoreEnd' ) !== false |
|
284 | 284 | ) { |
285 | - if ($ownLine === true) { |
|
286 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
285 | + if ( $ownLine === true ) { |
|
286 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = [ '.all' => true ]; |
|
287 | 287 | } else { |
288 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
288 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoring; |
|
289 | 289 | } |
290 | 290 | |
291 | 291 | $ignoring = null; |
292 | - } else if ($ignoring === null |
|
293 | - && strpos($commentText, '@codingStandardsIgnoreLine') !== false |
|
292 | + } else if ( $ignoring === null |
|
293 | + && strpos( $commentText, '@codingStandardsIgnoreLine' ) !== false |
|
294 | 294 | ) { |
295 | - $ignoring = ['.all' => true]; |
|
296 | - if ($ownLine === true) { |
|
297 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
298 | - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoring; |
|
295 | + $ignoring = [ '.all' => true ]; |
|
296 | + if ( $ownLine === true ) { |
|
297 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoring; |
|
298 | + $this->ignoredLines[ ( $this->tokens[ $i ][ 'line' ] + 1 ) ] = $ignoring; |
|
299 | 299 | } else { |
300 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
300 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoring; |
|
301 | 301 | } |
302 | 302 | |
303 | 303 | $ignoring = null; |
304 | 304 | }//end if |
305 | - } else if (substr($commentTextLower, 0, 6) === 'phpcs:' |
|
306 | - || substr($commentTextLower, 0, 7) === '@phpcs:' |
|
305 | + } else if ( substr( $commentTextLower, 0, 6 ) === 'phpcs:' |
|
306 | + || substr( $commentTextLower, 0, 7 ) === '@phpcs:' |
|
307 | 307 | ) { |
308 | 308 | // If the @phpcs: syntax is being used, strip the @ to make |
309 | 309 | // comparisons easier. |
310 | - if ($commentText[0] === '@') { |
|
311 | - $commentText = substr($commentText, 1); |
|
312 | - $commentTextLower = strtolower($commentText); |
|
310 | + if ( $commentText[ 0 ] === '@' ) { |
|
311 | + $commentText = substr( $commentText, 1 ); |
|
312 | + $commentTextLower = strtolower( $commentText ); |
|
313 | 313 | } |
314 | 314 | |
315 | 315 | // If there is a comment on the end, strip it off. |
316 | - $commentStart = strpos($commentTextLower, ' --'); |
|
317 | - if ($commentStart !== false) { |
|
318 | - $commentText = substr($commentText, 0, $commentStart); |
|
319 | - $commentTextLower = strtolower($commentText); |
|
316 | + $commentStart = strpos( $commentTextLower, ' --' ); |
|
317 | + if ( $commentStart !== false ) { |
|
318 | + $commentText = substr( $commentText, 0, $commentStart ); |
|
319 | + $commentTextLower = strtolower( $commentText ); |
|
320 | 320 | } |
321 | 321 | |
322 | 322 | // If this comment is the only thing on the line, it tells us |
@@ -324,23 +324,23 @@ discard block |
||
324 | 324 | // then we are just ignoring this one single line. |
325 | 325 | $lineHasOtherContent = false; |
326 | 326 | $lineHasOtherTokens = false; |
327 | - if ($i > 0) { |
|
328 | - for ($prev = ($i - 1); $prev > 0; $prev--) { |
|
329 | - if ($this->tokens[$prev]['line'] !== $this->tokens[$i]['line']) { |
|
327 | + if ( $i > 0 ) { |
|
328 | + for ( $prev = ( $i - 1 ); $prev > 0; $prev-- ) { |
|
329 | + if ( $this->tokens[ $prev ][ 'line' ] !== $this->tokens[ $i ][ 'line' ] ) { |
|
330 | 330 | // Changed lines. |
331 | 331 | break; |
332 | 332 | } |
333 | 333 | |
334 | - if ($this->tokens[$prev]['code'] === T_WHITESPACE |
|
335 | - || ($this->tokens[$prev]['code'] === T_INLINE_HTML |
|
336 | - && trim($this->tokens[$prev]['content']) === '') |
|
334 | + if ( $this->tokens[ $prev ][ 'code' ] === T_WHITESPACE |
|
335 | + || ( $this->tokens[ $prev ][ 'code' ] === T_INLINE_HTML |
|
336 | + && trim( $this->tokens[ $prev ][ 'content' ] ) === '' ) |
|
337 | 337 | ) { |
338 | 338 | continue; |
339 | 339 | } |
340 | 340 | |
341 | 341 | $lineHasOtherTokens = true; |
342 | 342 | |
343 | - if ($this->tokens[$prev]['code'] === T_OPEN_TAG) { |
|
343 | + if ( $this->tokens[ $prev ][ 'code' ] === T_OPEN_TAG ) { |
|
344 | 344 | continue; |
345 | 345 | } |
346 | 346 | |
@@ -349,33 +349,33 @@ discard block |
||
349 | 349 | }//end for |
350 | 350 | |
351 | 351 | $changedLines = false; |
352 | - for ($next = $i; $next < $this->numTokens; $next++) { |
|
353 | - if ($changedLines === true) { |
|
352 | + for ( $next = $i; $next < $this->numTokens; $next++ ) { |
|
353 | + if ( $changedLines === true ) { |
|
354 | 354 | // Changed lines. |
355 | 355 | break; |
356 | 356 | } |
357 | 357 | |
358 | - if (isset($this->knownLengths[$this->tokens[$next]['code']]) === false |
|
359 | - && strpos($this->tokens[$next]['content'], $this->eolChar) !== false |
|
358 | + if ( isset( $this->knownLengths[ $this->tokens[ $next ][ 'code' ] ] ) === false |
|
359 | + && strpos( $this->tokens[ $next ][ 'content' ], $this->eolChar ) !== false |
|
360 | 360 | ) { |
361 | 361 | // Last token on the current line. |
362 | 362 | $changedLines = true; |
363 | 363 | } |
364 | 364 | |
365 | - if ($next === $i) { |
|
365 | + if ( $next === $i ) { |
|
366 | 366 | continue; |
367 | 367 | } |
368 | 368 | |
369 | - if ($this->tokens[$next]['code'] === T_WHITESPACE |
|
370 | - || ($this->tokens[$next]['code'] === T_INLINE_HTML |
|
371 | - && trim($this->tokens[$next]['content']) === '') |
|
369 | + if ( $this->tokens[ $next ][ 'code' ] === T_WHITESPACE |
|
370 | + || ( $this->tokens[ $next ][ 'code' ] === T_INLINE_HTML |
|
371 | + && trim( $this->tokens[ $next ][ 'content' ] ) === '' ) |
|
372 | 372 | ) { |
373 | 373 | continue; |
374 | 374 | } |
375 | 375 | |
376 | 376 | $lineHasOtherTokens = true; |
377 | 377 | |
378 | - if ($this->tokens[$next]['code'] === T_CLOSE_TAG) { |
|
378 | + if ( $this->tokens[ $next ][ 'code' ] === T_CLOSE_TAG ) { |
|
379 | 379 | continue; |
380 | 380 | } |
381 | 381 | |
@@ -384,178 +384,178 @@ discard block |
||
384 | 384 | }//end for |
385 | 385 | }//end if |
386 | 386 | |
387 | - if (substr($commentTextLower, 0, 9) === 'phpcs:set') { |
|
387 | + if ( substr( $commentTextLower, 0, 9 ) === 'phpcs:set' ) { |
|
388 | 388 | // Ignore standards for complete lines that change sniff settings. |
389 | - if ($lineHasOtherTokens === false) { |
|
390 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
389 | + if ( $lineHasOtherTokens === false ) { |
|
390 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = [ '.all' => true ]; |
|
391 | 391 | } |
392 | 392 | |
393 | 393 | // Need to maintain case here, to get the correct sniff code. |
394 | - $parts = explode(' ', substr($commentText, 10)); |
|
395 | - if (count($parts) >= 2) { |
|
396 | - $sniffParts = explode('.', $parts[0]); |
|
397 | - if (count($sniffParts) >= 3) { |
|
398 | - $this->tokens[$i]['sniffCode'] = array_shift($parts); |
|
399 | - $this->tokens[$i]['sniffProperty'] = array_shift($parts); |
|
400 | - $this->tokens[$i]['sniffPropertyValue'] = rtrim(implode(' ', $parts), " */\r\n"); |
|
394 | + $parts = explode( ' ', substr( $commentText, 10 ) ); |
|
395 | + if ( count( $parts ) >= 2 ) { |
|
396 | + $sniffParts = explode( '.', $parts[ 0 ] ); |
|
397 | + if ( count( $sniffParts ) >= 3 ) { |
|
398 | + $this->tokens[ $i ][ 'sniffCode' ] = array_shift( $parts ); |
|
399 | + $this->tokens[ $i ][ 'sniffProperty' ] = array_shift( $parts ); |
|
400 | + $this->tokens[ $i ][ 'sniffPropertyValue' ] = rtrim( implode( ' ', $parts ), " */\r\n" ); |
|
401 | 401 | } |
402 | 402 | } |
403 | 403 | |
404 | - $this->tokens[$i]['code'] = T_PHPCS_SET; |
|
405 | - $this->tokens[$i]['type'] = 'T_PHPCS_SET'; |
|
406 | - } else if (substr($commentTextLower, 0, 16) === 'phpcs:ignorefile') { |
|
404 | + $this->tokens[ $i ][ 'code' ] = T_PHPCS_SET; |
|
405 | + $this->tokens[ $i ][ 'type' ] = 'T_PHPCS_SET'; |
|
406 | + } else if ( substr( $commentTextLower, 0, 16 ) === 'phpcs:ignorefile' ) { |
|
407 | 407 | // The whole file will be ignored, but at least set the correct token. |
408 | - $this->tokens[$i]['code'] = T_PHPCS_IGNORE_FILE; |
|
409 | - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE_FILE'; |
|
410 | - } else if (substr($commentTextLower, 0, 13) === 'phpcs:disable') { |
|
411 | - if ($lineHasOtherContent === false) { |
|
408 | + $this->tokens[ $i ][ 'code' ] = T_PHPCS_IGNORE_FILE; |
|
409 | + $this->tokens[ $i ][ 'type' ] = 'T_PHPCS_IGNORE_FILE'; |
|
410 | + } else if ( substr( $commentTextLower, 0, 13 ) === 'phpcs:disable' ) { |
|
411 | + if ( $lineHasOtherContent === false ) { |
|
412 | 412 | // Completely ignore the comment line. |
413 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
413 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = [ '.all' => true ]; |
|
414 | 414 | } |
415 | 415 | |
416 | - if ($ignoring === null) { |
|
417 | - $ignoring = []; |
|
416 | + if ( $ignoring === null ) { |
|
417 | + $ignoring = [ ]; |
|
418 | 418 | } |
419 | 419 | |
420 | - $disabledSniffs = []; |
|
420 | + $disabledSniffs = [ ]; |
|
421 | 421 | |
422 | - $additionalText = substr($commentText, 14); |
|
423 | - if ($additionalText === false) { |
|
424 | - $ignoring = ['.all' => true]; |
|
422 | + $additionalText = substr( $commentText, 14 ); |
|
423 | + if ( $additionalText === false ) { |
|
424 | + $ignoring = [ '.all' => true ]; |
|
425 | 425 | } else { |
426 | - $parts = explode(',', substr($commentText, 13)); |
|
427 | - foreach ($parts as $sniffCode) { |
|
428 | - $sniffCode = trim($sniffCode); |
|
429 | - $disabledSniffs[$sniffCode] = true; |
|
430 | - $ignoring[$sniffCode] = true; |
|
426 | + $parts = explode( ',', substr( $commentText, 13 ) ); |
|
427 | + foreach ( $parts as $sniffCode ) { |
|
428 | + $sniffCode = trim( $sniffCode ); |
|
429 | + $disabledSniffs[ $sniffCode ] = true; |
|
430 | + $ignoring[ $sniffCode ] = true; |
|
431 | 431 | |
432 | 432 | // This newly disabled sniff might be disabling an existing |
433 | 433 | // enabled exception that we are tracking. |
434 | - if (isset($ignoring['.except']) === true) { |
|
435 | - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { |
|
436 | - if ($ignoredSniffCode === $sniffCode |
|
437 | - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
434 | + if ( isset( $ignoring[ '.except' ] ) === true ) { |
|
435 | + foreach ( array_keys( $ignoring[ '.except' ] ) as $ignoredSniffCode ) { |
|
436 | + if ( $ignoredSniffCode === $sniffCode |
|
437 | + || strpos( $ignoredSniffCode, $sniffCode . '.' ) === 0 |
|
438 | 438 | ) { |
439 | - unset($ignoring['.except'][$ignoredSniffCode]); |
|
439 | + unset( $ignoring[ '.except' ][ $ignoredSniffCode ] ); |
|
440 | 440 | } |
441 | 441 | } |
442 | 442 | |
443 | - if (empty($ignoring['.except']) === true) { |
|
444 | - unset($ignoring['.except']); |
|
443 | + if ( empty( $ignoring[ '.except' ] ) === true ) { |
|
444 | + unset( $ignoring[ '.except' ] ); |
|
445 | 445 | } |
446 | 446 | } |
447 | 447 | }//end foreach |
448 | 448 | }//end if |
449 | 449 | |
450 | - $this->tokens[$i]['code'] = T_PHPCS_DISABLE; |
|
451 | - $this->tokens[$i]['type'] = 'T_PHPCS_DISABLE'; |
|
452 | - $this->tokens[$i]['sniffCodes'] = $disabledSniffs; |
|
453 | - } else if (substr($commentTextLower, 0, 12) === 'phpcs:enable') { |
|
454 | - if ($ignoring !== null) { |
|
455 | - $enabledSniffs = []; |
|
450 | + $this->tokens[ $i ][ 'code' ] = T_PHPCS_DISABLE; |
|
451 | + $this->tokens[ $i ][ 'type' ] = 'T_PHPCS_DISABLE'; |
|
452 | + $this->tokens[ $i ][ 'sniffCodes' ] = $disabledSniffs; |
|
453 | + } else if ( substr( $commentTextLower, 0, 12 ) === 'phpcs:enable' ) { |
|
454 | + if ( $ignoring !== null ) { |
|
455 | + $enabledSniffs = [ ]; |
|
456 | 456 | |
457 | - $additionalText = substr($commentText, 13); |
|
458 | - if ($additionalText === false) { |
|
457 | + $additionalText = substr( $commentText, 13 ); |
|
458 | + if ( $additionalText === false ) { |
|
459 | 459 | $ignoring = null; |
460 | 460 | } else { |
461 | - $parts = explode(',', substr($commentText, 13)); |
|
462 | - foreach ($parts as $sniffCode) { |
|
463 | - $sniffCode = trim($sniffCode); |
|
464 | - $enabledSniffs[$sniffCode] = true; |
|
461 | + $parts = explode( ',', substr( $commentText, 13 ) ); |
|
462 | + foreach ( $parts as $sniffCode ) { |
|
463 | + $sniffCode = trim( $sniffCode ); |
|
464 | + $enabledSniffs[ $sniffCode ] = true; |
|
465 | 465 | |
466 | 466 | // This new enabled sniff might remove previously disabled |
467 | 467 | // sniffs if it is actually a standard or category of sniffs. |
468 | - foreach (array_keys($ignoring) as $ignoredSniffCode) { |
|
469 | - if ($ignoredSniffCode === $sniffCode |
|
470 | - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
468 | + foreach ( array_keys( $ignoring ) as $ignoredSniffCode ) { |
|
469 | + if ( $ignoredSniffCode === $sniffCode |
|
470 | + || strpos( $ignoredSniffCode, $sniffCode . '.' ) === 0 |
|
471 | 471 | ) { |
472 | - unset($ignoring[$ignoredSniffCode]); |
|
472 | + unset( $ignoring[ $ignoredSniffCode ] ); |
|
473 | 473 | } |
474 | 474 | } |
475 | 475 | |
476 | 476 | // This new enabled sniff might be able to clear up |
477 | 477 | // previously enabled sniffs if it is actually a standard or |
478 | 478 | // category of sniffs. |
479 | - if (isset($ignoring['.except']) === true) { |
|
480 | - foreach (array_keys($ignoring['.except']) as $ignoredSniffCode) { |
|
481 | - if ($ignoredSniffCode === $sniffCode |
|
482 | - || strpos($ignoredSniffCode, $sniffCode.'.') === 0 |
|
479 | + if ( isset( $ignoring[ '.except' ] ) === true ) { |
|
480 | + foreach ( array_keys( $ignoring[ '.except' ] ) as $ignoredSniffCode ) { |
|
481 | + if ( $ignoredSniffCode === $sniffCode |
|
482 | + || strpos( $ignoredSniffCode, $sniffCode . '.' ) === 0 |
|
483 | 483 | ) { |
484 | - unset($ignoring['.except'][$ignoredSniffCode]); |
|
484 | + unset( $ignoring[ '.except' ][ $ignoredSniffCode ] ); |
|
485 | 485 | } |
486 | 486 | } |
487 | 487 | } |
488 | 488 | }//end foreach |
489 | 489 | |
490 | - if (empty($ignoring) === true) { |
|
490 | + if ( empty( $ignoring ) === true ) { |
|
491 | 491 | $ignoring = null; |
492 | 492 | } else { |
493 | - if (isset($ignoring['.except']) === true) { |
|
494 | - $ignoring['.except'] += $enabledSniffs; |
|
493 | + if ( isset( $ignoring[ '.except' ] ) === true ) { |
|
494 | + $ignoring[ '.except' ] += $enabledSniffs; |
|
495 | 495 | } else { |
496 | - $ignoring['.except'] = $enabledSniffs; |
|
496 | + $ignoring[ '.except' ] = $enabledSniffs; |
|
497 | 497 | } |
498 | 498 | } |
499 | 499 | }//end if |
500 | 500 | |
501 | - if ($lineHasOtherContent === false) { |
|
501 | + if ( $lineHasOtherContent === false ) { |
|
502 | 502 | // Completely ignore the comment line. |
503 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
503 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = [ '.all' => true ]; |
|
504 | 504 | } else { |
505 | 505 | // The comment is on the same line as the code it is ignoring, |
506 | 506 | // so respect the new ignore rules. |
507 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
507 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoring; |
|
508 | 508 | } |
509 | 509 | |
510 | - $this->tokens[$i]['sniffCodes'] = $enabledSniffs; |
|
510 | + $this->tokens[ $i ][ 'sniffCodes' ] = $enabledSniffs; |
|
511 | 511 | }//end if |
512 | 512 | |
513 | - $this->tokens[$i]['code'] = T_PHPCS_ENABLE; |
|
514 | - $this->tokens[$i]['type'] = 'T_PHPCS_ENABLE'; |
|
515 | - } else if (substr($commentTextLower, 0, 12) === 'phpcs:ignore') { |
|
516 | - $ignoreRules = []; |
|
513 | + $this->tokens[ $i ][ 'code' ] = T_PHPCS_ENABLE; |
|
514 | + $this->tokens[ $i ][ 'type' ] = 'T_PHPCS_ENABLE'; |
|
515 | + } else if ( substr( $commentTextLower, 0, 12 ) === 'phpcs:ignore' ) { |
|
516 | + $ignoreRules = [ ]; |
|
517 | 517 | |
518 | - $additionalText = substr($commentText, 13); |
|
519 | - if ($additionalText === false) { |
|
520 | - $ignoreRules = ['.all' => true]; |
|
518 | + $additionalText = substr( $commentText, 13 ); |
|
519 | + if ( $additionalText === false ) { |
|
520 | + $ignoreRules = [ '.all' => true ]; |
|
521 | 521 | } else { |
522 | - $parts = explode(',', substr($commentText, 13)); |
|
523 | - foreach ($parts as $sniffCode) { |
|
524 | - $ignoreRules[trim($sniffCode)] = true; |
|
522 | + $parts = explode( ',', substr( $commentText, 13 ) ); |
|
523 | + foreach ( $parts as $sniffCode ) { |
|
524 | + $ignoreRules[ trim( $sniffCode ) ] = true; |
|
525 | 525 | } |
526 | 526 | } |
527 | 527 | |
528 | - $this->tokens[$i]['code'] = T_PHPCS_IGNORE; |
|
529 | - $this->tokens[$i]['type'] = 'T_PHPCS_IGNORE'; |
|
530 | - $this->tokens[$i]['sniffCodes'] = $ignoreRules; |
|
528 | + $this->tokens[ $i ][ 'code' ] = T_PHPCS_IGNORE; |
|
529 | + $this->tokens[ $i ][ 'type' ] = 'T_PHPCS_IGNORE'; |
|
530 | + $this->tokens[ $i ][ 'sniffCodes' ] = $ignoreRules; |
|
531 | 531 | |
532 | - if ($ignoring !== null) { |
|
532 | + if ( $ignoring !== null ) { |
|
533 | 533 | $ignoreRules += $ignoring; |
534 | 534 | } |
535 | 535 | |
536 | - if ($lineHasOtherContent === false) { |
|
536 | + if ( $lineHasOtherContent === false ) { |
|
537 | 537 | // Completely ignore the comment line, and set the following |
538 | 538 | // line to include the ignore rules we've set. |
539 | - $this->ignoredLines[$this->tokens[$i]['line']] = ['.all' => true]; |
|
540 | - $this->ignoredLines[($this->tokens[$i]['line'] + 1)] = $ignoreRules; |
|
539 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = [ '.all' => true ]; |
|
540 | + $this->ignoredLines[ ( $this->tokens[ $i ][ 'line' ] + 1 ) ] = $ignoreRules; |
|
541 | 541 | } else { |
542 | 542 | // The comment is on the same line as the code it is ignoring, |
543 | 543 | // so respect the ignore rules it set. |
544 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoreRules; |
|
544 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoreRules; |
|
545 | 545 | } |
546 | 546 | }//end if |
547 | 547 | }//end if |
548 | 548 | }//end if |
549 | 549 | |
550 | - if ($ignoring !== null && isset($this->ignoredLines[$this->tokens[$i]['line']]) === false) { |
|
551 | - $this->ignoredLines[$this->tokens[$i]['line']] = $ignoring; |
|
550 | + if ( $ignoring !== null && isset( $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] ) === false ) { |
|
551 | + $this->ignoredLines[ $this->tokens[ $i ][ 'line' ] ] = $ignoring; |
|
552 | 552 | } |
553 | 553 | }//end for |
554 | 554 | |
555 | 555 | // If annotations are being ignored, we clear out all the ignore rules |
556 | 556 | // but leave the annotations tokenized as normal. |
557 | - if ($checkAnnotations === false) { |
|
558 | - $this->ignoredLines = []; |
|
557 | + if ( $checkAnnotations === false ) { |
|
558 | + $this->ignoredLines = [ ]; |
|
559 | 559 | } |
560 | 560 | |
561 | 561 | }//end createPositionMap() |
@@ -576,52 +576,52 @@ discard block |
||
576 | 576 | * |
577 | 577 | * @return void |
578 | 578 | */ |
579 | - public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) |
|
579 | + public function replaceTabsInToken( &$token, $prefix = ' ', $padding = ' ', $tabWidth = null ) |
|
580 | 580 | { |
581 | 581 | $checkEncoding = false; |
582 | - if (function_exists('iconv_strlen') === true) { |
|
582 | + if ( function_exists( 'iconv_strlen' ) === true ) { |
|
583 | 583 | $checkEncoding = true; |
584 | 584 | } |
585 | 585 | |
586 | - $currColumn = $token['column']; |
|
587 | - if ($tabWidth === null) { |
|
586 | + $currColumn = $token[ 'column' ]; |
|
587 | + if ( $tabWidth === null ) { |
|
588 | 588 | $tabWidth = $this->config->tabWidth; |
589 | - if ($tabWidth === 0) { |
|
589 | + if ( $tabWidth === 0 ) { |
|
590 | 590 | $tabWidth = 1; |
591 | 591 | } |
592 | 592 | } |
593 | 593 | |
594 | - if (rtrim($token['content'], "\t") === '') { |
|
594 | + if ( rtrim( $token[ 'content' ], "\t" ) === '' ) { |
|
595 | 595 | // String only contains tabs, so we can shortcut the process. |
596 | - $numTabs = strlen($token['content']); |
|
596 | + $numTabs = strlen( $token[ 'content' ] ); |
|
597 | 597 | |
598 | - $firstTabSize = ($tabWidth - (($currColumn - 1) % $tabWidth)); |
|
599 | - $length = ($firstTabSize + ($tabWidth * ($numTabs - 1))); |
|
600 | - $newContent = $prefix.str_repeat($padding, ($length - 1)); |
|
598 | + $firstTabSize = ( $tabWidth - ( ( $currColumn - 1 ) % $tabWidth ) ); |
|
599 | + $length = ( $firstTabSize + ( $tabWidth * ( $numTabs - 1 ) ) ); |
|
600 | + $newContent = $prefix . str_repeat( $padding, ( $length - 1 ) ); |
|
601 | 601 | } else { |
602 | 602 | // We need to determine the length of each tab. |
603 | - $tabs = explode("\t", $token['content']); |
|
603 | + $tabs = explode( "\t", $token[ 'content' ] ); |
|
604 | 604 | |
605 | - $numTabs = (count($tabs) - 1); |
|
605 | + $numTabs = ( count( $tabs ) - 1 ); |
|
606 | 606 | $tabNum = 0; |
607 | 607 | $newContent = ''; |
608 | 608 | $length = 0; |
609 | 609 | |
610 | - foreach ($tabs as $content) { |
|
611 | - if ($content !== '') { |
|
610 | + foreach ( $tabs as $content ) { |
|
611 | + if ( $content !== '' ) { |
|
612 | 612 | $newContent .= $content; |
613 | - if ($checkEncoding === true) { |
|
613 | + if ( $checkEncoding === true ) { |
|
614 | 614 | // Not using the default encoding, so take a bit more care. |
615 | 615 | $oldLevel = error_reporting(); |
616 | - error_reporting(0); |
|
617 | - $contentLength = iconv_strlen($content, $this->config->encoding); |
|
618 | - error_reporting($oldLevel); |
|
619 | - if ($contentLength === false) { |
|
616 | + error_reporting( 0 ); |
|
617 | + $contentLength = iconv_strlen( $content, $this->config->encoding ); |
|
618 | + error_reporting( $oldLevel ); |
|
619 | + if ( $contentLength === false ) { |
|
620 | 620 | // String contained invalid characters, so revert to default. |
621 | - $contentLength = strlen($content); |
|
621 | + $contentLength = strlen( $content ); |
|
622 | 622 | } |
623 | 623 | } else { |
624 | - $contentLength = strlen($content); |
|
624 | + $contentLength = strlen( $content ); |
|
625 | 625 | } |
626 | 626 | |
627 | 627 | $currColumn += $contentLength; |
@@ -629,7 +629,7 @@ discard block |
||
629 | 629 | } |
630 | 630 | |
631 | 631 | // The last piece of content does not have a tab after it. |
632 | - if ($tabNum === $numTabs) { |
|
632 | + if ( $tabNum === $numTabs ) { |
|
633 | 633 | break; |
634 | 634 | } |
635 | 635 | |
@@ -638,27 +638,27 @@ discard block |
||
638 | 638 | $tabNum++; |
639 | 639 | |
640 | 640 | // Move the pointer to the next tab stop. |
641 | - if (($currColumn % $tabWidth) === 0) { |
|
641 | + if ( ( $currColumn % $tabWidth ) === 0 ) { |
|
642 | 642 | // This is the first tab, and we are already at a |
643 | 643 | // tab stop, so this tab counts as a single space. |
644 | 644 | $currColumn++; |
645 | 645 | } else { |
646 | 646 | $currColumn++; |
647 | - while (($currColumn % $tabWidth) !== 0) { |
|
647 | + while ( ( $currColumn % $tabWidth ) !== 0 ) { |
|
648 | 648 | $currColumn++; |
649 | 649 | } |
650 | 650 | |
651 | 651 | $currColumn++; |
652 | 652 | } |
653 | 653 | |
654 | - $length += ($currColumn - $lastCurrColumn); |
|
655 | - $newContent .= $prefix.str_repeat($padding, ($currColumn - $lastCurrColumn - 1)); |
|
654 | + $length += ( $currColumn - $lastCurrColumn ); |
|
655 | + $newContent .= $prefix . str_repeat( $padding, ( $currColumn - $lastCurrColumn - 1 ) ); |
|
656 | 656 | }//end foreach |
657 | 657 | }//end if |
658 | 658 | |
659 | - $token['orig_content'] = $token['content']; |
|
660 | - $token['content'] = $newContent; |
|
661 | - $token['length'] = $length; |
|
659 | + $token[ 'orig_content' ] = $token[ 'content' ]; |
|
660 | + $token[ 'content' ] = $newContent; |
|
661 | + $token[ 'length' ] = $length; |
|
662 | 662 | |
663 | 663 | }//end replaceTabsInToken() |
664 | 664 | |
@@ -670,50 +670,50 @@ discard block |
||
670 | 670 | */ |
671 | 671 | private function createTokenMap() |
672 | 672 | { |
673 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
674 | - echo "\t*** START TOKEN MAP ***".PHP_EOL; |
|
673 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
674 | + echo "\t*** START TOKEN MAP ***" . PHP_EOL; |
|
675 | 675 | } |
676 | 676 | |
677 | - $squareOpeners = []; |
|
678 | - $curlyOpeners = []; |
|
679 | - $this->numTokens = count($this->tokens); |
|
677 | + $squareOpeners = [ ]; |
|
678 | + $curlyOpeners = [ ]; |
|
679 | + $this->numTokens = count( $this->tokens ); |
|
680 | 680 | |
681 | - $openers = []; |
|
681 | + $openers = [ ]; |
|
682 | 682 | $openOwner = null; |
683 | 683 | |
684 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
684 | + for ( $i = 0; $i < $this->numTokens; $i++ ) { |
|
685 | 685 | /* |
686 | 686 | Parenthesis mapping. |
687 | 687 | */ |
688 | 688 | |
689 | - if (isset(Util\Tokens::$parenthesisOpeners[$this->tokens[$i]['code']]) === true) { |
|
690 | - $this->tokens[$i]['parenthesis_opener'] = null; |
|
691 | - $this->tokens[$i]['parenthesis_closer'] = null; |
|
692 | - $this->tokens[$i]['parenthesis_owner'] = $i; |
|
689 | + if ( isset( Util\Tokens::$parenthesisOpeners[ $this->tokens[ $i ][ 'code' ] ] ) === true ) { |
|
690 | + $this->tokens[ $i ][ 'parenthesis_opener' ] = null; |
|
691 | + $this->tokens[ $i ][ 'parenthesis_closer' ] = null; |
|
692 | + $this->tokens[ $i ][ 'parenthesis_owner' ] = $i; |
|
693 | 693 | $openOwner = $i; |
694 | - } else if ($this->tokens[$i]['code'] === T_OPEN_PARENTHESIS) { |
|
695 | - $openers[] = $i; |
|
696 | - $this->tokens[$i]['parenthesis_opener'] = $i; |
|
697 | - if ($openOwner !== null) { |
|
698 | - $this->tokens[$openOwner]['parenthesis_opener'] = $i; |
|
699 | - $this->tokens[$i]['parenthesis_owner'] = $openOwner; |
|
694 | + } else if ( $this->tokens[ $i ][ 'code' ] === T_OPEN_PARENTHESIS ) { |
|
695 | + $openers[ ] = $i; |
|
696 | + $this->tokens[ $i ][ 'parenthesis_opener' ] = $i; |
|
697 | + if ( $openOwner !== null ) { |
|
698 | + $this->tokens[ $openOwner ][ 'parenthesis_opener' ] = $i; |
|
699 | + $this->tokens[ $i ][ 'parenthesis_owner' ] = $openOwner; |
|
700 | 700 | $openOwner = null; |
701 | 701 | } |
702 | - } else if ($this->tokens[$i]['code'] === T_CLOSE_PARENTHESIS) { |
|
702 | + } else if ( $this->tokens[ $i ][ 'code' ] === T_CLOSE_PARENTHESIS ) { |
|
703 | 703 | // Did we set an owner for this set of parenthesis? |
704 | - $numOpeners = count($openers); |
|
705 | - if ($numOpeners !== 0) { |
|
706 | - $opener = array_pop($openers); |
|
707 | - if (isset($this->tokens[$opener]['parenthesis_owner']) === true) { |
|
708 | - $owner = $this->tokens[$opener]['parenthesis_owner']; |
|
709 | - |
|
710 | - $this->tokens[$owner]['parenthesis_closer'] = $i; |
|
711 | - $this->tokens[$i]['parenthesis_owner'] = $owner; |
|
704 | + $numOpeners = count( $openers ); |
|
705 | + if ( $numOpeners !== 0 ) { |
|
706 | + $opener = array_pop( $openers ); |
|
707 | + if ( isset( $this->tokens[ $opener ][ 'parenthesis_owner' ] ) === true ) { |
|
708 | + $owner = $this->tokens[ $opener ][ 'parenthesis_owner' ]; |
|
709 | + |
|
710 | + $this->tokens[ $owner ][ 'parenthesis_closer' ] = $i; |
|
711 | + $this->tokens[ $i ][ 'parenthesis_owner' ] = $owner; |
|
712 | 712 | } |
713 | 713 | |
714 | - $this->tokens[$i]['parenthesis_opener'] = $opener; |
|
715 | - $this->tokens[$i]['parenthesis_closer'] = $i; |
|
716 | - $this->tokens[$opener]['parenthesis_closer'] = $i; |
|
714 | + $this->tokens[ $i ][ 'parenthesis_opener' ] = $opener; |
|
715 | + $this->tokens[ $i ][ 'parenthesis_closer' ] = $i; |
|
716 | + $this->tokens[ $opener ][ 'parenthesis_closer' ] = $i; |
|
717 | 717 | } |
718 | 718 | }//end if |
719 | 719 | |
@@ -721,56 +721,56 @@ discard block |
||
721 | 721 | Bracket mapping. |
722 | 722 | */ |
723 | 723 | |
724 | - switch ($this->tokens[$i]['code']) { |
|
724 | + switch ( $this->tokens[ $i ][ 'code' ] ) { |
|
725 | 725 | case T_OPEN_SQUARE_BRACKET: |
726 | - $squareOpeners[] = $i; |
|
726 | + $squareOpeners[ ] = $i; |
|
727 | 727 | |
728 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
729 | - echo str_repeat("\t", count($squareOpeners)); |
|
730 | - echo str_repeat("\t", count($curlyOpeners)); |
|
731 | - echo "=> Found square bracket opener at $i".PHP_EOL; |
|
728 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
729 | + echo str_repeat( "\t", count( $squareOpeners ) ); |
|
730 | + echo str_repeat( "\t", count( $curlyOpeners ) ); |
|
731 | + echo "=> Found square bracket opener at $i" . PHP_EOL; |
|
732 | 732 | } |
733 | 733 | break; |
734 | 734 | case T_OPEN_CURLY_BRACKET: |
735 | - if (isset($this->tokens[$i]['scope_closer']) === false) { |
|
736 | - $curlyOpeners[] = $i; |
|
735 | + if ( isset( $this->tokens[ $i ][ 'scope_closer' ] ) === false ) { |
|
736 | + $curlyOpeners[ ] = $i; |
|
737 | 737 | |
738 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
739 | - echo str_repeat("\t", count($squareOpeners)); |
|
740 | - echo str_repeat("\t", count($curlyOpeners)); |
|
741 | - echo "=> Found curly bracket opener at $i".PHP_EOL; |
|
738 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
739 | + echo str_repeat( "\t", count( $squareOpeners ) ); |
|
740 | + echo str_repeat( "\t", count( $curlyOpeners ) ); |
|
741 | + echo "=> Found curly bracket opener at $i" . PHP_EOL; |
|
742 | 742 | } |
743 | 743 | } |
744 | 744 | break; |
745 | 745 | case T_CLOSE_SQUARE_BRACKET: |
746 | - if (empty($squareOpeners) === false) { |
|
747 | - $opener = array_pop($squareOpeners); |
|
748 | - $this->tokens[$i]['bracket_opener'] = $opener; |
|
749 | - $this->tokens[$i]['bracket_closer'] = $i; |
|
750 | - $this->tokens[$opener]['bracket_opener'] = $opener; |
|
751 | - $this->tokens[$opener]['bracket_closer'] = $i; |
|
752 | - |
|
753 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
754 | - echo str_repeat("\t", count($squareOpeners)); |
|
755 | - echo str_repeat("\t", count($curlyOpeners)); |
|
756 | - echo "\t=> Found square bracket closer at $i for $opener".PHP_EOL; |
|
746 | + if ( empty( $squareOpeners ) === false ) { |
|
747 | + $opener = array_pop( $squareOpeners ); |
|
748 | + $this->tokens[ $i ][ 'bracket_opener' ] = $opener; |
|
749 | + $this->tokens[ $i ][ 'bracket_closer' ] = $i; |
|
750 | + $this->tokens[ $opener ][ 'bracket_opener' ] = $opener; |
|
751 | + $this->tokens[ $opener ][ 'bracket_closer' ] = $i; |
|
752 | + |
|
753 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
754 | + echo str_repeat( "\t", count( $squareOpeners ) ); |
|
755 | + echo str_repeat( "\t", count( $curlyOpeners ) ); |
|
756 | + echo "\t=> Found square bracket closer at $i for $opener" . PHP_EOL; |
|
757 | 757 | } |
758 | 758 | } |
759 | 759 | break; |
760 | 760 | case T_CLOSE_CURLY_BRACKET: |
761 | - if (empty($curlyOpeners) === false |
|
762 | - && isset($this->tokens[$i]['scope_opener']) === false |
|
761 | + if ( empty( $curlyOpeners ) === false |
|
762 | + && isset( $this->tokens[ $i ][ 'scope_opener' ] ) === false |
|
763 | 763 | ) { |
764 | - $opener = array_pop($curlyOpeners); |
|
765 | - $this->tokens[$i]['bracket_opener'] = $opener; |
|
766 | - $this->tokens[$i]['bracket_closer'] = $i; |
|
767 | - $this->tokens[$opener]['bracket_opener'] = $opener; |
|
768 | - $this->tokens[$opener]['bracket_closer'] = $i; |
|
769 | - |
|
770 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
771 | - echo str_repeat("\t", count($squareOpeners)); |
|
772 | - echo str_repeat("\t", count($curlyOpeners)); |
|
773 | - echo "\t=> Found curly bracket closer at $i for $opener".PHP_EOL; |
|
764 | + $opener = array_pop( $curlyOpeners ); |
|
765 | + $this->tokens[ $i ][ 'bracket_opener' ] = $opener; |
|
766 | + $this->tokens[ $i ][ 'bracket_closer' ] = $i; |
|
767 | + $this->tokens[ $opener ][ 'bracket_opener' ] = $opener; |
|
768 | + $this->tokens[ $opener ][ 'bracket_closer' ] = $i; |
|
769 | + |
|
770 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
771 | + echo str_repeat( "\t", count( $squareOpeners ) ); |
|
772 | + echo str_repeat( "\t", count( $curlyOpeners ) ); |
|
773 | + echo "\t=> Found curly bracket closer at $i for $opener" . PHP_EOL; |
|
774 | 774 | } |
775 | 775 | } |
776 | 776 | break; |
@@ -781,13 +781,13 @@ discard block |
||
781 | 781 | |
782 | 782 | // Cleanup for any openers that we didn't find closers for. |
783 | 783 | // This typically means there was a syntax error breaking things. |
784 | - foreach ($openers as $opener) { |
|
785 | - unset($this->tokens[$opener]['parenthesis_opener']); |
|
786 | - unset($this->tokens[$opener]['parenthesis_owner']); |
|
784 | + foreach ( $openers as $opener ) { |
|
785 | + unset( $this->tokens[ $opener ][ 'parenthesis_opener' ] ); |
|
786 | + unset( $this->tokens[ $opener ][ 'parenthesis_owner' ] ); |
|
787 | 787 | } |
788 | 788 | |
789 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
790 | - echo "\t*** END TOKEN MAP ***".PHP_EOL; |
|
789 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
790 | + echo "\t*** END TOKEN MAP ***" . PHP_EOL; |
|
791 | 791 | } |
792 | 792 | |
793 | 793 | }//end createTokenMap() |
@@ -800,29 +800,29 @@ discard block |
||
800 | 800 | */ |
801 | 801 | private function createParenthesisNestingMap() |
802 | 802 | { |
803 | - $map = []; |
|
804 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
805 | - if (isset($this->tokens[$i]['parenthesis_opener']) === true |
|
806 | - && $i === $this->tokens[$i]['parenthesis_opener'] |
|
803 | + $map = [ ]; |
|
804 | + for ( $i = 0; $i < $this->numTokens; $i++ ) { |
|
805 | + if ( isset( $this->tokens[ $i ][ 'parenthesis_opener' ] ) === true |
|
806 | + && $i === $this->tokens[ $i ][ 'parenthesis_opener' ] |
|
807 | 807 | ) { |
808 | - if (empty($map) === false) { |
|
809 | - $this->tokens[$i]['nested_parenthesis'] = $map; |
|
808 | + if ( empty( $map ) === false ) { |
|
809 | + $this->tokens[ $i ][ 'nested_parenthesis' ] = $map; |
|
810 | 810 | } |
811 | 811 | |
812 | - if (isset($this->tokens[$i]['parenthesis_closer']) === true) { |
|
813 | - $map[$this->tokens[$i]['parenthesis_opener']] |
|
814 | - = $this->tokens[$i]['parenthesis_closer']; |
|
812 | + if ( isset( $this->tokens[ $i ][ 'parenthesis_closer' ] ) === true ) { |
|
813 | + $map[ $this->tokens[ $i ][ 'parenthesis_opener' ] ] |
|
814 | + = $this->tokens[ $i ][ 'parenthesis_closer' ]; |
|
815 | 815 | } |
816 | - } else if (isset($this->tokens[$i]['parenthesis_closer']) === true |
|
817 | - && $i === $this->tokens[$i]['parenthesis_closer'] |
|
816 | + } else if ( isset( $this->tokens[ $i ][ 'parenthesis_closer' ] ) === true |
|
817 | + && $i === $this->tokens[ $i ][ 'parenthesis_closer' ] |
|
818 | 818 | ) { |
819 | - array_pop($map); |
|
820 | - if (empty($map) === false) { |
|
821 | - $this->tokens[$i]['nested_parenthesis'] = $map; |
|
819 | + array_pop( $map ); |
|
820 | + if ( empty( $map ) === false ) { |
|
821 | + $this->tokens[ $i ][ 'nested_parenthesis' ] = $map; |
|
822 | 822 | } |
823 | 823 | } else { |
824 | - if (empty($map) === false) { |
|
825 | - $this->tokens[$i]['nested_parenthesis'] = $map; |
|
824 | + if ( empty( $map ) === false ) { |
|
825 | + $this->tokens[ $i ][ 'nested_parenthesis' ] = $map; |
|
826 | 826 | } |
827 | 827 | }//end if |
828 | 828 | }//end for |
@@ -838,33 +838,33 @@ discard block |
||
838 | 838 | */ |
839 | 839 | private function createScopeMap() |
840 | 840 | { |
841 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
842 | - echo "\t*** START SCOPE MAP ***".PHP_EOL; |
|
841 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
842 | + echo "\t*** START SCOPE MAP ***" . PHP_EOL; |
|
843 | 843 | } |
844 | 844 | |
845 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
845 | + for ( $i = 0; $i < $this->numTokens; $i++ ) { |
|
846 | 846 | // Check to see if the current token starts a new scope. |
847 | - if (isset($this->scopeOpeners[$this->tokens[$i]['code']]) === true) { |
|
848 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
849 | - $type = $this->tokens[$i]['type']; |
|
850 | - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
851 | - echo "\tStart scope map at $i:$type => $content".PHP_EOL; |
|
847 | + if ( isset( $this->scopeOpeners[ $this->tokens[ $i ][ 'code' ] ] ) === true ) { |
|
848 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
849 | + $type = $this->tokens[ $i ][ 'type' ]; |
|
850 | + $content = Util\Common::prepareForOutput( $this->tokens[ $i ][ 'content' ] ); |
|
851 | + echo "\tStart scope map at $i:$type => $content" . PHP_EOL; |
|
852 | 852 | } |
853 | 853 | |
854 | - if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
855 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
856 | - echo "\t* already processed, skipping *".PHP_EOL; |
|
854 | + if ( isset( $this->tokens[ $i ][ 'scope_condition' ] ) === true ) { |
|
855 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
856 | + echo "\t* already processed, skipping *" . PHP_EOL; |
|
857 | 857 | } |
858 | 858 | |
859 | 859 | continue; |
860 | 860 | } |
861 | 861 | |
862 | - $i = $this->recurseScopeMap($i); |
|
862 | + $i = $this->recurseScopeMap( $i ); |
|
863 | 863 | }//end if |
864 | 864 | }//end for |
865 | 865 | |
866 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
867 | - echo "\t*** END SCOPE MAP ***".PHP_EOL; |
|
866 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
867 | + echo "\t*** END SCOPE MAP ***" . PHP_EOL; |
|
868 | 868 | } |
869 | 869 | |
870 | 870 | }//end createScopeMap() |
@@ -880,16 +880,16 @@ discard block |
||
880 | 880 | * |
881 | 881 | * @return int The position in the stack that closed the scope. |
882 | 882 | */ |
883 | - private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) |
|
883 | + private function recurseScopeMap( $stackPtr, $depth = 1, &$ignore = 0 ) |
|
884 | 884 | { |
885 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
886 | - echo str_repeat("\t", $depth); |
|
887 | - echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; |
|
885 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
886 | + echo str_repeat( "\t", $depth ); |
|
887 | + echo "=> Begin scope map recursion at token $stackPtr with depth $depth" . PHP_EOL; |
|
888 | 888 | } |
889 | 889 | |
890 | 890 | $opener = null; |
891 | - $currType = $this->tokens[$stackPtr]['code']; |
|
892 | - $startLine = $this->tokens[$stackPtr]['line']; |
|
891 | + $currType = $this->tokens[ $stackPtr ][ 'code' ]; |
|
892 | + $startLine = $this->tokens[ $stackPtr ][ 'line' ]; |
|
893 | 893 | |
894 | 894 | // We will need this to restore the value if we end up |
895 | 895 | // returning a token ID that causes our calling function to go back |
@@ -898,29 +898,29 @@ discard block |
||
898 | 898 | |
899 | 899 | // If the start token for this scope opener is the same as |
900 | 900 | // the scope token, we have already found our opener. |
901 | - if (isset($this->scopeOpeners[$currType]['start'][$currType]) === true) { |
|
901 | + if ( isset( $this->scopeOpeners[ $currType ][ 'start' ][ $currType ] ) === true ) { |
|
902 | 902 | $opener = $stackPtr; |
903 | 903 | } |
904 | 904 | |
905 | - for ($i = ($stackPtr + 1); $i < $this->numTokens; $i++) { |
|
906 | - $tokenType = $this->tokens[$i]['code']; |
|
905 | + for ( $i = ( $stackPtr + 1 ); $i < $this->numTokens; $i++ ) { |
|
906 | + $tokenType = $this->tokens[ $i ][ 'code' ]; |
|
907 | 907 | |
908 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
909 | - $type = $this->tokens[$i]['type']; |
|
910 | - $line = $this->tokens[$i]['line']; |
|
911 | - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
908 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
909 | + $type = $this->tokens[ $i ][ 'type' ]; |
|
910 | + $line = $this->tokens[ $i ][ 'line' ]; |
|
911 | + $content = Util\Common::prepareForOutput( $this->tokens[ $i ][ 'content' ] ); |
|
912 | 912 | |
913 | - echo str_repeat("\t", $depth); |
|
913 | + echo str_repeat( "\t", $depth ); |
|
914 | 914 | echo "Process token $i on line $line ["; |
915 | - if ($opener !== null) { |
|
915 | + if ( $opener !== null ) { |
|
916 | 916 | echo "opener:$opener;"; |
917 | 917 | } |
918 | 918 | |
919 | - if ($ignore > 0) { |
|
919 | + if ( $ignore > 0 ) { |
|
920 | 920 | echo "ignore=$ignore;"; |
921 | 921 | } |
922 | 922 | |
923 | - echo "]: $type => $content".PHP_EOL; |
|
923 | + echo "]: $type => $content" . PHP_EOL; |
|
924 | 924 | }//end if |
925 | 925 | |
926 | 926 | // Very special case for IF statements in PHP that can be defined without |
@@ -929,21 +929,21 @@ discard block |
||
929 | 929 | // keyword, the opener will be incorrectly assigned to this IF statement. |
930 | 930 | // The same case also applies to USE statements, which don't have to have |
931 | 931 | // openers, so a following USE statement can cause an incorrect brace match. |
932 | - if (($currType === T_IF || $currType === T_ELSE || $currType === T_USE) |
|
932 | + if ( ( $currType === T_IF || $currType === T_ELSE || $currType === T_USE ) |
|
933 | 933 | && $opener === null |
934 | - && ($this->tokens[$i]['code'] === T_SEMICOLON |
|
935 | - || $this->tokens[$i]['code'] === T_CLOSE_TAG) |
|
934 | + && ( $this->tokens[ $i ][ 'code' ] === T_SEMICOLON |
|
935 | + || $this->tokens[ $i ][ 'code' ] === T_CLOSE_TAG ) |
|
936 | 936 | ) { |
937 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
938 | - $type = $this->tokens[$stackPtr]['type']; |
|
939 | - echo str_repeat("\t", $depth); |
|
940 | - if ($this->tokens[$i]['code'] === T_SEMICOLON) { |
|
937 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
938 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
939 | + echo str_repeat( "\t", $depth ); |
|
940 | + if ( $this->tokens[ $i ][ 'code' ] === T_SEMICOLON ) { |
|
941 | 941 | $closerType = 'semicolon'; |
942 | 942 | } else { |
943 | 943 | $closerType = 'close tag'; |
944 | 944 | } |
945 | 945 | |
946 | - echo "=> Found $closerType before scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
946 | + echo "=> Found $closerType before scope opener for $stackPtr:$type, bailing" . PHP_EOL; |
|
947 | 947 | } |
948 | 948 | |
949 | 949 | return $i; |
@@ -953,45 +953,45 @@ discard block |
||
953 | 953 | // If we find a curly brace closer before we find the opener, |
954 | 954 | // we're not going to find an opener. That closer probably belongs to |
955 | 955 | // a control structure higher up. |
956 | - if ($opener === null |
|
956 | + if ( $opener === null |
|
957 | 957 | && $ignore === 0 |
958 | 958 | && $tokenType === T_CLOSE_CURLY_BRACKET |
959 | - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true |
|
959 | + && isset( $this->scopeOpeners[ $currType ][ 'end' ][ $tokenType ] ) === true |
|
960 | 960 | ) { |
961 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
962 | - $type = $this->tokens[$stackPtr]['type']; |
|
963 | - echo str_repeat("\t", $depth); |
|
964 | - echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
961 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
962 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
963 | + echo str_repeat( "\t", $depth ); |
|
964 | + echo "=> Found curly brace closer before scope opener for $stackPtr:$type, bailing" . PHP_EOL; |
|
965 | 965 | } |
966 | 966 | |
967 | - return ($i - 1); |
|
967 | + return ( $i - 1 ); |
|
968 | 968 | } |
969 | 969 | |
970 | - if ($opener !== null |
|
971 | - && (isset($this->tokens[$i]['scope_opener']) === false |
|
972 | - || $this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) |
|
973 | - && isset($this->scopeOpeners[$currType]['end'][$tokenType]) === true |
|
970 | + if ( $opener !== null |
|
971 | + && ( isset( $this->tokens[ $i ][ 'scope_opener' ] ) === false |
|
972 | + || $this->scopeOpeners[ $this->tokens[ $stackPtr ][ 'code' ] ][ 'shared' ] === true ) |
|
973 | + && isset( $this->scopeOpeners[ $currType ][ 'end' ][ $tokenType ] ) === true |
|
974 | 974 | ) { |
975 | - if ($ignore > 0 && $tokenType === T_CLOSE_CURLY_BRACKET) { |
|
975 | + if ( $ignore > 0 && $tokenType === T_CLOSE_CURLY_BRACKET ) { |
|
976 | 976 | // The last opening bracket must have been for a string |
977 | 977 | // offset or alike, so let's ignore it. |
978 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
979 | - echo str_repeat("\t", $depth); |
|
980 | - echo '* finished ignoring curly brace *'.PHP_EOL; |
|
978 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
979 | + echo str_repeat( "\t", $depth ); |
|
980 | + echo '* finished ignoring curly brace *' . PHP_EOL; |
|
981 | 981 | } |
982 | 982 | |
983 | 983 | $ignore--; |
984 | 984 | continue; |
985 | - } else if ($this->tokens[$opener]['code'] === T_OPEN_CURLY_BRACKET |
|
985 | + } else if ( $this->tokens[ $opener ][ 'code' ] === T_OPEN_CURLY_BRACKET |
|
986 | 986 | && $tokenType !== T_CLOSE_CURLY_BRACKET |
987 | 987 | ) { |
988 | 988 | // The opener is a curly bracket so the closer must be a curly bracket as well. |
989 | 989 | // We ignore this closer to handle cases such as T_ELSE or T_ELSEIF being considered |
990 | 990 | // a closer of T_IF when it should not. |
991 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
992 | - $type = $this->tokens[$stackPtr]['type']; |
|
993 | - echo str_repeat("\t", $depth); |
|
994 | - echo "=> Ignoring non-curly scope closer for $stackPtr:$type".PHP_EOL; |
|
991 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
992 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
993 | + echo str_repeat( "\t", $depth ); |
|
994 | + echo "=> Ignoring non-curly scope closer for $stackPtr:$type" . PHP_EOL; |
|
995 | 995 | } |
996 | 996 | } else { |
997 | 997 | $scopeCloser = $i; |
@@ -1000,63 +1000,63 @@ discard block |
||
1000 | 1000 | $opener, |
1001 | 1001 | ]; |
1002 | 1002 | |
1003 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1004 | - $type = $this->tokens[$stackPtr]['type']; |
|
1005 | - $closerType = $this->tokens[$scopeCloser]['type']; |
|
1006 | - echo str_repeat("\t", $depth); |
|
1007 | - echo "=> Found scope closer ($scopeCloser:$closerType) for $stackPtr:$type".PHP_EOL; |
|
1003 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1004 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1005 | + $closerType = $this->tokens[ $scopeCloser ][ 'type' ]; |
|
1006 | + echo str_repeat( "\t", $depth ); |
|
1007 | + echo "=> Found scope closer ($scopeCloser:$closerType) for $stackPtr:$type" . PHP_EOL; |
|
1008 | 1008 | } |
1009 | 1009 | |
1010 | 1010 | $validCloser = true; |
1011 | - if (($this->tokens[$stackPtr]['code'] === T_IF || $this->tokens[$stackPtr]['code'] === T_ELSEIF) |
|
1012 | - && ($tokenType === T_ELSE || $tokenType === T_ELSEIF) |
|
1011 | + if ( ( $this->tokens[ $stackPtr ][ 'code' ] === T_IF || $this->tokens[ $stackPtr ][ 'code' ] === T_ELSEIF ) |
|
1012 | + && ( $tokenType === T_ELSE || $tokenType === T_ELSEIF ) |
|
1013 | 1013 | ) { |
1014 | 1014 | // To be a closer, this token must have an opener. |
1015 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1016 | - echo str_repeat("\t", $depth); |
|
1017 | - echo "* closer needs to be tested *".PHP_EOL; |
|
1015 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1016 | + echo str_repeat( "\t", $depth ); |
|
1017 | + echo "* closer needs to be tested *" . PHP_EOL; |
|
1018 | 1018 | } |
1019 | 1019 | |
1020 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1020 | + $i = self::recurseScopeMap( $i, ( $depth + 1 ), $ignore ); |
|
1021 | 1021 | |
1022 | - if (isset($this->tokens[$scopeCloser]['scope_opener']) === false) { |
|
1022 | + if ( isset( $this->tokens[ $scopeCloser ][ 'scope_opener' ] ) === false ) { |
|
1023 | 1023 | $validCloser = false; |
1024 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1025 | - echo str_repeat("\t", $depth); |
|
1026 | - echo "* closer is not valid (no opener found) *".PHP_EOL; |
|
1024 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1025 | + echo str_repeat( "\t", $depth ); |
|
1026 | + echo "* closer is not valid (no opener found) *" . PHP_EOL; |
|
1027 | 1027 | } |
1028 | - } else if ($this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['code'] !== $this->tokens[$opener]['code']) { |
|
1028 | + } else if ( $this->tokens[ $this->tokens[ $scopeCloser ][ 'scope_opener' ] ][ 'code' ] !== $this->tokens[ $opener ][ 'code' ] ) { |
|
1029 | 1029 | $validCloser = false; |
1030 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1031 | - echo str_repeat("\t", $depth); |
|
1032 | - $type = $this->tokens[$this->tokens[$scopeCloser]['scope_opener']]['type']; |
|
1033 | - $openerType = $this->tokens[$opener]['type']; |
|
1034 | - echo "* closer is not valid (mismatched opener type; $type != $openerType) *".PHP_EOL; |
|
1030 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1031 | + echo str_repeat( "\t", $depth ); |
|
1032 | + $type = $this->tokens[ $this->tokens[ $scopeCloser ][ 'scope_opener' ] ][ 'type' ]; |
|
1033 | + $openerType = $this->tokens[ $opener ][ 'type' ]; |
|
1034 | + echo "* closer is not valid (mismatched opener type; $type != $openerType) *" . PHP_EOL; |
|
1035 | 1035 | } |
1036 | - } else if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1037 | - echo str_repeat("\t", $depth); |
|
1038 | - echo "* closer was valid *".PHP_EOL; |
|
1036 | + } else if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1037 | + echo str_repeat( "\t", $depth ); |
|
1038 | + echo "* closer was valid *" . PHP_EOL; |
|
1039 | 1039 | } |
1040 | 1040 | } else { |
1041 | 1041 | // The closer was not processed, so we need to |
1042 | 1042 | // complete that token as well. |
1043 | - $todo[] = $scopeCloser; |
|
1043 | + $todo[ ] = $scopeCloser; |
|
1044 | 1044 | }//end if |
1045 | 1045 | |
1046 | - if ($validCloser === true) { |
|
1047 | - foreach ($todo as $token) { |
|
1048 | - $this->tokens[$token]['scope_condition'] = $stackPtr; |
|
1049 | - $this->tokens[$token]['scope_opener'] = $opener; |
|
1050 | - $this->tokens[$token]['scope_closer'] = $scopeCloser; |
|
1046 | + if ( $validCloser === true ) { |
|
1047 | + foreach ( $todo as $token ) { |
|
1048 | + $this->tokens[ $token ][ 'scope_condition' ] = $stackPtr; |
|
1049 | + $this->tokens[ $token ][ 'scope_opener' ] = $opener; |
|
1050 | + $this->tokens[ $token ][ 'scope_closer' ] = $scopeCloser; |
|
1051 | 1051 | } |
1052 | 1052 | |
1053 | - if ($this->scopeOpeners[$this->tokens[$stackPtr]['code']]['shared'] === true) { |
|
1053 | + if ( $this->scopeOpeners[ $this->tokens[ $stackPtr ][ 'code' ] ][ 'shared' ] === true ) { |
|
1054 | 1054 | // As we are going back to where we started originally, restore |
1055 | 1055 | // the ignore value back to its original value. |
1056 | 1056 | $ignore = $originalIgnore; |
1057 | 1057 | return $opener; |
1058 | - } else if ($scopeCloser === $i |
|
1059 | - && isset($this->scopeOpeners[$tokenType]) === true |
|
1058 | + } else if ( $scopeCloser === $i |
|
1059 | + && isset( $this->scopeOpeners[ $tokenType ] ) === true |
|
1060 | 1060 | ) { |
1061 | 1061 | // Unset scope_condition here or else the token will appear to have |
1062 | 1062 | // already been processed, and it will be skipped. Normally we want that, |
@@ -1064,8 +1064,8 @@ discard block |
||
1064 | 1064 | // it needs to act like an opener. This is also why we return the |
1065 | 1065 | // token before this one; so the closer has a chance to be processed |
1066 | 1066 | // a second time, but as an opener. |
1067 | - unset($this->tokens[$scopeCloser]['scope_condition']); |
|
1068 | - return ($i - 1); |
|
1067 | + unset( $this->tokens[ $scopeCloser ][ 'scope_condition' ] ); |
|
1068 | + return ( $i - 1 ); |
|
1069 | 1069 | } else { |
1070 | 1070 | return $i; |
1071 | 1071 | } |
@@ -1076,151 +1076,151 @@ discard block |
||
1076 | 1076 | }//end if |
1077 | 1077 | |
1078 | 1078 | // Is this an opening condition ? |
1079 | - if (isset($this->scopeOpeners[$tokenType]) === true) { |
|
1080 | - if ($opener === null) { |
|
1081 | - if ($tokenType === T_USE) { |
|
1079 | + if ( isset( $this->scopeOpeners[ $tokenType ] ) === true ) { |
|
1080 | + if ( $opener === null ) { |
|
1081 | + if ( $tokenType === T_USE ) { |
|
1082 | 1082 | // PHP use keywords are special because they can be |
1083 | 1083 | // used as blocks but also inline in function definitions. |
1084 | 1084 | // So if we find them nested inside another opener, just skip them. |
1085 | 1085 | continue; |
1086 | 1086 | } |
1087 | 1087 | |
1088 | - if ($tokenType === T_FUNCTION |
|
1089 | - && $this->tokens[$stackPtr]['code'] !== T_FUNCTION |
|
1088 | + if ( $tokenType === T_FUNCTION |
|
1089 | + && $this->tokens[ $stackPtr ][ 'code' ] !== T_FUNCTION |
|
1090 | 1090 | ) { |
1091 | 1091 | // Probably a closure, so process it manually. |
1092 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1093 | - $type = $this->tokens[$stackPtr]['type']; |
|
1094 | - echo str_repeat("\t", $depth); |
|
1095 | - echo "=> Found function before scope opener for $stackPtr:$type, processing manually".PHP_EOL; |
|
1092 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1093 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1094 | + echo str_repeat( "\t", $depth ); |
|
1095 | + echo "=> Found function before scope opener for $stackPtr:$type, processing manually" . PHP_EOL; |
|
1096 | 1096 | } |
1097 | 1097 | |
1098 | - if (isset($this->tokens[$i]['scope_closer']) === true) { |
|
1098 | + if ( isset( $this->tokens[ $i ][ 'scope_closer' ] ) === true ) { |
|
1099 | 1099 | // We've already processed this closure. |
1100 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1101 | - echo str_repeat("\t", $depth); |
|
1102 | - echo '* already processed, skipping *'.PHP_EOL; |
|
1100 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1101 | + echo str_repeat( "\t", $depth ); |
|
1102 | + echo '* already processed, skipping *' . PHP_EOL; |
|
1103 | 1103 | } |
1104 | 1104 | |
1105 | - $i = $this->tokens[$i]['scope_closer']; |
|
1105 | + $i = $this->tokens[ $i ][ 'scope_closer' ]; |
|
1106 | 1106 | continue; |
1107 | 1107 | } |
1108 | 1108 | |
1109 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1109 | + $i = self::recurseScopeMap( $i, ( $depth + 1 ), $ignore ); |
|
1110 | 1110 | continue; |
1111 | 1111 | }//end if |
1112 | 1112 | |
1113 | - if ($tokenType === T_CLASS) { |
|
1113 | + if ( $tokenType === T_CLASS ) { |
|
1114 | 1114 | // Probably an anonymous class inside another anonymous class, |
1115 | 1115 | // so process it manually. |
1116 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1117 | - $type = $this->tokens[$stackPtr]['type']; |
|
1118 | - echo str_repeat("\t", $depth); |
|
1119 | - echo "=> Found class before scope opener for $stackPtr:$type, processing manually".PHP_EOL; |
|
1116 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1117 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1118 | + echo str_repeat( "\t", $depth ); |
|
1119 | + echo "=> Found class before scope opener for $stackPtr:$type, processing manually" . PHP_EOL; |
|
1120 | 1120 | } |
1121 | 1121 | |
1122 | - if (isset($this->tokens[$i]['scope_closer']) === true) { |
|
1122 | + if ( isset( $this->tokens[ $i ][ 'scope_closer' ] ) === true ) { |
|
1123 | 1123 | // We've already processed this anon class. |
1124 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1125 | - echo str_repeat("\t", $depth); |
|
1126 | - echo '* already processed, skipping *'.PHP_EOL; |
|
1124 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1125 | + echo str_repeat( "\t", $depth ); |
|
1126 | + echo '* already processed, skipping *' . PHP_EOL; |
|
1127 | 1127 | } |
1128 | 1128 | |
1129 | - $i = $this->tokens[$i]['scope_closer']; |
|
1129 | + $i = $this->tokens[ $i ][ 'scope_closer' ]; |
|
1130 | 1130 | continue; |
1131 | 1131 | } |
1132 | 1132 | |
1133 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1133 | + $i = self::recurseScopeMap( $i, ( $depth + 1 ), $ignore ); |
|
1134 | 1134 | continue; |
1135 | 1135 | }//end if |
1136 | 1136 | |
1137 | 1137 | // Found another opening condition but still haven't |
1138 | 1138 | // found our opener, so we are never going to find one. |
1139 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1140 | - $type = $this->tokens[$stackPtr]['type']; |
|
1141 | - echo str_repeat("\t", $depth); |
|
1139 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1140 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1141 | + echo str_repeat( "\t", $depth ); |
|
1142 | 1142 | echo "=> Found new opening condition before scope opener for $stackPtr:$type, "; |
1143 | 1143 | } |
1144 | 1144 | |
1145 | - if (($this->tokens[$stackPtr]['code'] === T_IF |
|
1146 | - || $this->tokens[$stackPtr]['code'] === T_ELSEIF |
|
1147 | - || $this->tokens[$stackPtr]['code'] === T_ELSE) |
|
1148 | - && ($this->tokens[$i]['code'] === T_ELSE |
|
1149 | - || $this->tokens[$i]['code'] === T_ELSEIF) |
|
1145 | + if ( ( $this->tokens[ $stackPtr ][ 'code' ] === T_IF |
|
1146 | + || $this->tokens[ $stackPtr ][ 'code' ] === T_ELSEIF |
|
1147 | + || $this->tokens[ $stackPtr ][ 'code' ] === T_ELSE ) |
|
1148 | + && ( $this->tokens[ $i ][ 'code' ] === T_ELSE |
|
1149 | + || $this->tokens[ $i ][ 'code' ] === T_ELSEIF ) |
|
1150 | 1150 | ) { |
1151 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1152 | - echo "continuing".PHP_EOL; |
|
1151 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1152 | + echo "continuing" . PHP_EOL; |
|
1153 | 1153 | } |
1154 | 1154 | |
1155 | - return ($i - 1); |
|
1155 | + return ( $i - 1 ); |
|
1156 | 1156 | } else { |
1157 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1158 | - echo "backtracking".PHP_EOL; |
|
1157 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1158 | + echo "backtracking" . PHP_EOL; |
|
1159 | 1159 | } |
1160 | 1160 | |
1161 | 1161 | return $stackPtr; |
1162 | 1162 | } |
1163 | 1163 | }//end if |
1164 | 1164 | |
1165 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1166 | - echo str_repeat("\t", $depth); |
|
1167 | - echo '* token is an opening condition *'.PHP_EOL; |
|
1165 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1166 | + echo str_repeat( "\t", $depth ); |
|
1167 | + echo '* token is an opening condition *' . PHP_EOL; |
|
1168 | 1168 | } |
1169 | 1169 | |
1170 | - $isShared = ($this->scopeOpeners[$tokenType]['shared'] === true); |
|
1170 | + $isShared = ( $this->scopeOpeners[ $tokenType ][ 'shared' ] === true ); |
|
1171 | 1171 | |
1172 | - if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
1172 | + if ( isset( $this->tokens[ $i ][ 'scope_condition' ] ) === true ) { |
|
1173 | 1173 | // We've been here before. |
1174 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1175 | - echo str_repeat("\t", $depth); |
|
1176 | - echo '* already processed, skipping *'.PHP_EOL; |
|
1174 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1175 | + echo str_repeat( "\t", $depth ); |
|
1176 | + echo '* already processed, skipping *' . PHP_EOL; |
|
1177 | 1177 | } |
1178 | 1178 | |
1179 | - if ($isShared === false |
|
1180 | - && isset($this->tokens[$i]['scope_closer']) === true |
|
1179 | + if ( $isShared === false |
|
1180 | + && isset( $this->tokens[ $i ][ 'scope_closer' ] ) === true |
|
1181 | 1181 | ) { |
1182 | - $i = $this->tokens[$i]['scope_closer']; |
|
1182 | + $i = $this->tokens[ $i ][ 'scope_closer' ]; |
|
1183 | 1183 | } |
1184 | 1184 | |
1185 | 1185 | continue; |
1186 | - } else if ($currType === $tokenType |
|
1186 | + } else if ( $currType === $tokenType |
|
1187 | 1187 | && $isShared === false |
1188 | 1188 | && $opener === null |
1189 | 1189 | ) { |
1190 | 1190 | // We haven't yet found our opener, but we have found another |
1191 | 1191 | // scope opener which is the same type as us, and we don't |
1192 | 1192 | // share openers, so we will never find one. |
1193 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1194 | - echo str_repeat("\t", $depth); |
|
1195 | - echo '* it was another token\'s opener, bailing *'.PHP_EOL; |
|
1193 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1194 | + echo str_repeat( "\t", $depth ); |
|
1195 | + echo '* it was another token\'s opener, bailing *' . PHP_EOL; |
|
1196 | 1196 | } |
1197 | 1197 | |
1198 | 1198 | return $stackPtr; |
1199 | 1199 | } else { |
1200 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1201 | - echo str_repeat("\t", $depth); |
|
1202 | - echo '* searching for opener *'.PHP_EOL; |
|
1200 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1201 | + echo str_repeat( "\t", $depth ); |
|
1202 | + echo '* searching for opener *' . PHP_EOL; |
|
1203 | 1203 | } |
1204 | 1204 | |
1205 | - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { |
|
1205 | + if ( isset( $this->scopeOpeners[ $tokenType ][ 'end' ][ T_CLOSE_CURLY_BRACKET ] ) === true ) { |
|
1206 | 1206 | $oldIgnore = $ignore; |
1207 | 1207 | $ignore = 0; |
1208 | 1208 | } |
1209 | 1209 | |
1210 | 1210 | // PHP has a max nesting level for functions. Stop before we hit that limit |
1211 | 1211 | // because too many loops means we've run into trouble anyway. |
1212 | - if ($depth > 50) { |
|
1213 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1214 | - echo str_repeat("\t", $depth); |
|
1215 | - echo '* reached maximum nesting level; aborting *'.PHP_EOL; |
|
1212 | + if ( $depth > 50 ) { |
|
1213 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1214 | + echo str_repeat( "\t", $depth ); |
|
1215 | + echo '* reached maximum nesting level; aborting *' . PHP_EOL; |
|
1216 | 1216 | } |
1217 | 1217 | |
1218 | - throw new RuntimeException('Maximum nesting level reached; file could not be processed'); |
|
1218 | + throw new RuntimeException( 'Maximum nesting level reached; file could not be processed' ); |
|
1219 | 1219 | } |
1220 | 1220 | |
1221 | 1221 | $oldDepth = $depth; |
1222 | - if ($isShared === true |
|
1223 | - && isset($this->scopeOpeners[$tokenType]['with'][$currType]) === true |
|
1222 | + if ( $isShared === true |
|
1223 | + && isset( $this->scopeOpeners[ $tokenType ][ 'with' ][ $currType ] ) === true |
|
1224 | 1224 | ) { |
1225 | 1225 | // Don't allow the depth to increment because this is |
1226 | 1226 | // possibly not a true nesting if we are sharing our closer. |
@@ -1229,35 +1229,35 @@ discard block |
||
1229 | 1229 | $depth--; |
1230 | 1230 | } |
1231 | 1231 | |
1232 | - $i = self::recurseScopeMap($i, ($depth + 1), $ignore); |
|
1232 | + $i = self::recurseScopeMap( $i, ( $depth + 1 ), $ignore ); |
|
1233 | 1233 | $depth = $oldDepth; |
1234 | 1234 | |
1235 | - if (isset($this->scopeOpeners[$tokenType]['end'][T_CLOSE_CURLY_BRACKET]) === true) { |
|
1235 | + if ( isset( $this->scopeOpeners[ $tokenType ][ 'end' ][ T_CLOSE_CURLY_BRACKET ] ) === true ) { |
|
1236 | 1236 | $ignore = $oldIgnore; |
1237 | 1237 | } |
1238 | 1238 | }//end if |
1239 | 1239 | }//end if |
1240 | 1240 | |
1241 | - if (isset($this->scopeOpeners[$currType]['start'][$tokenType]) === true |
|
1241 | + if ( isset( $this->scopeOpeners[ $currType ][ 'start' ][ $tokenType ] ) === true |
|
1242 | 1242 | && $opener === null |
1243 | 1243 | ) { |
1244 | - if ($tokenType === T_OPEN_CURLY_BRACKET) { |
|
1245 | - if (isset($this->tokens[$stackPtr]['parenthesis_closer']) === true |
|
1246 | - && $i < $this->tokens[$stackPtr]['parenthesis_closer'] |
|
1244 | + if ( $tokenType === T_OPEN_CURLY_BRACKET ) { |
|
1245 | + if ( isset( $this->tokens[ $stackPtr ][ 'parenthesis_closer' ] ) === true |
|
1246 | + && $i < $this->tokens[ $stackPtr ][ 'parenthesis_closer' ] |
|
1247 | 1247 | ) { |
1248 | 1248 | // We found a curly brace inside the condition of the |
1249 | 1249 | // current scope opener, so it must be a string offset. |
1250 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1251 | - echo str_repeat("\t", $depth); |
|
1252 | - echo '* ignoring curly brace inside condition *'.PHP_EOL; |
|
1250 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1251 | + echo str_repeat( "\t", $depth ); |
|
1252 | + echo '* ignoring curly brace inside condition *' . PHP_EOL; |
|
1253 | 1253 | } |
1254 | 1254 | |
1255 | 1255 | $ignore++; |
1256 | 1256 | } else { |
1257 | 1257 | // Make sure this is actually an opener and not a |
1258 | 1258 | // string offset (e.g., $var{0}). |
1259 | - for ($x = ($i - 1); $x > 0; $x--) { |
|
1260 | - if (isset(Util\Tokens::$emptyTokens[$this->tokens[$x]['code']]) === true) { |
|
1259 | + for ( $x = ( $i - 1 ); $x > 0; $x-- ) { |
|
1260 | + if ( isset( Util\Tokens::$emptyTokens[ $this->tokens[ $x ][ 'code' ] ] ) === true ) { |
|
1261 | 1261 | continue; |
1262 | 1262 | } else { |
1263 | 1263 | // If the first non-whitespace/comment token looks like this |
@@ -1272,10 +1272,10 @@ discard block |
||
1272 | 1272 | T_OPEN_PARENTHESIS => true, |
1273 | 1273 | ]; |
1274 | 1274 | |
1275 | - if (isset($disallowed[$this->tokens[$x]['code']]) === true) { |
|
1276 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1277 | - echo str_repeat("\t", $depth); |
|
1278 | - echo '* ignoring curly brace *'.PHP_EOL; |
|
1275 | + if ( isset( $disallowed[ $this->tokens[ $x ][ 'code' ] ] ) === true ) { |
|
1276 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1277 | + echo str_repeat( "\t", $depth ); |
|
1278 | + echo '* ignoring curly brace *' . PHP_EOL; |
|
1279 | 1279 | } |
1280 | 1280 | |
1281 | 1281 | $ignore++; |
@@ -1287,87 +1287,87 @@ discard block |
||
1287 | 1287 | }//end if |
1288 | 1288 | }//end if |
1289 | 1289 | |
1290 | - if ($ignore === 0 || $tokenType !== T_OPEN_CURLY_BRACKET) { |
|
1290 | + if ( $ignore === 0 || $tokenType !== T_OPEN_CURLY_BRACKET ) { |
|
1291 | 1291 | // We found the opening scope token for $currType. |
1292 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1293 | - $type = $this->tokens[$stackPtr]['type']; |
|
1294 | - echo str_repeat("\t", $depth); |
|
1295 | - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; |
|
1292 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1293 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1294 | + echo str_repeat( "\t", $depth ); |
|
1295 | + echo "=> Found scope opener for $stackPtr:$type" . PHP_EOL; |
|
1296 | 1296 | } |
1297 | 1297 | |
1298 | 1298 | $opener = $i; |
1299 | 1299 | } |
1300 | - } else if ($tokenType === T_OPEN_PARENTHESIS) { |
|
1301 | - if (isset($this->tokens[$i]['parenthesis_owner']) === true) { |
|
1302 | - $owner = $this->tokens[$i]['parenthesis_owner']; |
|
1303 | - if (isset(Util\Tokens::$scopeOpeners[$this->tokens[$owner]['code']]) === true |
|
1304 | - && isset($this->tokens[$i]['parenthesis_closer']) === true |
|
1300 | + } else if ( $tokenType === T_OPEN_PARENTHESIS ) { |
|
1301 | + if ( isset( $this->tokens[ $i ][ 'parenthesis_owner' ] ) === true ) { |
|
1302 | + $owner = $this->tokens[ $i ][ 'parenthesis_owner' ]; |
|
1303 | + if ( isset( Util\Tokens::$scopeOpeners[ $this->tokens[ $owner ][ 'code' ] ] ) === true |
|
1304 | + && isset( $this->tokens[ $i ][ 'parenthesis_closer' ] ) === true |
|
1305 | 1305 | ) { |
1306 | 1306 | // If we get into here, then we opened a parenthesis for |
1307 | 1307 | // a scope (eg. an if or else if) so we need to update the |
1308 | 1308 | // start of the line so that when we check to see |
1309 | 1309 | // if the closing parenthesis is more than 3 lines away from |
1310 | 1310 | // the statement, we check from the closing parenthesis. |
1311 | - $startLine = $this->tokens[$this->tokens[$i]['parenthesis_closer']]['line']; |
|
1311 | + $startLine = $this->tokens[ $this->tokens[ $i ][ 'parenthesis_closer' ] ][ 'line' ]; |
|
1312 | 1312 | } |
1313 | 1313 | } |
1314 | - } else if ($tokenType === T_OPEN_CURLY_BRACKET && $opener !== null) { |
|
1314 | + } else if ( $tokenType === T_OPEN_CURLY_BRACKET && $opener !== null ) { |
|
1315 | 1315 | // We opened something that we don't have a scope opener for. |
1316 | 1316 | // Examples of this are curly brackets for string offsets etc. |
1317 | 1317 | // We want to ignore this so that we don't have an invalid scope |
1318 | 1318 | // map. |
1319 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1320 | - echo str_repeat("\t", $depth); |
|
1321 | - echo '* ignoring curly brace *'.PHP_EOL; |
|
1319 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1320 | + echo str_repeat( "\t", $depth ); |
|
1321 | + echo '* ignoring curly brace *' . PHP_EOL; |
|
1322 | 1322 | } |
1323 | 1323 | |
1324 | 1324 | $ignore++; |
1325 | - } else if ($tokenType === T_CLOSE_CURLY_BRACKET && $ignore > 0) { |
|
1325 | + } else if ( $tokenType === T_CLOSE_CURLY_BRACKET && $ignore > 0 ) { |
|
1326 | 1326 | // We found the end token for the opener we were ignoring. |
1327 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1328 | - echo str_repeat("\t", $depth); |
|
1329 | - echo '* finished ignoring curly brace *'.PHP_EOL; |
|
1327 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1328 | + echo str_repeat( "\t", $depth ); |
|
1329 | + echo '* finished ignoring curly brace *' . PHP_EOL; |
|
1330 | 1330 | } |
1331 | 1331 | |
1332 | 1332 | $ignore--; |
1333 | - } else if ($opener === null |
|
1334 | - && isset($this->scopeOpeners[$currType]) === true |
|
1333 | + } else if ( $opener === null |
|
1334 | + && isset( $this->scopeOpeners[ $currType ] ) === true |
|
1335 | 1335 | ) { |
1336 | 1336 | // If we still haven't found the opener after 30 lines, |
1337 | 1337 | // we're not going to find it, unless we know it requires |
1338 | 1338 | // an opener (in which case we better keep looking) or the last |
1339 | 1339 | // token was empty (in which case we'll just confirm there is |
1340 | 1340 | // more code in this file and not just a big comment). |
1341 | - if ($this->tokens[$i]['line'] >= ($startLine + 30) |
|
1342 | - && isset(Util\Tokens::$emptyTokens[$this->tokens[($i - 1)]['code']]) === false |
|
1341 | + if ( $this->tokens[ $i ][ 'line' ] >= ( $startLine + 30 ) |
|
1342 | + && isset( Util\Tokens::$emptyTokens[ $this->tokens[ ( $i - 1 ) ][ 'code' ] ] ) === false |
|
1343 | 1343 | ) { |
1344 | - if ($this->scopeOpeners[$currType]['strict'] === true) { |
|
1345 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1346 | - $type = $this->tokens[$stackPtr]['type']; |
|
1347 | - $lines = ($this->tokens[$i]['line'] - $startLine); |
|
1348 | - echo str_repeat("\t", $depth); |
|
1349 | - echo "=> Still looking for $stackPtr:$type scope opener after $lines lines".PHP_EOL; |
|
1344 | + if ( $this->scopeOpeners[ $currType ][ 'strict' ] === true ) { |
|
1345 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1346 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1347 | + $lines = ( $this->tokens[ $i ][ 'line' ] - $startLine ); |
|
1348 | + echo str_repeat( "\t", $depth ); |
|
1349 | + echo "=> Still looking for $stackPtr:$type scope opener after $lines lines" . PHP_EOL; |
|
1350 | 1350 | } |
1351 | 1351 | } else { |
1352 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1353 | - $type = $this->tokens[$stackPtr]['type']; |
|
1354 | - echo str_repeat("\t", $depth); |
|
1355 | - echo "=> Couldn't find scope opener for $stackPtr:$type, bailing".PHP_EOL; |
|
1352 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1353 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1354 | + echo str_repeat( "\t", $depth ); |
|
1355 | + echo "=> Couldn't find scope opener for $stackPtr:$type, bailing" . PHP_EOL; |
|
1356 | 1356 | } |
1357 | 1357 | |
1358 | 1358 | return $stackPtr; |
1359 | 1359 | } |
1360 | 1360 | } |
1361 | - } else if ($opener !== null |
|
1361 | + } else if ( $opener !== null |
|
1362 | 1362 | && $tokenType !== T_BREAK |
1363 | - && isset($this->endScopeTokens[$tokenType]) === true |
|
1363 | + && isset( $this->endScopeTokens[ $tokenType ] ) === true |
|
1364 | 1364 | ) { |
1365 | - if (isset($this->tokens[$i]['scope_condition']) === false) { |
|
1366 | - if ($ignore > 0) { |
|
1365 | + if ( isset( $this->tokens[ $i ][ 'scope_condition' ] ) === false ) { |
|
1366 | + if ( $ignore > 0 ) { |
|
1367 | 1367 | // We found the end token for the opener we were ignoring. |
1368 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1369 | - echo str_repeat("\t", $depth); |
|
1370 | - echo '* finished ignoring curly brace *'.PHP_EOL; |
|
1368 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1369 | + echo str_repeat( "\t", $depth ); |
|
1370 | + echo '* finished ignoring curly brace *' . PHP_EOL; |
|
1371 | 1371 | } |
1372 | 1372 | |
1373 | 1373 | $ignore--; |
@@ -1376,19 +1376,19 @@ discard block |
||
1376 | 1376 | // have a condition, so it belongs to another token and |
1377 | 1377 | // our token doesn't have a closer, so pretend this is |
1378 | 1378 | // the closer. |
1379 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1380 | - $type = $this->tokens[$stackPtr]['type']; |
|
1381 | - echo str_repeat("\t", $depth); |
|
1382 | - echo "=> Found (unexpected) scope closer for $stackPtr:$type".PHP_EOL; |
|
1379 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1380 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1381 | + echo str_repeat( "\t", $depth ); |
|
1382 | + echo "=> Found (unexpected) scope closer for $stackPtr:$type" . PHP_EOL; |
|
1383 | 1383 | } |
1384 | 1384 | |
1385 | - foreach ([$stackPtr, $opener] as $token) { |
|
1386 | - $this->tokens[$token]['scope_condition'] = $stackPtr; |
|
1387 | - $this->tokens[$token]['scope_opener'] = $opener; |
|
1388 | - $this->tokens[$token]['scope_closer'] = $i; |
|
1385 | + foreach ( [ $stackPtr, $opener ] as $token ) { |
|
1386 | + $this->tokens[ $token ][ 'scope_condition' ] = $stackPtr; |
|
1387 | + $this->tokens[ $token ][ 'scope_opener' ] = $opener; |
|
1388 | + $this->tokens[ $token ][ 'scope_closer' ] = $i; |
|
1389 | 1389 | } |
1390 | 1390 | |
1391 | - return ($i - 1); |
|
1391 | + return ( $i - 1 ); |
|
1392 | 1392 | }//end if |
1393 | 1393 | }//end if |
1394 | 1394 | }//end if |
@@ -1411,233 +1411,233 @@ discard block |
||
1411 | 1411 | */ |
1412 | 1412 | private function createLevelMap() |
1413 | 1413 | { |
1414 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1415 | - echo "\t*** START LEVEL MAP ***".PHP_EOL; |
|
1414 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1415 | + echo "\t*** START LEVEL MAP ***" . PHP_EOL; |
|
1416 | 1416 | } |
1417 | 1417 | |
1418 | - $this->numTokens = count($this->tokens); |
|
1418 | + $this->numTokens = count( $this->tokens ); |
|
1419 | 1419 | $level = 0; |
1420 | - $conditions = []; |
|
1420 | + $conditions = [ ]; |
|
1421 | 1421 | $lastOpener = null; |
1422 | - $openers = []; |
|
1422 | + $openers = [ ]; |
|
1423 | 1423 | |
1424 | - for ($i = 0; $i < $this->numTokens; $i++) { |
|
1425 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1426 | - $type = $this->tokens[$i]['type']; |
|
1427 | - $line = $this->tokens[$i]['line']; |
|
1428 | - $len = $this->tokens[$i]['length']; |
|
1429 | - $col = $this->tokens[$i]['column']; |
|
1424 | + for ( $i = 0; $i < $this->numTokens; $i++ ) { |
|
1425 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1426 | + $type = $this->tokens[ $i ][ 'type' ]; |
|
1427 | + $line = $this->tokens[ $i ][ 'line' ]; |
|
1428 | + $len = $this->tokens[ $i ][ 'length' ]; |
|
1429 | + $col = $this->tokens[ $i ][ 'column' ]; |
|
1430 | 1430 | |
1431 | - $content = Util\Common::prepareForOutput($this->tokens[$i]['content']); |
|
1431 | + $content = Util\Common::prepareForOutput( $this->tokens[ $i ][ 'content' ] ); |
|
1432 | 1432 | |
1433 | - echo str_repeat("\t", ($level + 1)); |
|
1433 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1434 | 1434 | echo "Process token $i on line $line [col:$col;len:$len;lvl:$level;"; |
1435 | - if (empty($conditions) !== true) { |
|
1435 | + if ( empty( $conditions ) !== true ) { |
|
1436 | 1436 | $condString = 'conds;'; |
1437 | - foreach ($conditions as $condition) { |
|
1438 | - $condString .= Util\Tokens::tokenName($condition).','; |
|
1437 | + foreach ( $conditions as $condition ) { |
|
1438 | + $condString .= Util\Tokens::tokenName( $condition ) . ','; |
|
1439 | 1439 | } |
1440 | 1440 | |
1441 | - echo rtrim($condString, ',').';'; |
|
1441 | + echo rtrim( $condString, ',' ) . ';'; |
|
1442 | 1442 | } |
1443 | 1443 | |
1444 | - echo "]: $type => $content".PHP_EOL; |
|
1444 | + echo "]: $type => $content" . PHP_EOL; |
|
1445 | 1445 | }//end if |
1446 | 1446 | |
1447 | - $this->tokens[$i]['level'] = $level; |
|
1448 | - $this->tokens[$i]['conditions'] = $conditions; |
|
1447 | + $this->tokens[ $i ][ 'level' ] = $level; |
|
1448 | + $this->tokens[ $i ][ 'conditions' ] = $conditions; |
|
1449 | 1449 | |
1450 | - if (isset($this->tokens[$i]['scope_condition']) === true) { |
|
1450 | + if ( isset( $this->tokens[ $i ][ 'scope_condition' ] ) === true ) { |
|
1451 | 1451 | // Check to see if this token opened the scope. |
1452 | - if ($this->tokens[$i]['scope_opener'] === $i) { |
|
1453 | - $stackPtr = $this->tokens[$i]['scope_condition']; |
|
1454 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1455 | - $type = $this->tokens[$stackPtr]['type']; |
|
1456 | - echo str_repeat("\t", ($level + 1)); |
|
1457 | - echo "=> Found scope opener for $stackPtr:$type".PHP_EOL; |
|
1452 | + if ( $this->tokens[ $i ][ 'scope_opener' ] === $i ) { |
|
1453 | + $stackPtr = $this->tokens[ $i ][ 'scope_condition' ]; |
|
1454 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1455 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1456 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1457 | + echo "=> Found scope opener for $stackPtr:$type" . PHP_EOL; |
|
1458 | 1458 | } |
1459 | 1459 | |
1460 | - $stackPtr = $this->tokens[$i]['scope_condition']; |
|
1460 | + $stackPtr = $this->tokens[ $i ][ 'scope_condition' ]; |
|
1461 | 1461 | |
1462 | 1462 | // If we find a scope opener that has a shared closer, |
1463 | 1463 | // then we need to go back over the condition map that we |
1464 | 1464 | // just created and fix ourselves as we just added some |
1465 | 1465 | // conditions where there was none. This happens for T_CASE |
1466 | 1466 | // statements that are using the same break statement. |
1467 | - if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $this->tokens[$i]['scope_closer']) { |
|
1467 | + if ( $lastOpener !== null && $this->tokens[ $lastOpener ][ 'scope_closer' ] === $this->tokens[ $i ][ 'scope_closer' ] ) { |
|
1468 | 1468 | // This opener shares its closer with the previous opener, |
1469 | 1469 | // but we still need to check if the two openers share their |
1470 | 1470 | // closer with each other directly (like CASE and DEFAULT) |
1471 | 1471 | // or if they are just sharing because one doesn't have a |
1472 | 1472 | // closer (like CASE with no BREAK using a SWITCHes closer). |
1473 | - $thisType = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; |
|
1474 | - $opener = $this->tokens[$lastOpener]['scope_condition']; |
|
1473 | + $thisType = $this->tokens[ $this->tokens[ $i ][ 'scope_condition' ] ][ 'code' ]; |
|
1474 | + $opener = $this->tokens[ $lastOpener ][ 'scope_condition' ]; |
|
1475 | 1475 | |
1476 | - $isShared = isset($this->scopeOpeners[$thisType]['with'][$this->tokens[$opener]['code']]); |
|
1476 | + $isShared = isset( $this->scopeOpeners[ $thisType ][ 'with' ][ $this->tokens[ $opener ][ 'code' ] ] ); |
|
1477 | 1477 | |
1478 | - reset($this->scopeOpeners[$thisType]['end']); |
|
1479 | - reset($this->scopeOpeners[$this->tokens[$opener]['code']]['end']); |
|
1480 | - $sameEnd = (current($this->scopeOpeners[$thisType]['end']) === current($this->scopeOpeners[$this->tokens[$opener]['code']]['end'])); |
|
1478 | + reset( $this->scopeOpeners[ $thisType ][ 'end' ] ); |
|
1479 | + reset( $this->scopeOpeners[ $this->tokens[ $opener ][ 'code' ] ][ 'end' ] ); |
|
1480 | + $sameEnd = ( current( $this->scopeOpeners[ $thisType ][ 'end' ] ) === current( $this->scopeOpeners[ $this->tokens[ $opener ][ 'code' ] ][ 'end' ] ) ); |
|
1481 | 1481 | |
1482 | - if ($isShared === true && $sameEnd === true) { |
|
1482 | + if ( $isShared === true && $sameEnd === true ) { |
|
1483 | 1483 | $badToken = $opener; |
1484 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1485 | - $type = $this->tokens[$badToken]['type']; |
|
1486 | - echo str_repeat("\t", ($level + 1)); |
|
1487 | - echo "* shared closer, cleaning up $badToken:$type *".PHP_EOL; |
|
1484 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1485 | + $type = $this->tokens[ $badToken ][ 'type' ]; |
|
1486 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1487 | + echo "* shared closer, cleaning up $badToken:$type *" . PHP_EOL; |
|
1488 | 1488 | } |
1489 | 1489 | |
1490 | - for ($x = $this->tokens[$i]['scope_condition']; $x <= $i; $x++) { |
|
1491 | - $oldConditions = $this->tokens[$x]['conditions']; |
|
1492 | - $oldLevel = $this->tokens[$x]['level']; |
|
1493 | - $this->tokens[$x]['level']--; |
|
1494 | - unset($this->tokens[$x]['conditions'][$badToken]); |
|
1495 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1496 | - $type = $this->tokens[$x]['type']; |
|
1490 | + for ( $x = $this->tokens[ $i ][ 'scope_condition' ]; $x <= $i; $x++ ) { |
|
1491 | + $oldConditions = $this->tokens[ $x ][ 'conditions' ]; |
|
1492 | + $oldLevel = $this->tokens[ $x ][ 'level' ]; |
|
1493 | + $this->tokens[ $x ][ 'level' ]--; |
|
1494 | + unset( $this->tokens[ $x ][ 'conditions' ][ $badToken ] ); |
|
1495 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1496 | + $type = $this->tokens[ $x ][ 'type' ]; |
|
1497 | 1497 | $oldConds = ''; |
1498 | - foreach ($oldConditions as $condition) { |
|
1499 | - $oldConds .= Util\Tokens::tokenName($condition).','; |
|
1498 | + foreach ( $oldConditions as $condition ) { |
|
1499 | + $oldConds .= Util\Tokens::tokenName( $condition ) . ','; |
|
1500 | 1500 | } |
1501 | 1501 | |
1502 | - $oldConds = rtrim($oldConds, ','); |
|
1502 | + $oldConds = rtrim( $oldConds, ',' ); |
|
1503 | 1503 | |
1504 | 1504 | $newConds = ''; |
1505 | - foreach ($this->tokens[$x]['conditions'] as $condition) { |
|
1506 | - $newConds .= Util\Tokens::tokenName($condition).','; |
|
1505 | + foreach ( $this->tokens[ $x ][ 'conditions' ] as $condition ) { |
|
1506 | + $newConds .= Util\Tokens::tokenName( $condition ) . ','; |
|
1507 | 1507 | } |
1508 | 1508 | |
1509 | - $newConds = rtrim($newConds, ','); |
|
1509 | + $newConds = rtrim( $newConds, ',' ); |
|
1510 | 1510 | |
1511 | - $newLevel = $this->tokens[$x]['level']; |
|
1512 | - echo str_repeat("\t", ($level + 1)); |
|
1513 | - echo "* cleaned $x:$type *".PHP_EOL; |
|
1514 | - echo str_repeat("\t", ($level + 2)); |
|
1515 | - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; |
|
1516 | - echo str_repeat("\t", ($level + 2)); |
|
1517 | - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; |
|
1511 | + $newLevel = $this->tokens[ $x ][ 'level' ]; |
|
1512 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1513 | + echo "* cleaned $x:$type *" . PHP_EOL; |
|
1514 | + echo str_repeat( "\t", ( $level + 2 ) ); |
|
1515 | + echo "=> level changed from $oldLevel to $newLevel" . PHP_EOL; |
|
1516 | + echo str_repeat( "\t", ( $level + 2 ) ); |
|
1517 | + echo "=> conditions changed from $oldConds to $newConds" . PHP_EOL; |
|
1518 | 1518 | }//end if |
1519 | 1519 | }//end for |
1520 | 1520 | |
1521 | - unset($conditions[$badToken]); |
|
1522 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1523 | - $type = $this->tokens[$badToken]['type']; |
|
1524 | - echo str_repeat("\t", ($level + 1)); |
|
1525 | - echo "* token $badToken:$type removed from conditions array *".PHP_EOL; |
|
1521 | + unset( $conditions[ $badToken ] ); |
|
1522 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1523 | + $type = $this->tokens[ $badToken ][ 'type' ]; |
|
1524 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1525 | + echo "* token $badToken:$type removed from conditions array *" . PHP_EOL; |
|
1526 | 1526 | } |
1527 | 1527 | |
1528 | - unset($openers[$lastOpener]); |
|
1528 | + unset( $openers[ $lastOpener ] ); |
|
1529 | 1529 | |
1530 | 1530 | $level--; |
1531 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1532 | - echo str_repeat("\t", ($level + 2)); |
|
1533 | - echo '* level decreased *'.PHP_EOL; |
|
1531 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1532 | + echo str_repeat( "\t", ( $level + 2 ) ); |
|
1533 | + echo '* level decreased *' . PHP_EOL; |
|
1534 | 1534 | } |
1535 | 1535 | }//end if |
1536 | 1536 | }//end if |
1537 | 1537 | |
1538 | 1538 | $level++; |
1539 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1540 | - echo str_repeat("\t", ($level + 1)); |
|
1541 | - echo '* level increased *'.PHP_EOL; |
|
1539 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1540 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1541 | + echo '* level increased *' . PHP_EOL; |
|
1542 | 1542 | } |
1543 | 1543 | |
1544 | - $conditions[$stackPtr] = $this->tokens[$stackPtr]['code']; |
|
1545 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1546 | - $type = $this->tokens[$stackPtr]['type']; |
|
1547 | - echo str_repeat("\t", ($level + 1)); |
|
1548 | - echo "* token $stackPtr:$type added to conditions array *".PHP_EOL; |
|
1544 | + $conditions[ $stackPtr ] = $this->tokens[ $stackPtr ][ 'code' ]; |
|
1545 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1546 | + $type = $this->tokens[ $stackPtr ][ 'type' ]; |
|
1547 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1548 | + echo "* token $stackPtr:$type added to conditions array *" . PHP_EOL; |
|
1549 | 1549 | } |
1550 | 1550 | |
1551 | - $lastOpener = $this->tokens[$i]['scope_opener']; |
|
1552 | - if ($lastOpener !== null) { |
|
1553 | - $openers[$lastOpener] = $lastOpener; |
|
1551 | + $lastOpener = $this->tokens[ $i ][ 'scope_opener' ]; |
|
1552 | + if ( $lastOpener !== null ) { |
|
1553 | + $openers[ $lastOpener ] = $lastOpener; |
|
1554 | 1554 | } |
1555 | - } else if ($lastOpener !== null && $this->tokens[$lastOpener]['scope_closer'] === $i) { |
|
1556 | - foreach (array_reverse($openers) as $opener) { |
|
1557 | - if ($this->tokens[$opener]['scope_closer'] === $i) { |
|
1558 | - $oldOpener = array_pop($openers); |
|
1559 | - if (empty($openers) === false) { |
|
1560 | - $lastOpener = array_pop($openers); |
|
1561 | - $openers[$lastOpener] = $lastOpener; |
|
1555 | + } else if ( $lastOpener !== null && $this->tokens[ $lastOpener ][ 'scope_closer' ] === $i ) { |
|
1556 | + foreach ( array_reverse( $openers ) as $opener ) { |
|
1557 | + if ( $this->tokens[ $opener ][ 'scope_closer' ] === $i ) { |
|
1558 | + $oldOpener = array_pop( $openers ); |
|
1559 | + if ( empty( $openers ) === false ) { |
|
1560 | + $lastOpener = array_pop( $openers ); |
|
1561 | + $openers[ $lastOpener ] = $lastOpener; |
|
1562 | 1562 | } else { |
1563 | 1563 | $lastOpener = null; |
1564 | 1564 | } |
1565 | 1565 | |
1566 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1567 | - $type = $this->tokens[$oldOpener]['type']; |
|
1568 | - echo str_repeat("\t", ($level + 1)); |
|
1569 | - echo "=> Found scope closer for $oldOpener:$type".PHP_EOL; |
|
1566 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1567 | + $type = $this->tokens[ $oldOpener ][ 'type' ]; |
|
1568 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1569 | + echo "=> Found scope closer for $oldOpener:$type" . PHP_EOL; |
|
1570 | 1570 | } |
1571 | 1571 | |
1572 | - $oldCondition = array_pop($conditions); |
|
1573 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1574 | - echo str_repeat("\t", ($level + 1)); |
|
1575 | - echo '* token '.Util\Tokens::tokenName($oldCondition).' removed from conditions array *'.PHP_EOL; |
|
1572 | + $oldCondition = array_pop( $conditions ); |
|
1573 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1574 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1575 | + echo '* token ' . Util\Tokens::tokenName( $oldCondition ) . ' removed from conditions array *' . PHP_EOL; |
|
1576 | 1576 | } |
1577 | 1577 | |
1578 | 1578 | // Make sure this closer actually belongs to us. |
1579 | 1579 | // Either the condition also has to think this is the |
1580 | 1580 | // closer, or it has to allow sharing with us. |
1581 | - $condition = $this->tokens[$this->tokens[$i]['scope_condition']]['code']; |
|
1582 | - if ($condition !== $oldCondition) { |
|
1583 | - if (isset($this->scopeOpeners[$oldCondition]['with'][$condition]) === false) { |
|
1584 | - $badToken = $this->tokens[$oldOpener]['scope_condition']; |
|
1585 | - |
|
1586 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1587 | - $type = Util\Tokens::tokenName($oldCondition); |
|
1588 | - echo str_repeat("\t", ($level + 1)); |
|
1589 | - echo "* scope closer was bad, cleaning up $badToken:$type *".PHP_EOL; |
|
1581 | + $condition = $this->tokens[ $this->tokens[ $i ][ 'scope_condition' ] ][ 'code' ]; |
|
1582 | + if ( $condition !== $oldCondition ) { |
|
1583 | + if ( isset( $this->scopeOpeners[ $oldCondition ][ 'with' ][ $condition ] ) === false ) { |
|
1584 | + $badToken = $this->tokens[ $oldOpener ][ 'scope_condition' ]; |
|
1585 | + |
|
1586 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1587 | + $type = Util\Tokens::tokenName( $oldCondition ); |
|
1588 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1589 | + echo "* scope closer was bad, cleaning up $badToken:$type *" . PHP_EOL; |
|
1590 | 1590 | } |
1591 | 1591 | |
1592 | - for ($x = ($oldOpener + 1); $x <= $i; $x++) { |
|
1593 | - $oldConditions = $this->tokens[$x]['conditions']; |
|
1594 | - $oldLevel = $this->tokens[$x]['level']; |
|
1595 | - $this->tokens[$x]['level']--; |
|
1596 | - unset($this->tokens[$x]['conditions'][$badToken]); |
|
1597 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1598 | - $type = $this->tokens[$x]['type']; |
|
1592 | + for ( $x = ( $oldOpener + 1 ); $x <= $i; $x++ ) { |
|
1593 | + $oldConditions = $this->tokens[ $x ][ 'conditions' ]; |
|
1594 | + $oldLevel = $this->tokens[ $x ][ 'level' ]; |
|
1595 | + $this->tokens[ $x ][ 'level' ]--; |
|
1596 | + unset( $this->tokens[ $x ][ 'conditions' ][ $badToken ] ); |
|
1597 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1598 | + $type = $this->tokens[ $x ][ 'type' ]; |
|
1599 | 1599 | $oldConds = ''; |
1600 | - foreach ($oldConditions as $condition) { |
|
1601 | - $oldConds .= Util\Tokens::tokenName($condition).','; |
|
1600 | + foreach ( $oldConditions as $condition ) { |
|
1601 | + $oldConds .= Util\Tokens::tokenName( $condition ) . ','; |
|
1602 | 1602 | } |
1603 | 1603 | |
1604 | - $oldConds = rtrim($oldConds, ','); |
|
1604 | + $oldConds = rtrim( $oldConds, ',' ); |
|
1605 | 1605 | |
1606 | 1606 | $newConds = ''; |
1607 | - foreach ($this->tokens[$x]['conditions'] as $condition) { |
|
1608 | - $newConds .= Util\Tokens::tokenName($condition).','; |
|
1607 | + foreach ( $this->tokens[ $x ][ 'conditions' ] as $condition ) { |
|
1608 | + $newConds .= Util\Tokens::tokenName( $condition ) . ','; |
|
1609 | 1609 | } |
1610 | 1610 | |
1611 | - $newConds = rtrim($newConds, ','); |
|
1611 | + $newConds = rtrim( $newConds, ',' ); |
|
1612 | 1612 | |
1613 | - $newLevel = $this->tokens[$x]['level']; |
|
1614 | - echo str_repeat("\t", ($level + 1)); |
|
1615 | - echo "* cleaned $x:$type *".PHP_EOL; |
|
1616 | - echo str_repeat("\t", ($level + 2)); |
|
1617 | - echo "=> level changed from $oldLevel to $newLevel".PHP_EOL; |
|
1618 | - echo str_repeat("\t", ($level + 2)); |
|
1619 | - echo "=> conditions changed from $oldConds to $newConds".PHP_EOL; |
|
1613 | + $newLevel = $this->tokens[ $x ][ 'level' ]; |
|
1614 | + echo str_repeat( "\t", ( $level + 1 ) ); |
|
1615 | + echo "* cleaned $x:$type *" . PHP_EOL; |
|
1616 | + echo str_repeat( "\t", ( $level + 2 ) ); |
|
1617 | + echo "=> level changed from $oldLevel to $newLevel" . PHP_EOL; |
|
1618 | + echo str_repeat( "\t", ( $level + 2 ) ); |
|
1619 | + echo "=> conditions changed from $oldConds to $newConds" . PHP_EOL; |
|
1620 | 1620 | }//end if |
1621 | 1621 | }//end for |
1622 | 1622 | }//end if |
1623 | 1623 | }//end if |
1624 | 1624 | |
1625 | 1625 | $level--; |
1626 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1627 | - echo str_repeat("\t", ($level + 2)); |
|
1628 | - echo '* level decreased *'.PHP_EOL; |
|
1626 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1627 | + echo str_repeat( "\t", ( $level + 2 ) ); |
|
1628 | + echo '* level decreased *' . PHP_EOL; |
|
1629 | 1629 | } |
1630 | 1630 | |
1631 | - $this->tokens[$i]['level'] = $level; |
|
1632 | - $this->tokens[$i]['conditions'] = $conditions; |
|
1631 | + $this->tokens[ $i ][ 'level' ] = $level; |
|
1632 | + $this->tokens[ $i ][ 'conditions' ] = $conditions; |
|
1633 | 1633 | }//end if |
1634 | 1634 | }//end foreach |
1635 | 1635 | }//end if |
1636 | 1636 | }//end if |
1637 | 1637 | }//end for |
1638 | 1638 | |
1639 | - if (PHP_CODESNIFFER_VERBOSITY > 1) { |
|
1640 | - echo "\t*** END LEVEL MAP ***".PHP_EOL; |
|
1639 | + if ( PHP_CODESNIFFER_VERBOSITY > 1 ) { |
|
1640 | + echo "\t*** END LEVEL MAP ***" . PHP_EOL; |
|
1641 | 1641 | } |
1642 | 1642 | |
1643 | 1643 | }//end createLevelMap() |
@@ -12,8 +12,7 @@ discard block |
||
12 | 12 | use PHP_CodeSniffer\Exceptions\RuntimeException; |
13 | 13 | use PHP_CodeSniffer\Util; |
14 | 14 | |
15 | -abstract class Tokenizer |
|
16 | -{ |
|
15 | +abstract class Tokenizer { |
|
17 | 16 | |
18 | 17 | /** |
19 | 18 | * The config data for the run. |
@@ -82,8 +81,7 @@ discard block |
||
82 | 81 | * @return void |
83 | 82 | * @throws \PHP_CodeSniffer\Exceptions\TokenizerException If the file appears to be minified. |
84 | 83 | */ |
85 | - public function __construct($content, $config, $eolChar='\n') |
|
86 | - { |
|
84 | + public function __construct($content, $config, $eolChar='\n') { |
|
87 | 85 | $this->eolChar = $eolChar; |
88 | 86 | |
89 | 87 | $this->config = $config; |
@@ -113,8 +111,7 @@ discard block |
||
113 | 111 | * |
114 | 112 | * @return boolean |
115 | 113 | */ |
116 | - protected function isMinifiedContent($content, $eolChar='\n') |
|
117 | - { |
|
114 | + protected function isMinifiedContent($content, $eolChar='\n') { |
|
118 | 115 | // Minified files often have a very large number of characters per line |
119 | 116 | // and cause issues when tokenizing. |
120 | 117 | $numChars = strlen($content); |
@@ -134,8 +131,7 @@ discard block |
||
134 | 131 | * |
135 | 132 | * @return array |
136 | 133 | */ |
137 | - public function getTokens() |
|
138 | - { |
|
134 | + public function getTokens() { |
|
139 | 135 | return $this->tokens; |
140 | 136 | |
141 | 137 | }//end getTokens() |
@@ -167,8 +163,7 @@ discard block |
||
167 | 163 | * |
168 | 164 | * @return void |
169 | 165 | */ |
170 | - private function createPositionMap() |
|
171 | - { |
|
166 | + private function createPositionMap() { |
|
172 | 167 | $currColumn = 1; |
173 | 168 | $lineNumber = 1; |
174 | 169 | $eolLen = strlen($this->eolChar); |
@@ -576,8 +571,7 @@ discard block |
||
576 | 571 | * |
577 | 572 | * @return void |
578 | 573 | */ |
579 | - public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) |
|
580 | - { |
|
574 | + public function replaceTabsInToken(&$token, $prefix=' ', $padding=' ', $tabWidth=null) { |
|
581 | 575 | $checkEncoding = false; |
582 | 576 | if (function_exists('iconv_strlen') === true) { |
583 | 577 | $checkEncoding = true; |
@@ -668,8 +662,7 @@ discard block |
||
668 | 662 | * |
669 | 663 | * @return void |
670 | 664 | */ |
671 | - private function createTokenMap() |
|
672 | - { |
|
665 | + private function createTokenMap() { |
|
673 | 666 | if (PHP_CODESNIFFER_VERBOSITY > 1) { |
674 | 667 | echo "\t*** START TOKEN MAP ***".PHP_EOL; |
675 | 668 | } |
@@ -798,8 +791,7 @@ discard block |
||
798 | 791 | * |
799 | 792 | * @return void |
800 | 793 | */ |
801 | - private function createParenthesisNestingMap() |
|
802 | - { |
|
794 | + private function createParenthesisNestingMap() { |
|
803 | 795 | $map = []; |
804 | 796 | for ($i = 0; $i < $this->numTokens; $i++) { |
805 | 797 | if (isset($this->tokens[$i]['parenthesis_opener']) === true |
@@ -836,8 +828,7 @@ discard block |
||
836 | 828 | * @return void |
837 | 829 | * @see recurseScopeMap() |
838 | 830 | */ |
839 | - private function createScopeMap() |
|
840 | - { |
|
831 | + private function createScopeMap() { |
|
841 | 832 | if (PHP_CODESNIFFER_VERBOSITY > 1) { |
842 | 833 | echo "\t*** START SCOPE MAP ***".PHP_EOL; |
843 | 834 | } |
@@ -880,8 +871,7 @@ discard block |
||
880 | 871 | * |
881 | 872 | * @return int The position in the stack that closed the scope. |
882 | 873 | */ |
883 | - private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) |
|
884 | - { |
|
874 | + private function recurseScopeMap($stackPtr, $depth=1, &$ignore=0) { |
|
885 | 875 | if (PHP_CODESNIFFER_VERBOSITY > 1) { |
886 | 876 | echo str_repeat("\t", $depth); |
887 | 877 | echo "=> Begin scope map recursion at token $stackPtr with depth $depth".PHP_EOL; |
@@ -1409,8 +1399,7 @@ discard block |
||
1409 | 1399 | * |
1410 | 1400 | * @return void |
1411 | 1401 | */ |
1412 | - private function createLevelMap() |
|
1413 | - { |
|
1402 | + private function createLevelMap() { |
|
1414 | 1403 | if (PHP_CODESNIFFER_VERBOSITY > 1) { |
1415 | 1404 | echo "\t*** START LEVEL MAP ***".PHP_EOL; |
1416 | 1405 | } |
@@ -93,7 +93,7 @@ |
||
93 | 93 | * |
94 | 94 | * @param \PHP_CodeSniffer\Files\File $phpcsFile Optional. The current file being processed. |
95 | 95 | * |
96 | - * @return bool True if annotations should be ignored, false otherwise. |
|
96 | + * @return boolean|null True if annotations should be ignored, false otherwise. |
|
97 | 97 | */ |
98 | 98 | public static function ignore_annotations( File $phpcsFile = null ) { |
99 | 99 | if ( isset( $phpcsFile, $phpcsFile->config->annotations ) ) { |
@@ -951,7 +951,7 @@ discard block |
||
951 | 951 | * @param bool $is_error Optional. Whether to report the message as an 'error' or 'warning'. |
952 | 952 | * Defaults to true (error). |
953 | 953 | * @param string $code Optional error code for the message. Defaults to 'Found'. |
954 | - * @param array $data Optional input for the data replacements. |
|
954 | + * @param string[] $data Optional input for the data replacements. |
|
955 | 955 | * @param int $severity Optional. Severity level. Defaults to 0 which will translate to |
956 | 956 | * the PHPCS default severity level. |
957 | 957 | * @return bool |
@@ -970,7 +970,7 @@ discard block |
||
970 | 970 | * @param bool $is_error Optional. Whether to report the message as an 'error' or 'warning'. |
971 | 971 | * Defaults to true (error). |
972 | 972 | * @param string $code Optional error code for the message. Defaults to 'Found'. |
973 | - * @param array $data Optional input for the data replacements. |
|
973 | + * @param string[] $data Optional input for the data replacements. |
|
974 | 974 | * @param int $severity Optional. Severity level. Defaults to 0 which will translate to |
975 | 975 | * the PHPCS default severity level. |
976 | 976 | * @return bool |
@@ -1105,10 +1105,10 @@ discard block |
||
1105 | 1105 | protected function get_last_ptr_on_line( $stackPtr ) { |
1106 | 1106 | |
1107 | 1107 | $tokens = $this->tokens; |
1108 | - $currentLine = $tokens[ $stackPtr ]['line']; |
|
1108 | + $currentLine = $tokens[ $stackPtr ][ 'line' ]; |
|
1109 | 1109 | $nextPtr = ( $stackPtr + 1 ); |
1110 | 1110 | |
1111 | - while ( isset( $tokens[ $nextPtr ] ) && $tokens[ $nextPtr ]['line'] === $currentLine ) { |
|
1111 | + while ( isset( $tokens[ $nextPtr ] ) && $tokens[ $nextPtr ][ 'line' ] === $currentLine ) { |
|
1112 | 1112 | $nextPtr++; |
1113 | 1113 | // Do nothing, we just want the last token of the line. |
1114 | 1114 | } |
@@ -1186,27 +1186,27 @@ discard block |
||
1186 | 1186 | |
1187 | 1187 | if ( false !== $end_of_statement ) { |
1188 | 1188 | // If the statement was ended by a semicolon, check if there is a whitelist comment directly after it. |
1189 | - if ( \T_SEMICOLON === $this->tokens[ $end_of_statement ]['code'] ) { |
|
1189 | + if ( \T_SEMICOLON === $this->tokens[ $end_of_statement ][ 'code' ] ) { |
|
1190 | 1190 | $lastPtr = $this->phpcsFile->findNext( \T_WHITESPACE, ( $end_of_statement + 1 ), null, true ); |
1191 | - } elseif ( \T_CLOSE_TAG === $this->tokens[ $end_of_statement ]['code'] ) { |
|
1191 | + } elseif ( \T_CLOSE_TAG === $this->tokens[ $end_of_statement ][ 'code' ] ) { |
|
1192 | 1192 | // If the semicolon was left out and it was terminated by an ending tag, we need to look backwards. |
1193 | 1193 | $lastPtr = $this->phpcsFile->findPrevious( \T_WHITESPACE, ( $end_of_statement - 1 ), null, true ); |
1194 | 1194 | } |
1195 | 1195 | |
1196 | - if ( ( \T_COMMENT === $this->tokens[ $lastPtr ]['code'] |
|
1197 | - || ( isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ]['code'] ] ) |
|
1198 | - && \T_PHPCS_SET !== $this->tokens[ $lastPtr ]['code'] ) ) |
|
1199 | - && $this->tokens[ $lastPtr ]['line'] === $this->tokens[ $end_of_statement ]['line'] |
|
1200 | - && preg_match( $regex, $this->tokens[ $lastPtr ]['content'] ) === 1 |
|
1196 | + if ( ( \T_COMMENT === $this->tokens[ $lastPtr ][ 'code' ] |
|
1197 | + || ( isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ][ 'code' ] ] ) |
|
1198 | + && \T_PHPCS_SET !== $this->tokens[ $lastPtr ][ 'code' ] ) ) |
|
1199 | + && $this->tokens[ $lastPtr ][ 'line' ] === $this->tokens[ $end_of_statement ][ 'line' ] |
|
1200 | + && preg_match( $regex, $this->tokens[ $lastPtr ][ 'content' ] ) === 1 |
|
1201 | 1201 | ) { |
1202 | 1202 | if ( isset( $thrown_notices[ $filename ][ $lastPtr ] ) === false |
1203 | - && isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ]['code'] ] ) === false |
|
1203 | + && isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ][ 'code' ] ] ) === false |
|
1204 | 1204 | ) { |
1205 | 1205 | $this->phpcsFile->addWarning( |
1206 | 1206 | $deprecation_notice, |
1207 | 1207 | $lastPtr, |
1208 | 1208 | $deprecation_code, |
1209 | - array( $this->tokens[ $lastPtr ]['content'] ) |
|
1209 | + array( $this->tokens[ $lastPtr ][ 'content' ] ) |
|
1210 | 1210 | ); |
1211 | 1211 | |
1212 | 1212 | $thrown_notices[ $filename ][ $lastPtr ] = true; |
@@ -1221,20 +1221,20 @@ discard block |
||
1221 | 1221 | $end_of_line = $this->get_last_ptr_on_line( $stackPtr ); |
1222 | 1222 | $lastPtr = $this->phpcsFile->findPrevious( \T_WHITESPACE, $end_of_line, null, true ); |
1223 | 1223 | |
1224 | - if ( ( \T_COMMENT === $this->tokens[ $lastPtr ]['code'] |
|
1225 | - || ( isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ]['code'] ] ) |
|
1226 | - && \T_PHPCS_SET !== $this->tokens[ $lastPtr ]['code'] ) ) |
|
1227 | - && $this->tokens[ $lastPtr ]['line'] === $this->tokens[ $stackPtr ]['line'] |
|
1228 | - && preg_match( $regex, $this->tokens[ $lastPtr ]['content'] ) === 1 |
|
1224 | + if ( ( \T_COMMENT === $this->tokens[ $lastPtr ][ 'code' ] |
|
1225 | + || ( isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ][ 'code' ] ] ) |
|
1226 | + && \T_PHPCS_SET !== $this->tokens[ $lastPtr ][ 'code' ] ) ) |
|
1227 | + && $this->tokens[ $lastPtr ][ 'line' ] === $this->tokens[ $stackPtr ][ 'line' ] |
|
1228 | + && preg_match( $regex, $this->tokens[ $lastPtr ][ 'content' ] ) === 1 |
|
1229 | 1229 | ) { |
1230 | 1230 | if ( isset( $thrown_notices[ $filename ][ $lastPtr ] ) === false |
1231 | - && isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ]['code'] ] ) === false |
|
1231 | + && isset( Tokens::$phpcsCommentTokens[ $this->tokens[ $lastPtr ][ 'code' ] ] ) === false |
|
1232 | 1232 | ) { |
1233 | 1233 | $this->phpcsFile->addWarning( |
1234 | 1234 | $deprecation_notice, |
1235 | 1235 | $lastPtr, |
1236 | 1236 | $deprecation_code, |
1237 | - array( $this->tokens[ $lastPtr ]['content'] ) |
|
1237 | + array( $this->tokens[ $lastPtr ][ 'content' ] ) |
|
1238 | 1238 | ); |
1239 | 1239 | |
1240 | 1240 | $thrown_notices[ $filename ][ $lastPtr ] = true; |
@@ -1268,7 +1268,7 @@ discard block |
||
1268 | 1268 | return false; |
1269 | 1269 | } |
1270 | 1270 | |
1271 | - $conditions = $this->tokens[ $stackPtr ]['conditions']; |
|
1271 | + $conditions = $this->tokens[ $stackPtr ][ 'conditions' ]; |
|
1272 | 1272 | foreach ( $conditions as $token => $condition ) { |
1273 | 1273 | if ( $token === $functionToken ) { |
1274 | 1274 | // Only examine the conditions the function is nested in, not those nested within the function. |
@@ -1303,7 +1303,7 @@ discard block |
||
1303 | 1303 | */ |
1304 | 1304 | protected function is_test_class( $stackPtr ) { |
1305 | 1305 | |
1306 | - if ( isset( $this->tokens[ $stackPtr ], Tokens::$ooScopeTokens[ $this->tokens[ $stackPtr ]['code'] ] ) === false ) { |
|
1306 | + if ( isset( $this->tokens[ $stackPtr ], Tokens::$ooScopeTokens[ $this->tokens[ $stackPtr ][ 'code' ] ] ) === false ) { |
|
1307 | 1307 | return false; |
1308 | 1308 | } |
1309 | 1309 | |
@@ -1334,7 +1334,7 @@ discard block |
||
1334 | 1334 | |
1335 | 1335 | // Does the class/trait extend one of the whitelisted test classes ? |
1336 | 1336 | $extendedClassName = $this->phpcsFile->findExtendedClassName( $stackPtr ); |
1337 | - if ( '\\' === $extendedClassName[0] ) { |
|
1337 | + if ( '\\' === $extendedClassName[ 0 ] ) { |
|
1338 | 1338 | if ( isset( $whitelist[ substr( $extendedClassName, 1 ) ] ) ) { |
1339 | 1339 | return true; |
1340 | 1340 | } |
@@ -1380,7 +1380,7 @@ discard block |
||
1380 | 1380 | ); |
1381 | 1381 | |
1382 | 1382 | // Must be a variable, constant or closing square bracket (see below). |
1383 | - if ( ! isset( $valid[ $this->tokens[ $stackPtr ]['code'] ] ) ) { |
|
1383 | + if ( ! isset( $valid[ $this->tokens[ $stackPtr ][ 'code' ] ] ) ) { |
|
1384 | 1384 | return false; |
1385 | 1385 | } |
1386 | 1386 | |
@@ -1399,15 +1399,15 @@ discard block |
||
1399 | 1399 | } |
1400 | 1400 | |
1401 | 1401 | // If the next token is an assignment, that's all we need to know. |
1402 | - if ( isset( Tokens::$assignmentTokens[ $this->tokens[ $next_non_empty ]['code'] ] ) ) { |
|
1402 | + if ( isset( Tokens::$assignmentTokens[ $this->tokens[ $next_non_empty ][ 'code' ] ] ) ) { |
|
1403 | 1403 | return true; |
1404 | 1404 | } |
1405 | 1405 | |
1406 | 1406 | // Check if this is an array assignment, e.g., `$var['key'] = 'val';` . |
1407 | - if ( \T_OPEN_SQUARE_BRACKET === $this->tokens[ $next_non_empty ]['code'] |
|
1408 | - && isset( $this->tokens[ $next_non_empty ]['bracket_closer'] ) |
|
1407 | + if ( \T_OPEN_SQUARE_BRACKET === $this->tokens[ $next_non_empty ][ 'code' ] |
|
1408 | + && isset( $this->tokens[ $next_non_empty ][ 'bracket_closer' ] ) |
|
1409 | 1409 | ) { |
1410 | - return $this->is_assignment( $this->tokens[ $next_non_empty ]['bracket_closer'] ); |
|
1410 | + return $this->is_assignment( $this->tokens[ $next_non_empty ][ 'bracket_closer' ] ); |
|
1411 | 1411 | } |
1412 | 1412 | |
1413 | 1413 | return false; |
@@ -1444,12 +1444,12 @@ discard block |
||
1444 | 1444 | |
1445 | 1445 | // If we're in a function, only look inside of it. |
1446 | 1446 | // Once PHPCS 3.5.0 comes out this should be changed to the new Conditions::GetLastCondition() method. |
1447 | - if ( isset( $tokens[ $stackPtr ]['conditions'] ) === true ) { |
|
1448 | - $conditions = $tokens[ $stackPtr ]['conditions']; |
|
1447 | + if ( isset( $tokens[ $stackPtr ][ 'conditions' ] ) === true ) { |
|
1448 | + $conditions = $tokens[ $stackPtr ][ 'conditions' ]; |
|
1449 | 1449 | $conditions = array_reverse( $conditions, true ); |
1450 | 1450 | foreach ( $conditions as $tokenPtr => $condition ) { |
1451 | 1451 | if ( \T_FUNCTION === $condition || \T_CLOSURE === $condition ) { |
1452 | - $start = $tokens[ $tokenPtr ]['scope_opener']; |
|
1452 | + $start = $tokens[ $tokenPtr ][ 'scope_opener' ]; |
|
1453 | 1453 | break; |
1454 | 1454 | } |
1455 | 1455 | } |
@@ -1470,23 +1470,23 @@ discard block |
||
1470 | 1470 | // If this superglobal is inside such a check, look for the nonce after it as well, |
1471 | 1471 | // all the way to the end of the scope. |
1472 | 1472 | if ( true === $allow_nonce_after ) { |
1473 | - $end = ( 0 === $start ) ? $this->phpcsFile->numTokens : $tokens[ $start ]['scope_closer']; |
|
1473 | + $end = ( 0 === $start ) ? $this->phpcsFile->numTokens : $tokens[ $start ][ 'scope_closer' ]; |
|
1474 | 1474 | } |
1475 | 1475 | |
1476 | 1476 | // Check if we've looked here before. |
1477 | 1477 | $filename = $this->phpcsFile->getFilename(); |
1478 | 1478 | |
1479 | 1479 | if ( |
1480 | - $filename === $last['file'] |
|
1481 | - && $start === $last['start'] |
|
1480 | + $filename === $last[ 'file' ] |
|
1481 | + && $start === $last[ 'start' ] |
|
1482 | 1482 | ) { |
1483 | 1483 | |
1484 | - if ( false !== $last['nonce_check'] ) { |
|
1484 | + if ( false !== $last[ 'nonce_check' ] ) { |
|
1485 | 1485 | // If we have already found an nonce check in this scope, we just |
1486 | 1486 | // need to check whether it comes before this token. It is OK if the |
1487 | 1487 | // check is after the token though, if this was only a isset() check. |
1488 | - return ( true === $allow_nonce_after || $last['nonce_check'] < $stackPtr ); |
|
1489 | - } elseif ( $end <= $last['end'] ) { |
|
1488 | + return ( true === $allow_nonce_after || $last[ 'nonce_check' ] < $stackPtr ); |
|
1489 | + } elseif ( $end <= $last[ 'end' ] ) { |
|
1490 | 1490 | // If not, we can still go ahead and return false if we've already |
1491 | 1491 | // checked to the end of the search area. |
1492 | 1492 | return false; |
@@ -1494,7 +1494,7 @@ discard block |
||
1494 | 1494 | |
1495 | 1495 | // We haven't checked this far yet, but we can still save work by |
1496 | 1496 | // skipping over the part we've already checked. |
1497 | - $start = $last['end']; |
|
1497 | + $start = $last[ 'end' ]; |
|
1498 | 1498 | } else { |
1499 | 1499 | $last = array( |
1500 | 1500 | 'file' => $filename, |
@@ -1506,23 +1506,23 @@ discard block |
||
1506 | 1506 | // Loop through the tokens looking for nonce verification functions. |
1507 | 1507 | for ( $i = $start; $i < $end; $i++ ) { |
1508 | 1508 | // Skip over nested closed scope constructs. |
1509 | - if ( \T_FUNCTION === $tokens[ $i ]['code'] |
|
1510 | - || \T_CLOSURE === $tokens[ $i ]['code'] |
|
1511 | - || isset( Tokens::$ooScopeTokens[ $tokens[ $i ]['code'] ] ) |
|
1509 | + if ( \T_FUNCTION === $tokens[ $i ][ 'code' ] |
|
1510 | + || \T_CLOSURE === $tokens[ $i ][ 'code' ] |
|
1511 | + || isset( Tokens::$ooScopeTokens[ $tokens[ $i ][ 'code' ] ] ) |
|
1512 | 1512 | ) { |
1513 | - if ( isset( $tokens[ $i ]['scope_closer'] ) ) { |
|
1514 | - $i = $tokens[ $i ]['scope_closer']; |
|
1513 | + if ( isset( $tokens[ $i ][ 'scope_closer' ] ) ) { |
|
1514 | + $i = $tokens[ $i ][ 'scope_closer' ]; |
|
1515 | 1515 | } |
1516 | 1516 | continue; |
1517 | 1517 | } |
1518 | 1518 | |
1519 | 1519 | // If this isn't a function name, skip it. |
1520 | - if ( \T_STRING !== $tokens[ $i ]['code'] ) { |
|
1520 | + if ( \T_STRING !== $tokens[ $i ][ 'code' ] ) { |
|
1521 | 1521 | continue; |
1522 | 1522 | } |
1523 | 1523 | |
1524 | 1524 | // If this is one of the nonce verification functions, we can bail out. |
1525 | - if ( isset( $this->nonceVerificationFunctions[ $tokens[ $i ]['content'] ] ) ) { |
|
1525 | + if ( isset( $this->nonceVerificationFunctions[ $tokens[ $i ][ 'content' ] ] ) ) { |
|
1526 | 1526 | /* |
1527 | 1527 | * Now, make sure it is a call to a global function. |
1528 | 1528 | */ |
@@ -1534,13 +1534,13 @@ discard block |
||
1534 | 1534 | continue; |
1535 | 1535 | } |
1536 | 1536 | |
1537 | - $last['nonce_check'] = $i; |
|
1537 | + $last[ 'nonce_check' ] = $i; |
|
1538 | 1538 | return true; |
1539 | 1539 | } |
1540 | 1540 | } |
1541 | 1541 | |
1542 | 1542 | // We're still here, so no luck. |
1543 | - $last['nonce_check'] = false; |
|
1543 | + $last[ 'nonce_check' ] = false; |
|
1544 | 1544 | |
1545 | 1545 | return false; |
1546 | 1546 | } |
@@ -1558,11 +1558,11 @@ discard block |
||
1558 | 1558 | */ |
1559 | 1559 | protected function is_in_isset_or_empty( $stackPtr ) { |
1560 | 1560 | |
1561 | - if ( ! isset( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
1561 | + if ( ! isset( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
1562 | 1562 | return false; |
1563 | 1563 | } |
1564 | 1564 | |
1565 | - $nested_parenthesis = $this->tokens[ $stackPtr ]['nested_parenthesis']; |
|
1565 | + $nested_parenthesis = $this->tokens[ $stackPtr ][ 'nested_parenthesis' ]; |
|
1566 | 1566 | |
1567 | 1567 | end( $nested_parenthesis ); |
1568 | 1568 | $open_parenthesis = key( $nested_parenthesis ); |
@@ -1572,7 +1572,7 @@ discard block |
||
1572 | 1572 | return false; |
1573 | 1573 | } |
1574 | 1574 | |
1575 | - $previous_code = $this->tokens[ $previous_non_empty ]['code']; |
|
1575 | + $previous_code = $this->tokens[ $previous_non_empty ][ 'code' ]; |
|
1576 | 1576 | if ( \T_ISSET === $previous_code || \T_EMPTY === $previous_code ) { |
1577 | 1577 | return true; |
1578 | 1578 | } |
@@ -1585,7 +1585,7 @@ discard block |
||
1585 | 1585 | $functionPtr = $this->is_in_function_call( $stackPtr, $valid_functions ); |
1586 | 1586 | if ( false !== $functionPtr ) { |
1587 | 1587 | $second_param = $this->get_function_call_parameter( $functionPtr, 2 ); |
1588 | - if ( $stackPtr >= $second_param['start'] && $stackPtr <= $second_param['end'] ) { |
|
1588 | + if ( $stackPtr >= $second_param[ 'start' ] && $stackPtr <= $second_param[ 'end' ] ) { |
|
1589 | 1589 | return true; |
1590 | 1590 | } |
1591 | 1591 | } |
@@ -1612,8 +1612,8 @@ discard block |
||
1612 | 1612 | return false; |
1613 | 1613 | } |
1614 | 1614 | |
1615 | - if ( \T_OBJECT_OPERATOR !== $this->tokens[ $before ]['code'] |
|
1616 | - && \T_DOUBLE_COLON !== $this->tokens[ $before ]['code'] |
|
1615 | + if ( \T_OBJECT_OPERATOR !== $this->tokens[ $before ][ 'code' ] |
|
1616 | + && \T_DOUBLE_COLON !== $this->tokens[ $before ][ 'code' ] |
|
1617 | 1617 | ) { |
1618 | 1618 | return false; |
1619 | 1619 | } |
@@ -1640,7 +1640,7 @@ discard block |
||
1640 | 1640 | return false; |
1641 | 1641 | } |
1642 | 1642 | |
1643 | - if ( \T_NS_SEPARATOR !== $this->tokens[ $prev ]['code'] ) { |
|
1643 | + if ( \T_NS_SEPARATOR !== $this->tokens[ $prev ][ 'code' ] ) { |
|
1644 | 1644 | return false; |
1645 | 1645 | } |
1646 | 1646 | |
@@ -1649,8 +1649,8 @@ discard block |
||
1649 | 1649 | return false; |
1650 | 1650 | } |
1651 | 1651 | |
1652 | - if ( \T_STRING !== $this->tokens[ $before_prev ]['code'] |
|
1653 | - && \T_NAMESPACE !== $this->tokens[ $before_prev ]['code'] |
|
1652 | + if ( \T_STRING !== $this->tokens[ $before_prev ][ 'code' ] |
|
1653 | + && \T_NAMESPACE !== $this->tokens[ $before_prev ][ 'code' ] |
|
1654 | 1654 | ) { |
1655 | 1655 | return false; |
1656 | 1656 | } |
@@ -1691,11 +1691,11 @@ discard block |
||
1691 | 1691 | * @return int|bool Stack pointer to the function call T_STRING token or false otherwise. |
1692 | 1692 | */ |
1693 | 1693 | protected function is_in_function_call( $stackPtr, $valid_functions, $global = true, $allow_nested = false ) { |
1694 | - if ( ! isset( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
1694 | + if ( ! isset( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
1695 | 1695 | return false; |
1696 | 1696 | } |
1697 | 1697 | |
1698 | - $nested_parenthesis = $this->tokens[ $stackPtr ]['nested_parenthesis']; |
|
1698 | + $nested_parenthesis = $this->tokens[ $stackPtr ][ 'nested_parenthesis' ]; |
|
1699 | 1699 | if ( false === $allow_nested ) { |
1700 | 1700 | $nested_parenthesis = array_reverse( $nested_parenthesis, true ); |
1701 | 1701 | } |
@@ -1703,11 +1703,11 @@ discard block |
||
1703 | 1703 | foreach ( $nested_parenthesis as $open => $close ) { |
1704 | 1704 | |
1705 | 1705 | $prev_non_empty = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $open - 1 ), null, true, null, true ); |
1706 | - if ( false === $prev_non_empty || \T_STRING !== $this->tokens[ $prev_non_empty ]['code'] ) { |
|
1706 | + if ( false === $prev_non_empty || \T_STRING !== $this->tokens[ $prev_non_empty ][ 'code' ] ) { |
|
1707 | 1707 | continue; |
1708 | 1708 | } |
1709 | 1709 | |
1710 | - if ( isset( $valid_functions[ strtolower( $this->tokens[ $prev_non_empty ]['content'] ) ] ) === false ) { |
|
1710 | + if ( isset( $valid_functions[ strtolower( $this->tokens[ $prev_non_empty ][ 'content' ] ) ] ) === false ) { |
|
1711 | 1711 | if ( false === $allow_nested ) { |
1712 | 1712 | // Function call encountered, but not to one of the allowed functions. |
1713 | 1713 | return false; |
@@ -1752,7 +1752,7 @@ discard block |
||
1752 | 1752 | * The return can never be `0` as there will always be a PHP open tag before the |
1753 | 1753 | * function call. |
1754 | 1754 | */ |
1755 | - return (bool) $this->is_in_function_call( $stackPtr, $this->typeTestFunctions ); |
|
1755 | + return (bool)$this->is_in_function_call( $stackPtr, $this->typeTestFunctions ); |
|
1756 | 1756 | } |
1757 | 1757 | |
1758 | 1758 | /** |
@@ -1773,7 +1773,7 @@ discard block |
||
1773 | 1773 | |
1774 | 1774 | // If this isn't set, we know the value must have only been casted, because |
1775 | 1775 | // is_sanitized() would have returned false otherwise. |
1776 | - if ( ! isset( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
1776 | + if ( ! isset( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
1777 | 1777 | return true; |
1778 | 1778 | } |
1779 | 1779 | |
@@ -1785,7 +1785,7 @@ discard block |
||
1785 | 1785 | |
1786 | 1786 | // The only parentheses should belong to the sanitizing function. If there's |
1787 | 1787 | // more than one set, this isn't *only* sanitization. |
1788 | - return ( \count( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) === 1 ); |
|
1788 | + return ( \count( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) === 1 ); |
|
1789 | 1789 | } |
1790 | 1790 | |
1791 | 1791 | /** |
@@ -1812,7 +1812,7 @@ discard block |
||
1812 | 1812 | } |
1813 | 1813 | |
1814 | 1814 | // Check if it is a safe cast. |
1815 | - return isset( $this->safe_casts[ $this->tokens[ $prev ]['code'] ] ); |
|
1815 | + return isset( $this->safe_casts[ $this->tokens[ $prev ][ 'code' ] ] ); |
|
1816 | 1816 | } |
1817 | 1817 | |
1818 | 1818 | /** |
@@ -1834,7 +1834,7 @@ discard block |
||
1834 | 1834 | } |
1835 | 1835 | |
1836 | 1836 | // If this isn't within a function call, we know already that it's not safe. |
1837 | - if ( ! isset( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
1837 | + if ( ! isset( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
1838 | 1838 | if ( $require_unslash ) { |
1839 | 1839 | $this->add_unslash_error( $stackPtr ); |
1840 | 1840 | } |
@@ -1843,13 +1843,13 @@ discard block |
||
1843 | 1843 | } |
1844 | 1844 | |
1845 | 1845 | // Get the function that it's in. |
1846 | - $nested_parenthesis = $this->tokens[ $stackPtr ]['nested_parenthesis']; |
|
1846 | + $nested_parenthesis = $this->tokens[ $stackPtr ][ 'nested_parenthesis' ]; |
|
1847 | 1847 | $nested_openers = array_keys( $nested_parenthesis ); |
1848 | 1848 | $function_opener = array_pop( $nested_openers ); |
1849 | 1849 | $functionPtr = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $function_opener - 1 ), null, true, null, true ); |
1850 | 1850 | |
1851 | 1851 | // If it is just being unset, the value isn't used at all, so it's safe. |
1852 | - if ( \T_UNSET === $this->tokens[ $functionPtr ]['code'] ) { |
|
1852 | + if ( \T_UNSET === $this->tokens[ $functionPtr ][ 'code' ] ) { |
|
1853 | 1853 | return true; |
1854 | 1854 | } |
1855 | 1855 | |
@@ -1869,7 +1869,7 @@ discard block |
||
1869 | 1869 | return false; |
1870 | 1870 | } |
1871 | 1871 | |
1872 | - $functionName = $this->tokens[ $functionPtr ]['content']; |
|
1872 | + $functionName = $this->tokens[ $functionPtr ][ 'content' ]; |
|
1873 | 1873 | |
1874 | 1874 | // Check if an unslashing function is being used. |
1875 | 1875 | if ( isset( $this->unslashingFunctions[ $functionName ] ) ) { |
@@ -1888,7 +1888,7 @@ discard block |
||
1888 | 1888 | } |
1889 | 1889 | |
1890 | 1890 | $functionPtr = $higherFunctionPtr; |
1891 | - $functionName = $this->tokens[ $functionPtr ]['content']; |
|
1891 | + $functionName = $this->tokens[ $functionPtr ][ 'content' ]; |
|
1892 | 1892 | |
1893 | 1893 | } else { |
1894 | 1894 | $is_unslashed = false; |
@@ -1907,13 +1907,13 @@ discard block |
||
1907 | 1907 | */ |
1908 | 1908 | $first_non_empty = $this->phpcsFile->findNext( |
1909 | 1909 | Tokens::$emptyTokens, |
1910 | - $callback['start'], |
|
1911 | - ( $callback['end'] + 1 ), |
|
1910 | + $callback[ 'start' ], |
|
1911 | + ( $callback[ 'end' ] + 1 ), |
|
1912 | 1912 | true |
1913 | 1913 | ); |
1914 | 1914 | |
1915 | - if ( false !== $first_non_empty && \T_CONSTANT_ENCAPSED_STRING === $this->tokens[ $first_non_empty ]['code'] ) { |
|
1916 | - $functionName = $this->strip_quotes( $this->tokens[ $first_non_empty ]['content'] ); |
|
1915 | + if ( false !== $first_non_empty && \T_CONSTANT_ENCAPSED_STRING === $this->tokens[ $first_non_empty ][ 'code' ] ) { |
|
1916 | + $functionName = $this->strip_quotes( $this->tokens[ $first_non_empty ][ 'content' ] ); |
|
1917 | 1917 | } |
1918 | 1918 | } |
1919 | 1919 | } |
@@ -1944,7 +1944,7 @@ discard block |
||
1944 | 1944 | '%s data not unslashed before sanitization. Use wp_unslash() or similar', |
1945 | 1945 | $stackPtr, |
1946 | 1946 | 'MissingUnslash', |
1947 | - array( $this->tokens[ $stackPtr ]['content'] ) |
|
1947 | + array( $this->tokens[ $stackPtr ][ 'content' ] ) |
|
1948 | 1948 | ); |
1949 | 1949 | } |
1950 | 1950 | |
@@ -1966,7 +1966,7 @@ discard block |
||
1966 | 1966 | |
1967 | 1967 | $keys = array(); |
1968 | 1968 | |
1969 | - if ( \T_VARIABLE !== $this->tokens[ $stackPtr ]['code'] ) { |
|
1969 | + if ( \T_VARIABLE !== $this->tokens[ $stackPtr ][ 'code' ] ) { |
|
1970 | 1970 | return $keys; |
1971 | 1971 | } |
1972 | 1972 | |
@@ -1983,19 +1983,19 @@ discard block |
||
1983 | 1983 | |
1984 | 1984 | // If it isn't a bracket, this isn't an array-access. |
1985 | 1985 | if ( false === $open_bracket |
1986 | - || \T_OPEN_SQUARE_BRACKET !== $this->tokens[ $open_bracket ]['code'] |
|
1987 | - || ! isset( $this->tokens[ $open_bracket ]['bracket_closer'] ) |
|
1986 | + || \T_OPEN_SQUARE_BRACKET !== $this->tokens[ $open_bracket ][ 'code' ] |
|
1987 | + || ! isset( $this->tokens[ $open_bracket ][ 'bracket_closer' ] ) |
|
1988 | 1988 | ) { |
1989 | 1989 | break; |
1990 | 1990 | } |
1991 | 1991 | |
1992 | 1992 | $key = $this->phpcsFile->getTokensAsString( |
1993 | 1993 | ( $open_bracket + 1 ), |
1994 | - ( $this->tokens[ $open_bracket ]['bracket_closer'] - $open_bracket - 1 ) |
|
1994 | + ( $this->tokens[ $open_bracket ][ 'bracket_closer' ] - $open_bracket - 1 ) |
|
1995 | 1995 | ); |
1996 | 1996 | |
1997 | - $keys[] = trim( $key ); |
|
1998 | - $current = $this->tokens[ $open_bracket ]['bracket_closer']; |
|
1997 | + $keys[ ] = trim( $key ); |
|
1998 | + $current = $this->tokens[ $open_bracket ][ 'bracket_closer' ]; |
|
1999 | 1999 | } while ( isset( $this->tokens[ $current ] ) && true === $all ); |
2000 | 2000 | |
2001 | 2001 | return $keys; |
@@ -2017,8 +2017,8 @@ discard block |
||
2017 | 2017 | |
2018 | 2018 | $keys = $this->get_array_access_keys( $stackPtr, false ); |
2019 | 2019 | |
2020 | - if ( isset( $keys[0] ) ) { |
|
2021 | - return $keys[0]; |
|
2020 | + if ( isset( $keys[ 0 ] ) ) { |
|
2021 | + return $keys[ 0 ]; |
|
2022 | 2022 | } |
2023 | 2023 | |
2024 | 2024 | return false; |
@@ -2072,22 +2072,22 @@ discard block |
||
2072 | 2072 | */ |
2073 | 2073 | |
2074 | 2074 | // If there are no conditions, there's no validation. |
2075 | - if ( empty( $this->tokens[ $stackPtr ]['conditions'] ) ) { |
|
2075 | + if ( empty( $this->tokens[ $stackPtr ][ 'conditions' ] ) ) { |
|
2076 | 2076 | return false; |
2077 | 2077 | } |
2078 | 2078 | |
2079 | - $conditions = $this->tokens[ $stackPtr ]['conditions']; |
|
2079 | + $conditions = $this->tokens[ $stackPtr ][ 'conditions' ]; |
|
2080 | 2080 | end( $conditions ); // Get closest condition. |
2081 | 2081 | $conditionPtr = key( $conditions ); |
2082 | 2082 | $condition = $this->tokens[ $conditionPtr ]; |
2083 | 2083 | |
2084 | - if ( ! isset( $condition['parenthesis_opener'] ) ) { |
|
2084 | + if ( ! isset( $condition[ 'parenthesis_opener' ] ) ) { |
|
2085 | 2085 | // Live coding or parse error. |
2086 | 2086 | return false; |
2087 | 2087 | } |
2088 | 2088 | |
2089 | - $scope_start = $condition['parenthesis_opener']; |
|
2090 | - $scope_end = $condition['parenthesis_closer']; |
|
2089 | + $scope_start = $condition[ 'parenthesis_opener' ]; |
|
2090 | + $scope_end = $condition[ 'parenthesis_closer' ]; |
|
2091 | 2091 | |
2092 | 2092 | } else { |
2093 | 2093 | /* |
@@ -2102,14 +2102,14 @@ discard block |
||
2102 | 2102 | |
2103 | 2103 | // If so, we check only within the function, otherwise the whole file. |
2104 | 2104 | if ( false !== $function ) { |
2105 | - $scope_start = $this->tokens[ $function ]['scope_opener']; |
|
2105 | + $scope_start = $this->tokens[ $function ][ 'scope_opener' ]; |
|
2106 | 2106 | } else { |
2107 | 2107 | // Check if we are in a closure. |
2108 | 2108 | $closure = $this->phpcsFile->getCondition( $stackPtr, \T_CLOSURE ); |
2109 | 2109 | |
2110 | 2110 | // If so, we check only within the closure. |
2111 | 2111 | if ( false !== $closure ) { |
2112 | - $scope_start = $this->tokens[ $closure ]['scope_opener']; |
|
2112 | + $scope_start = $this->tokens[ $closure ][ 'scope_opener' ]; |
|
2113 | 2113 | } |
2114 | 2114 | } |
2115 | 2115 | |
@@ -2117,7 +2117,7 @@ discard block |
||
2117 | 2117 | } |
2118 | 2118 | |
2119 | 2119 | if ( ! empty( $array_keys ) && ! is_array( $array_keys ) ) { |
2120 | - $array_keys = (array) $array_keys; |
|
2120 | + $array_keys = (array)$array_keys; |
|
2121 | 2121 | } |
2122 | 2122 | |
2123 | 2123 | $bare_array_keys = array_map( array( $this, 'strip_quotes' ), $array_keys ); |
@@ -2133,28 +2133,28 @@ discard block |
||
2133 | 2133 | // phpcs:ignore Generic.CodeAnalysis.JumbledIncrementer.Found -- On purpose, see below. |
2134 | 2134 | for ( $i = ( $scope_start + 1 ); $i < $scope_end; $i++ ) { |
2135 | 2135 | |
2136 | - if ( isset( $targets[ $this->tokens[ $i ]['code'] ] ) === false ) { |
|
2136 | + if ( isset( $targets[ $this->tokens[ $i ][ 'code' ] ] ) === false ) { |
|
2137 | 2137 | continue; |
2138 | 2138 | } |
2139 | 2139 | |
2140 | - switch ( $targets[ $this->tokens[ $i ]['code'] ] ) { |
|
2140 | + switch ( $targets[ $this->tokens[ $i ][ 'code' ] ] ) { |
|
2141 | 2141 | case 'construct': |
2142 | 2142 | $issetOpener = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true, null, true ); |
2143 | - if ( false === $issetOpener || \T_OPEN_PARENTHESIS !== $this->tokens[ $issetOpener ]['code'] ) { |
|
2143 | + if ( false === $issetOpener || \T_OPEN_PARENTHESIS !== $this->tokens[ $issetOpener ][ 'code' ] ) { |
|
2144 | 2144 | // Parse error or live coding. |
2145 | 2145 | continue 2; |
2146 | 2146 | } |
2147 | 2147 | |
2148 | - $issetCloser = $this->tokens[ $issetOpener ]['parenthesis_closer']; |
|
2148 | + $issetCloser = $this->tokens[ $issetOpener ][ 'parenthesis_closer' ]; |
|
2149 | 2149 | |
2150 | 2150 | // Look for this variable. We purposely stomp $i from the parent loop. |
2151 | 2151 | for ( $i = ( $issetOpener + 1 ); $i < $issetCloser; $i++ ) { |
2152 | 2152 | |
2153 | - if ( \T_VARIABLE !== $this->tokens[ $i ]['code'] ) { |
|
2153 | + if ( \T_VARIABLE !== $this->tokens[ $i ][ 'code' ] ) { |
|
2154 | 2154 | continue; |
2155 | 2155 | } |
2156 | 2156 | |
2157 | - if ( $this->tokens[ $stackPtr ]['content'] !== $this->tokens[ $i ]['content'] ) { |
|
2157 | + if ( $this->tokens[ $stackPtr ][ 'content' ] !== $this->tokens[ $i ][ 'content' ] ) { |
|
2158 | 2158 | continue; |
2159 | 2159 | } |
2160 | 2160 | |
@@ -2176,14 +2176,14 @@ discard block |
||
2176 | 2176 | |
2177 | 2177 | case 'function_call': |
2178 | 2178 | // Only check calls to array_key_exists() and key_exists(). |
2179 | - if ( 'array_key_exists' !== $this->tokens[ $i ]['content'] |
|
2180 | - && 'key_exists' !== $this->tokens[ $i ]['content'] |
|
2179 | + if ( 'array_key_exists' !== $this->tokens[ $i ][ 'content' ] |
|
2180 | + && 'key_exists' !== $this->tokens[ $i ][ 'content' ] |
|
2181 | 2181 | ) { |
2182 | 2182 | continue 2; |
2183 | 2183 | } |
2184 | 2184 | |
2185 | 2185 | $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true, null, true ); |
2186 | - if ( false === $next_non_empty || \T_OPEN_PARENTHESIS !== $this->tokens[ $next_non_empty ]['code'] ) { |
|
2186 | + if ( false === $next_non_empty || \T_OPEN_PARENTHESIS !== $this->tokens[ $next_non_empty ][ 'code' ] ) { |
|
2187 | 2187 | // Not a function call. |
2188 | 2188 | continue 2; |
2189 | 2189 | } |
@@ -2203,10 +2203,10 @@ discard block |
||
2203 | 2203 | continue 2; |
2204 | 2204 | } |
2205 | 2205 | |
2206 | - $param2_first_token = $this->phpcsFile->findNext( Tokens::$emptyTokens, $params[2]['start'], ( $params[2]['end'] + 1 ), true ); |
|
2206 | + $param2_first_token = $this->phpcsFile->findNext( Tokens::$emptyTokens, $params[ 2 ][ 'start' ], ( $params[ 2 ][ 'end' ] + 1 ), true ); |
|
2207 | 2207 | if ( false === $param2_first_token |
2208 | - || \T_VARIABLE !== $this->tokens[ $param2_first_token ]['code'] |
|
2209 | - || $this->tokens[ $param2_first_token ]['content'] !== $this->tokens[ $stackPtr ]['content'] |
|
2208 | + || \T_VARIABLE !== $this->tokens[ $param2_first_token ][ 'code' ] |
|
2209 | + || $this->tokens[ $param2_first_token ][ 'content' ] !== $this->tokens[ $stackPtr ][ 'content' ] |
|
2210 | 2210 | ) { |
2211 | 2211 | continue 2; |
2212 | 2212 | } |
@@ -2233,7 +2233,7 @@ discard block |
||
2233 | 2233 | |
2234 | 2234 | // If that failed, try getting an exact match for the subset against the |
2235 | 2235 | // second parameter and the last key against the first. |
2236 | - if ( $bare_keys === $found_keys && $this->strip_quotes( $params[1]['raw'] ) === $last_key ) { |
|
2236 | + if ( $bare_keys === $found_keys && $this->strip_quotes( $params[ 1 ][ 'raw' ] ) === $last_key ) { |
|
2237 | 2237 | return true; |
2238 | 2238 | } |
2239 | 2239 | |
@@ -2248,8 +2248,8 @@ discard block |
||
2248 | 2248 | do { |
2249 | 2249 | $prev = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $prev - 1 ), null, true, null, true ); |
2250 | 2250 | // Skip over array keys, like $_GET['key']['subkey']. |
2251 | - if ( \T_CLOSE_SQUARE_BRACKET === $this->tokens[ $prev ]['code'] ) { |
|
2252 | - $prev = $this->tokens[ $prev ]['bracket_opener']; |
|
2251 | + if ( \T_CLOSE_SQUARE_BRACKET === $this->tokens[ $prev ][ 'code' ] ) { |
|
2252 | + $prev = $this->tokens[ $prev ][ 'bracket_opener' ]; |
|
2253 | 2253 | continue; |
2254 | 2254 | } |
2255 | 2255 | |
@@ -2257,11 +2257,11 @@ discard block |
||
2257 | 2257 | } while ( $prev >= ( $scope_start + 1 ) ); |
2258 | 2258 | |
2259 | 2259 | // We should now have reached the variable. |
2260 | - if ( \T_VARIABLE !== $this->tokens[ $prev ]['code'] ) { |
|
2260 | + if ( \T_VARIABLE !== $this->tokens[ $prev ][ 'code' ] ) { |
|
2261 | 2261 | continue 2; |
2262 | 2262 | } |
2263 | 2263 | |
2264 | - if ( $this->tokens[ $prev ]['content'] !== $this->tokens[ $stackPtr ]['content'] ) { |
|
2264 | + if ( $this->tokens[ $prev ][ 'content' ] !== $this->tokens[ $stackPtr ][ 'content' ] ) { |
|
2265 | 2265 | continue 2; |
2266 | 2266 | } |
2267 | 2267 | |
@@ -2310,13 +2310,13 @@ discard block |
||
2310 | 2310 | } |
2311 | 2311 | |
2312 | 2312 | // We first check if this is a switch statement (switch ( $var )). |
2313 | - if ( isset( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
2314 | - $nested_parenthesis = $this->tokens[ $stackPtr ]['nested_parenthesis']; |
|
2313 | + if ( isset( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
2314 | + $nested_parenthesis = $this->tokens[ $stackPtr ][ 'nested_parenthesis' ]; |
|
2315 | 2315 | $close_parenthesis = end( $nested_parenthesis ); |
2316 | 2316 | |
2317 | 2317 | if ( |
2318 | - isset( $this->tokens[ $close_parenthesis ]['parenthesis_owner'] ) |
|
2319 | - && \T_SWITCH === $this->tokens[ $this->tokens[ $close_parenthesis ]['parenthesis_owner'] ]['code'] |
|
2318 | + isset( $this->tokens[ $close_parenthesis ][ 'parenthesis_owner' ] ) |
|
2319 | + && \T_SWITCH === $this->tokens[ $this->tokens[ $close_parenthesis ][ 'parenthesis_owner' ] ][ 'code' ] |
|
2320 | 2320 | ) { |
2321 | 2321 | return true; |
2322 | 2322 | } |
@@ -2331,7 +2331,7 @@ discard block |
||
2331 | 2331 | true |
2332 | 2332 | ); |
2333 | 2333 | |
2334 | - if ( isset( $comparisonTokens[ $this->tokens[ $previous_token ]['code'] ] ) ) { |
|
2334 | + if ( isset( $comparisonTokens[ $this->tokens[ $previous_token ][ 'code' ] ] ) ) { |
|
2335 | 2335 | return true; |
2336 | 2336 | } |
2337 | 2337 | |
@@ -2344,17 +2344,17 @@ discard block |
||
2344 | 2344 | ); |
2345 | 2345 | |
2346 | 2346 | // This might be an opening square bracket in the case of arrays ($var['a']). |
2347 | - while ( false !== $next_token && \T_OPEN_SQUARE_BRACKET === $this->tokens[ $next_token ]['code'] ) { |
|
2347 | + while ( false !== $next_token && \T_OPEN_SQUARE_BRACKET === $this->tokens[ $next_token ][ 'code' ] ) { |
|
2348 | 2348 | |
2349 | 2349 | $next_token = $this->phpcsFile->findNext( |
2350 | 2350 | Tokens::$emptyTokens, |
2351 | - ( $this->tokens[ $next_token ]['bracket_closer'] + 1 ), |
|
2351 | + ( $this->tokens[ $next_token ][ 'bracket_closer' ] + 1 ), |
|
2352 | 2352 | null, |
2353 | 2353 | true |
2354 | 2354 | ); |
2355 | 2355 | } |
2356 | 2356 | |
2357 | - if ( false !== $next_token && isset( $comparisonTokens[ $this->tokens[ $next_token ]['code'] ] ) ) { |
|
2357 | + if ( false !== $next_token && isset( $comparisonTokens[ $this->tokens[ $next_token ][ 'code' ] ] ) ) { |
|
2358 | 2358 | return true; |
2359 | 2359 | } |
2360 | 2360 | |
@@ -2377,7 +2377,7 @@ discard block |
||
2377 | 2377 | return false; |
2378 | 2378 | } |
2379 | 2379 | |
2380 | - $function_name = $this->tokens[ $function_ptr ]['content']; |
|
2380 | + $function_name = $this->tokens[ $function_ptr ][ 'content' ]; |
|
2381 | 2381 | if ( true === $this->arrayCompareFunctions[ $function_name ] ) { |
2382 | 2382 | return true; |
2383 | 2383 | } |
@@ -2412,7 +2412,7 @@ discard block |
||
2412 | 2412 | // USE keywords inside closures. |
2413 | 2413 | $next = $this->phpcsFile->findNext( \T_WHITESPACE, ( $stackPtr + 1 ), null, true ); |
2414 | 2414 | |
2415 | - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ]['code'] ) { |
|
2415 | + if ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ][ 'code' ] ) { |
|
2416 | 2416 | return 'closure'; |
2417 | 2417 | } |
2418 | 2418 | |
@@ -2445,8 +2445,8 @@ discard block |
||
2445 | 2445 | $variables = array(); |
2446 | 2446 | if ( preg_match_all( '/(?P<backslashes>\\\\*)\$(?P<symbol>\w+)/', $string, $match_sets, \PREG_SET_ORDER ) ) { |
2447 | 2447 | foreach ( $match_sets as $matches ) { |
2448 | - if ( ! isset( $matches['backslashes'] ) || ( \strlen( $matches['backslashes'] ) % 2 ) === 0 ) { |
|
2449 | - $variables[] = $matches['symbol']; |
|
2448 | + if ( ! isset( $matches[ 'backslashes' ] ) || ( \strlen( $matches[ 'backslashes' ] ) % 2 ) === 0 ) { |
|
2449 | + $variables[ ] = $matches[ 'symbol' ]; |
|
2450 | 2450 | } |
2451 | 2451 | } |
2452 | 2452 | } |
@@ -2498,19 +2498,19 @@ discard block |
||
2498 | 2498 | } |
2499 | 2499 | |
2500 | 2500 | // Is this one of the tokens this function handles ? |
2501 | - if ( false === \in_array( $this->tokens[ $stackPtr ]['code'], array( \T_STRING, \T_ARRAY, \T_OPEN_SHORT_ARRAY ), true ) ) { |
|
2501 | + if ( false === \in_array( $this->tokens[ $stackPtr ][ 'code' ], array( \T_STRING, \T_ARRAY, \T_OPEN_SHORT_ARRAY ), true ) ) { |
|
2502 | 2502 | return false; |
2503 | 2503 | } |
2504 | 2504 | |
2505 | 2505 | $next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); |
2506 | 2506 | |
2507 | 2507 | // Deal with short array syntax. |
2508 | - if ( 'T_OPEN_SHORT_ARRAY' === $this->tokens[ $stackPtr ]['type'] ) { |
|
2509 | - if ( false === isset( $this->tokens[ $stackPtr ]['bracket_closer'] ) ) { |
|
2508 | + if ( 'T_OPEN_SHORT_ARRAY' === $this->tokens[ $stackPtr ][ 'type' ] ) { |
|
2509 | + if ( false === isset( $this->tokens[ $stackPtr ][ 'bracket_closer' ] ) ) { |
|
2510 | 2510 | return false; |
2511 | 2511 | } |
2512 | 2512 | |
2513 | - if ( $next_non_empty === $this->tokens[ $stackPtr ]['bracket_closer'] ) { |
|
2513 | + if ( $next_non_empty === $this->tokens[ $stackPtr ][ 'bracket_closer' ] ) { |
|
2514 | 2514 | // No parameters. |
2515 | 2515 | return false; |
2516 | 2516 | } else { |
@@ -2520,15 +2520,15 @@ discard block |
||
2520 | 2520 | |
2521 | 2521 | // Deal with function calls & long arrays. |
2522 | 2522 | // Next non-empty token should be the open parenthesis. |
2523 | - if ( false === $next_non_empty && \T_OPEN_PARENTHESIS !== $this->tokens[ $next_non_empty ]['code'] ) { |
|
2523 | + if ( false === $next_non_empty && \T_OPEN_PARENTHESIS !== $this->tokens[ $next_non_empty ][ 'code' ] ) { |
|
2524 | 2524 | return false; |
2525 | 2525 | } |
2526 | 2526 | |
2527 | - if ( false === isset( $this->tokens[ $next_non_empty ]['parenthesis_closer'] ) ) { |
|
2527 | + if ( false === isset( $this->tokens[ $next_non_empty ][ 'parenthesis_closer' ] ) ) { |
|
2528 | 2528 | return false; |
2529 | 2529 | } |
2530 | 2530 | |
2531 | - $close_parenthesis = $this->tokens[ $next_non_empty ]['parenthesis_closer']; |
|
2531 | + $close_parenthesis = $this->tokens[ $next_non_empty ][ 'parenthesis_closer' ]; |
|
2532 | 2532 | $next_next_non_empty = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $next_non_empty + 1 ), ( $close_parenthesis + 1 ), true ); |
2533 | 2533 | |
2534 | 2534 | if ( $next_next_non_empty === $close_parenthesis ) { |
@@ -2599,67 +2599,67 @@ discard block |
||
2599 | 2599 | */ |
2600 | 2600 | |
2601 | 2601 | // Mark the beginning and end tokens. |
2602 | - if ( 'T_OPEN_SHORT_ARRAY' === $this->tokens[ $stackPtr ]['type'] ) { |
|
2602 | + if ( 'T_OPEN_SHORT_ARRAY' === $this->tokens[ $stackPtr ][ 'type' ] ) { |
|
2603 | 2603 | $opener = $stackPtr; |
2604 | - $closer = $this->tokens[ $stackPtr ]['bracket_closer']; |
|
2604 | + $closer = $this->tokens[ $stackPtr ][ 'bracket_closer' ]; |
|
2605 | 2605 | |
2606 | 2606 | $nestedParenthesisCount = 0; |
2607 | 2607 | } else { |
2608 | 2608 | $opener = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); |
2609 | - $closer = $this->tokens[ $opener ]['parenthesis_closer']; |
|
2609 | + $closer = $this->tokens[ $opener ][ 'parenthesis_closer' ]; |
|
2610 | 2610 | |
2611 | 2611 | $nestedParenthesisCount = 1; |
2612 | 2612 | } |
2613 | 2613 | |
2614 | 2614 | // Which nesting level is the one we are interested in ? |
2615 | - if ( isset( $this->tokens[ $opener ]['nested_parenthesis'] ) ) { |
|
2616 | - $nestedParenthesisCount += \count( $this->tokens[ $opener ]['nested_parenthesis'] ); |
|
2615 | + if ( isset( $this->tokens[ $opener ][ 'nested_parenthesis' ] ) ) { |
|
2616 | + $nestedParenthesisCount += \count( $this->tokens[ $opener ][ 'nested_parenthesis' ] ); |
|
2617 | 2617 | } |
2618 | 2618 | |
2619 | 2619 | $parameters = array(); |
2620 | 2620 | $next_comma = $opener; |
2621 | 2621 | $param_start = ( $opener + 1 ); |
2622 | 2622 | $cnt = 1; |
2623 | - while ( $next_comma = $this->phpcsFile->findNext( array( \T_COMMA, $this->tokens[ $closer ]['code'], \T_OPEN_SHORT_ARRAY, \T_CLOSURE ), ( $next_comma + 1 ), ( $closer + 1 ) ) ) { |
|
2623 | + while ( $next_comma = $this->phpcsFile->findNext( array( \T_COMMA, $this->tokens[ $closer ][ 'code' ], \T_OPEN_SHORT_ARRAY, \T_CLOSURE ), ( $next_comma + 1 ), ( $closer + 1 ) ) ) { |
|
2624 | 2624 | // Ignore anything within short array definition brackets. |
2625 | - if ( 'T_OPEN_SHORT_ARRAY' === $this->tokens[ $next_comma ]['type'] |
|
2626 | - && ( isset( $this->tokens[ $next_comma ]['bracket_opener'] ) |
|
2627 | - && $this->tokens[ $next_comma ]['bracket_opener'] === $next_comma ) |
|
2628 | - && isset( $this->tokens[ $next_comma ]['bracket_closer'] ) |
|
2625 | + if ( 'T_OPEN_SHORT_ARRAY' === $this->tokens[ $next_comma ][ 'type' ] |
|
2626 | + && ( isset( $this->tokens[ $next_comma ][ 'bracket_opener' ] ) |
|
2627 | + && $this->tokens[ $next_comma ][ 'bracket_opener' ] === $next_comma ) |
|
2628 | + && isset( $this->tokens[ $next_comma ][ 'bracket_closer' ] ) |
|
2629 | 2629 | ) { |
2630 | 2630 | // Skip forward to the end of the short array definition. |
2631 | - $next_comma = $this->tokens[ $next_comma ]['bracket_closer']; |
|
2631 | + $next_comma = $this->tokens[ $next_comma ][ 'bracket_closer' ]; |
|
2632 | 2632 | continue; |
2633 | 2633 | } |
2634 | 2634 | |
2635 | 2635 | // Skip past closures passed as function parameters. |
2636 | - if ( 'T_CLOSURE' === $this->tokens[ $next_comma ]['type'] |
|
2637 | - && ( isset( $this->tokens[ $next_comma ]['scope_condition'] ) |
|
2638 | - && $this->tokens[ $next_comma ]['scope_condition'] === $next_comma ) |
|
2639 | - && isset( $this->tokens[ $next_comma ]['scope_closer'] ) |
|
2636 | + if ( 'T_CLOSURE' === $this->tokens[ $next_comma ][ 'type' ] |
|
2637 | + && ( isset( $this->tokens[ $next_comma ][ 'scope_condition' ] ) |
|
2638 | + && $this->tokens[ $next_comma ][ 'scope_condition' ] === $next_comma ) |
|
2639 | + && isset( $this->tokens[ $next_comma ][ 'scope_closer' ] ) |
|
2640 | 2640 | ) { |
2641 | 2641 | // Skip forward to the end of the closure declaration. |
2642 | - $next_comma = $this->tokens[ $next_comma ]['scope_closer']; |
|
2642 | + $next_comma = $this->tokens[ $next_comma ][ 'scope_closer' ]; |
|
2643 | 2643 | continue; |
2644 | 2644 | } |
2645 | 2645 | |
2646 | 2646 | // Ignore comma's at a lower nesting level. |
2647 | - if ( \T_COMMA === $this->tokens[ $next_comma ]['code'] |
|
2648 | - && isset( $this->tokens[ $next_comma ]['nested_parenthesis'] ) |
|
2649 | - && \count( $this->tokens[ $next_comma ]['nested_parenthesis'] ) !== $nestedParenthesisCount |
|
2647 | + if ( \T_COMMA === $this->tokens[ $next_comma ][ 'code' ] |
|
2648 | + && isset( $this->tokens[ $next_comma ][ 'nested_parenthesis' ] ) |
|
2649 | + && \count( $this->tokens[ $next_comma ][ 'nested_parenthesis' ] ) !== $nestedParenthesisCount |
|
2650 | 2650 | ) { |
2651 | 2651 | continue; |
2652 | 2652 | } |
2653 | 2653 | |
2654 | 2654 | // Ignore closing parenthesis/bracket if not 'ours'. |
2655 | - if ( $this->tokens[ $next_comma ]['type'] === $this->tokens[ $closer ]['type'] && $next_comma !== $closer ) { |
|
2655 | + if ( $this->tokens[ $next_comma ][ 'type' ] === $this->tokens[ $closer ][ 'type' ] && $next_comma !== $closer ) { |
|
2656 | 2656 | continue; |
2657 | 2657 | } |
2658 | 2658 | |
2659 | 2659 | // Ok, we've reached the end of the parameter. |
2660 | - $parameters[ $cnt ]['start'] = $param_start; |
|
2661 | - $parameters[ $cnt ]['end'] = ( $next_comma - 1 ); |
|
2662 | - $parameters[ $cnt ]['raw'] = trim( $this->phpcsFile->getTokensAsString( $param_start, ( $next_comma - $param_start ) ) ); |
|
2660 | + $parameters[ $cnt ][ 'start' ] = $param_start; |
|
2661 | + $parameters[ $cnt ][ 'end' ] = ( $next_comma - 1 ); |
|
2662 | + $parameters[ $cnt ][ 'raw' ] = trim( $this->phpcsFile->getTokensAsString( $param_start, ( $next_comma - $param_start ) ) ); |
|
2663 | 2663 | |
2664 | 2664 | /* |
2665 | 2665 | * Check if there are more tokens before the closing parenthesis. |
@@ -2720,20 +2720,20 @@ discard block |
||
2720 | 2720 | /* |
2721 | 2721 | * Determine the array opener & closer. |
2722 | 2722 | */ |
2723 | - if ( \T_ARRAY === $this->tokens[ $stackPtr ]['code'] ) { |
|
2724 | - if ( isset( $this->tokens[ $stackPtr ]['parenthesis_opener'] ) ) { |
|
2725 | - $opener = $this->tokens[ $stackPtr ]['parenthesis_opener']; |
|
2723 | + if ( \T_ARRAY === $this->tokens[ $stackPtr ][ 'code' ] ) { |
|
2724 | + if ( isset( $this->tokens[ $stackPtr ][ 'parenthesis_opener' ] ) ) { |
|
2725 | + $opener = $this->tokens[ $stackPtr ][ 'parenthesis_opener' ]; |
|
2726 | 2726 | |
2727 | - if ( isset( $this->tokens[ $opener ]['parenthesis_closer'] ) ) { |
|
2728 | - $closer = $this->tokens[ $opener ]['parenthesis_closer']; |
|
2727 | + if ( isset( $this->tokens[ $opener ][ 'parenthesis_closer' ] ) ) { |
|
2728 | + $closer = $this->tokens[ $opener ][ 'parenthesis_closer' ]; |
|
2729 | 2729 | } |
2730 | 2730 | } |
2731 | 2731 | } else { |
2732 | 2732 | // Short array syntax. |
2733 | 2733 | $opener = $stackPtr; |
2734 | 2734 | |
2735 | - if ( isset( $this->tokens[ $stackPtr ]['bracket_closer'] ) ) { |
|
2736 | - $closer = $this->tokens[ $stackPtr ]['bracket_closer']; |
|
2735 | + if ( isset( $this->tokens[ $stackPtr ][ 'bracket_closer' ] ) ) { |
|
2736 | + $closer = $this->tokens[ $stackPtr ][ 'bracket_closer' ]; |
|
2737 | 2737 | } |
2738 | 2738 | } |
2739 | 2739 | |
@@ -2765,7 +2765,7 @@ discard block |
||
2765 | 2765 | } |
2766 | 2766 | |
2767 | 2767 | // Check for scoped namespace {}. |
2768 | - if ( ! empty( $this->tokens[ $stackPtr ]['conditions'] ) ) { |
|
2768 | + if ( ! empty( $this->tokens[ $stackPtr ][ 'conditions' ] ) ) { |
|
2769 | 2769 | $namespacePtr = $this->phpcsFile->getCondition( $stackPtr, \T_NAMESPACE ); |
2770 | 2770 | if ( false !== $namespacePtr ) { |
2771 | 2771 | $namespace = $this->get_declared_namespace_name( $namespacePtr ); |
@@ -2792,8 +2792,8 @@ discard block |
||
2792 | 2792 | $previousNSToken = $this->phpcsFile->findPrevious( \T_NAMESPACE, ( $previousNSToken - 1 ) ); |
2793 | 2793 | |
2794 | 2794 | // Stop if we encounter a scoped namespace declaration as we already know we're not in one. |
2795 | - if ( ! empty( $this->tokens[ $previousNSToken ]['scope_condition'] ) |
|
2796 | - && $this->tokens[ $previousNSToken ]['scope_condition'] === $previousNSToken |
|
2795 | + if ( ! empty( $this->tokens[ $previousNSToken ][ 'scope_condition' ] ) |
|
2796 | + && $this->tokens[ $previousNSToken ][ 'scope_condition' ] === $previousNSToken |
|
2797 | 2797 | ) { |
2798 | 2798 | break; |
2799 | 2799 | } |
@@ -2831,17 +2831,17 @@ discard block |
||
2831 | 2831 | return false; |
2832 | 2832 | } |
2833 | 2833 | |
2834 | - if ( \T_NAMESPACE !== $this->tokens[ $stackPtr ]['code'] ) { |
|
2834 | + if ( \T_NAMESPACE !== $this->tokens[ $stackPtr ][ 'code' ] ) { |
|
2835 | 2835 | return false; |
2836 | 2836 | } |
2837 | 2837 | |
2838 | 2838 | $nextToken = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true, null, true ); |
2839 | - if ( \T_NS_SEPARATOR === $this->tokens[ $nextToken ]['code'] ) { |
|
2839 | + if ( \T_NS_SEPARATOR === $this->tokens[ $nextToken ][ 'code' ] ) { |
|
2840 | 2840 | // Not a namespace declaration, but use of, i.e. `namespace\someFunction();`. |
2841 | 2841 | return false; |
2842 | 2842 | } |
2843 | 2843 | |
2844 | - if ( \T_OPEN_CURLY_BRACKET === $this->tokens[ $nextToken ]['code'] ) { |
|
2844 | + if ( \T_OPEN_CURLY_BRACKET === $this->tokens[ $nextToken ][ 'code' ] ) { |
|
2845 | 2845 | // Declaration for global namespace when using multiple namespaces in a file. |
2846 | 2846 | // I.e.: `namespace {}`. |
2847 | 2847 | return ''; |
@@ -2852,12 +2852,12 @@ discard block |
||
2852 | 2852 | \T_STRING => true, |
2853 | 2853 | \T_NS_SEPARATOR => true, |
2854 | 2854 | ); |
2855 | - $validTokens = $acceptedTokens + Tokens::$emptyTokens; |
|
2855 | + $validTokens = $acceptedTokens + Tokens::$emptyTokens; |
|
2856 | 2856 | |
2857 | 2857 | $namespaceName = ''; |
2858 | - while ( isset( $validTokens[ $this->tokens[ $nextToken ]['code'] ] ) ) { |
|
2859 | - if ( isset( $acceptedTokens[ $this->tokens[ $nextToken ]['code'] ] ) ) { |
|
2860 | - $namespaceName .= trim( $this->tokens[ $nextToken ]['content'] ); |
|
2858 | + while ( isset( $validTokens[ $this->tokens[ $nextToken ][ 'code' ] ] ) ) { |
|
2859 | + if ( isset( $acceptedTokens[ $this->tokens[ $nextToken ][ 'code' ] ] ) ) { |
|
2860 | + $namespaceName .= trim( $this->tokens[ $nextToken ][ 'content' ] ); |
|
2861 | 2861 | } |
2862 | 2862 | ++$nextToken; |
2863 | 2863 | } |
@@ -2875,7 +2875,7 @@ discard block |
||
2875 | 2875 | * @return bool |
2876 | 2876 | */ |
2877 | 2877 | public function is_class_constant( $stackPtr ) { |
2878 | - if ( ! isset( $this->tokens[ $stackPtr ] ) || \T_CONST !== $this->tokens[ $stackPtr ]['code'] ) { |
|
2878 | + if ( ! isset( $this->tokens[ $stackPtr ] ) || \T_CONST !== $this->tokens[ $stackPtr ][ 'code' ] ) { |
|
2879 | 2879 | return false; |
2880 | 2880 | } |
2881 | 2881 | |
@@ -2899,7 +2899,7 @@ discard block |
||
2899 | 2899 | * @return bool |
2900 | 2900 | */ |
2901 | 2901 | public function is_class_property( $stackPtr ) { |
2902 | - if ( ! isset( $this->tokens[ $stackPtr ] ) || \T_VARIABLE !== $this->tokens[ $stackPtr ]['code'] ) { |
|
2902 | + if ( ! isset( $this->tokens[ $stackPtr ] ) || \T_VARIABLE !== $this->tokens[ $stackPtr ][ 'code' ] ) { |
|
2903 | 2903 | return false; |
2904 | 2904 | } |
2905 | 2905 | |
@@ -2913,14 +2913,14 @@ discard block |
||
2913 | 2913 | $scopePtr = $this->valid_direct_scope( $stackPtr, $valid_scopes ); |
2914 | 2914 | if ( false !== $scopePtr ) { |
2915 | 2915 | // Make sure it's not a method parameter. |
2916 | - if ( empty( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
2916 | + if ( empty( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
2917 | 2917 | return true; |
2918 | 2918 | } else { |
2919 | - $parenthesis = array_keys( $this->tokens[ $stackPtr ]['nested_parenthesis'] ); |
|
2919 | + $parenthesis = array_keys( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ); |
|
2920 | 2920 | $deepest_open = array_pop( $parenthesis ); |
2921 | 2921 | if ( $deepest_open < $scopePtr |
2922 | - || isset( $this->tokens[ $deepest_open ]['parenthesis_owner'] ) === false |
|
2923 | - || \T_FUNCTION !== $this->tokens[ $this->tokens[ $deepest_open ]['parenthesis_owner'] ]['code'] |
|
2922 | + || isset( $this->tokens[ $deepest_open ][ 'parenthesis_owner' ] ) === false |
|
2923 | + || \T_FUNCTION !== $this->tokens[ $this->tokens[ $deepest_open ][ 'parenthesis_owner' ] ][ 'code' ] |
|
2924 | 2924 | ) { |
2925 | 2925 | return true; |
2926 | 2926 | } |
@@ -2947,21 +2947,21 @@ discard block |
||
2947 | 2947 | * @return int|bool StackPtr to the scope if valid, false otherwise. |
2948 | 2948 | */ |
2949 | 2949 | protected function valid_direct_scope( $stackPtr, array $valid_scopes ) { |
2950 | - if ( empty( $this->tokens[ $stackPtr ]['conditions'] ) ) { |
|
2950 | + if ( empty( $this->tokens[ $stackPtr ][ 'conditions' ] ) ) { |
|
2951 | 2951 | return false; |
2952 | 2952 | } |
2953 | 2953 | |
2954 | 2954 | /* |
2955 | 2955 | * Check only the direct wrapping scope of the token. |
2956 | 2956 | */ |
2957 | - $conditions = array_keys( $this->tokens[ $stackPtr ]['conditions'] ); |
|
2957 | + $conditions = array_keys( $this->tokens[ $stackPtr ][ 'conditions' ] ); |
|
2958 | 2958 | $ptr = array_pop( $conditions ); |
2959 | 2959 | |
2960 | 2960 | if ( ! isset( $this->tokens[ $ptr ] ) ) { |
2961 | 2961 | return false; |
2962 | 2962 | } |
2963 | 2963 | |
2964 | - if ( isset( $valid_scopes[ $this->tokens[ $ptr ]['type'] ] ) ) { |
|
2964 | + if ( isset( $valid_scopes[ $this->tokens[ $ptr ][ 'type' ] ] ) ) { |
|
2965 | 2965 | return $ptr; |
2966 | 2966 | } |
2967 | 2967 | |
@@ -2991,8 +2991,8 @@ discard block |
||
2991 | 2991 | protected function is_wpdb_method_call( $stackPtr, $target_methods ) { |
2992 | 2992 | |
2993 | 2993 | // Check for wpdb. |
2994 | - if ( ( \T_VARIABLE === $this->tokens[ $stackPtr ]['code'] && '$wpdb' !== $this->tokens[ $stackPtr ]['content'] ) |
|
2995 | - || ( \T_STRING === $this->tokens[ $stackPtr ]['code'] && 'wpdb' !== $this->tokens[ $stackPtr ]['content'] ) |
|
2994 | + if ( ( \T_VARIABLE === $this->tokens[ $stackPtr ][ 'code' ] && '$wpdb' !== $this->tokens[ $stackPtr ][ 'content' ] ) |
|
2995 | + || ( \T_STRING === $this->tokens[ $stackPtr ][ 'code' ] && 'wpdb' !== $this->tokens[ $stackPtr ][ 'content' ] ) |
|
2996 | 2996 | ) { |
2997 | 2997 | return false; |
2998 | 2998 | } |
@@ -3015,7 +3015,7 @@ discard block |
||
3015 | 3015 | return false; |
3016 | 3016 | } |
3017 | 3017 | |
3018 | - if ( \T_STRING === $this->tokens[ $methodPtr ]['code'] && property_exists( $this, 'methodPtr' ) ) { |
|
3018 | + if ( \T_STRING === $this->tokens[ $methodPtr ][ 'code' ] && property_exists( $this, 'methodPtr' ) ) { |
|
3019 | 3019 | $this->methodPtr = $methodPtr; |
3020 | 3020 | } |
3021 | 3021 | |
@@ -3030,21 +3030,21 @@ discard block |
||
3030 | 3030 | $this->i = $opening_paren; |
3031 | 3031 | } |
3032 | 3032 | |
3033 | - if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $opening_paren ]['code'] |
|
3034 | - || ! isset( $this->tokens[ $opening_paren ]['parenthesis_closer'] ) |
|
3033 | + if ( \T_OPEN_PARENTHESIS !== $this->tokens[ $opening_paren ][ 'code' ] |
|
3034 | + || ! isset( $this->tokens[ $opening_paren ][ 'parenthesis_closer' ] ) |
|
3035 | 3035 | ) { |
3036 | 3036 | return false; |
3037 | 3037 | } |
3038 | 3038 | |
3039 | 3039 | // Check that this is one of the methods that we are interested in. |
3040 | - if ( ! isset( $target_methods[ $this->tokens[ $methodPtr ]['content'] ] ) ) { |
|
3040 | + if ( ! isset( $target_methods[ $this->tokens[ $methodPtr ][ 'content' ] ] ) ) { |
|
3041 | 3041 | return false; |
3042 | 3042 | } |
3043 | 3043 | |
3044 | 3044 | // Find the end of the first parameter. |
3045 | 3045 | $end = $this->phpcsFile->findEndOfStatement( $opening_paren + 1 ); |
3046 | 3046 | |
3047 | - if ( \T_COMMA !== $this->tokens[ $end ]['code'] ) { |
|
3047 | + if ( \T_COMMA !== $this->tokens[ $end ][ 'code' ] ) { |
|
3048 | 3048 | ++$end; |
3049 | 3049 | } |
3050 | 3050 | |
@@ -3071,14 +3071,14 @@ discard block |
||
3071 | 3071 | } |
3072 | 3072 | |
3073 | 3073 | // Is this one of the tokens this function handles ? |
3074 | - if ( \T_STRING !== $this->tokens[ $stackPtr ]['code'] ) { |
|
3074 | + if ( \T_STRING !== $this->tokens[ $stackPtr ][ 'code' ] ) { |
|
3075 | 3075 | return false; |
3076 | 3076 | } |
3077 | 3077 | |
3078 | 3078 | $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $stackPtr + 1 ), null, true ); |
3079 | 3079 | if ( false !== $next |
3080 | - && ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ]['code'] |
|
3081 | - || \T_DOUBLE_COLON === $this->tokens[ $next ]['code'] ) |
|
3080 | + && ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ][ 'code' ] |
|
3081 | + || \T_DOUBLE_COLON === $this->tokens[ $next ][ 'code' ] ) |
|
3082 | 3082 | ) { |
3083 | 3083 | // Function call or declaration. |
3084 | 3084 | return false; |
@@ -3108,7 +3108,7 @@ discard block |
||
3108 | 3108 | |
3109 | 3109 | $prev = $this->phpcsFile->findPrevious( Tokens::$emptyTokens, ( $stackPtr - 1 ), null, true ); |
3110 | 3110 | if ( false !== $prev |
3111 | - && isset( $tokens_to_ignore[ $this->tokens[ $prev ]['type'] ] ) |
|
3111 | + && isset( $tokens_to_ignore[ $this->tokens[ $prev ][ 'type' ] ] ) |
|
3112 | 3112 | ) { |
3113 | 3113 | // Not the use of a constant. |
3114 | 3114 | return false; |
@@ -3120,7 +3120,7 @@ discard block |
||
3120 | 3120 | } |
3121 | 3121 | |
3122 | 3122 | if ( false !== $prev |
3123 | - && \T_CONST === $this->tokens[ $prev ]['code'] |
|
3123 | + && \T_CONST === $this->tokens[ $prev ][ 'code' ] |
|
3124 | 3124 | && $this->is_class_constant( $prev ) |
3125 | 3125 | ) { |
3126 | 3126 | // Class constant declaration of the same name. |
@@ -3131,17 +3131,17 @@ discard block |
||
3131 | 3131 | * Deal with a number of variations of use statements. |
3132 | 3132 | */ |
3133 | 3133 | for ( $i = $stackPtr; $i > 0; $i-- ) { |
3134 | - if ( $this->tokens[ $i ]['line'] !== $this->tokens[ $stackPtr ]['line'] ) { |
|
3134 | + if ( $this->tokens[ $i ][ 'line' ] !== $this->tokens[ $stackPtr ][ 'line' ] ) { |
|
3135 | 3135 | break; |
3136 | 3136 | } |
3137 | 3137 | } |
3138 | 3138 | |
3139 | 3139 | $firstOnLine = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); |
3140 | - if ( false !== $firstOnLine && \T_USE === $this->tokens[ $firstOnLine ]['code'] ) { |
|
3140 | + if ( false !== $firstOnLine && \T_USE === $this->tokens[ $firstOnLine ][ 'code' ] ) { |
|
3141 | 3141 | $nextOnLine = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $firstOnLine + 1 ), null, true ); |
3142 | 3142 | if ( false !== $nextOnLine ) { |
3143 | - if ( \T_STRING === $this->tokens[ $nextOnLine ]['code'] |
|
3144 | - && 'const' === $this->tokens[ $nextOnLine ]['content'] |
|
3143 | + if ( \T_STRING === $this->tokens[ $nextOnLine ][ 'code' ] |
|
3144 | + && 'const' === $this->tokens[ $nextOnLine ][ 'content' ] |
|
3145 | 3145 | ) { |
3146 | 3146 | $hasNsSep = $this->phpcsFile->findNext( \T_NS_SEPARATOR, ( $nextOnLine + 1 ), $stackPtr ); |
3147 | 3147 | if ( false !== $hasNsSep ) { |
@@ -3169,18 +3169,18 @@ discard block |
||
3169 | 3169 | * @return bool True if it is. False otherwise. |
3170 | 3170 | */ |
3171 | 3171 | protected function is_foreach_as( $stackPtr ) { |
3172 | - if ( ! isset( $this->tokens[ $stackPtr ]['nested_parenthesis'] ) ) { |
|
3172 | + if ( ! isset( $this->tokens[ $stackPtr ][ 'nested_parenthesis' ] ) ) { |
|
3173 | 3173 | return false; |
3174 | 3174 | } |
3175 | 3175 | |
3176 | - $nested_parenthesis = $this->tokens[ $stackPtr ]['nested_parenthesis']; |
|
3176 | + $nested_parenthesis = $this->tokens[ $stackPtr ][ 'nested_parenthesis' ]; |
|
3177 | 3177 | $close_parenthesis = end( $nested_parenthesis ); |
3178 | 3178 | $open_parenthesis = key( $nested_parenthesis ); |
3179 | - if ( ! isset( $this->tokens[ $close_parenthesis ]['parenthesis_owner'] ) ) { |
|
3179 | + if ( ! isset( $this->tokens[ $close_parenthesis ][ 'parenthesis_owner' ] ) ) { |
|
3180 | 3180 | return false; |
3181 | 3181 | } |
3182 | 3182 | |
3183 | - if ( \T_FOREACH !== $this->tokens[ $this->tokens[ $close_parenthesis ]['parenthesis_owner'] ]['code'] ) { |
|
3183 | + if ( \T_FOREACH !== $this->tokens[ $this->tokens[ $close_parenthesis ][ 'parenthesis_owner' ] ][ 'code' ] ) { |
|
3184 | 3184 | return false; |
3185 | 3185 | } |
3186 | 3186 |
@@ -150,7 +150,7 @@ |
||
150 | 150 | * |
151 | 151 | * @since 0.14.0 |
152 | 152 | * |
153 | - * @return array |
|
153 | + * @return integer[] |
|
154 | 154 | */ |
155 | 155 | public function register() { |
156 | 156 | return array( |
@@ -179,7 +179,7 @@ discard block |
||
179 | 179 | return; |
180 | 180 | } |
181 | 181 | |
182 | - $query = $parameters[1]; |
|
182 | + $query = $parameters[ 1 ]; |
|
183 | 183 | $text_string_tokens_found = false; |
184 | 184 | $variable_found = false; |
185 | 185 | $sql_wildcard_found = false; |
@@ -191,51 +191,51 @@ discard block |
||
191 | 191 | 'adjustment_count' => 0, |
192 | 192 | ); |
193 | 193 | |
194 | - for ( $i = $query['start']; $i <= $query['end']; $i++ ) { |
|
194 | + for ( $i = $query[ 'start' ]; $i <= $query[ 'end' ]; $i++ ) { |
|
195 | 195 | // Skip over groups of tokens if they are part of an inline function call. |
196 | 196 | if ( isset( $skip_from, $skip_to ) && $i >= $skip_from && $i < $skip_to ) { |
197 | 197 | $i = $skip_to; |
198 | 198 | continue; |
199 | 199 | } |
200 | 200 | |
201 | - if ( ! isset( Tokens::$textStringTokens[ $this->tokens[ $i ]['code'] ] ) ) { |
|
202 | - if ( \T_VARIABLE === $this->tokens[ $i ]['code'] ) { |
|
203 | - if ( '$wpdb' !== $this->tokens[ $i ]['content'] ) { |
|
201 | + if ( ! isset( Tokens::$textStringTokens[ $this->tokens[ $i ][ 'code' ] ] ) ) { |
|
202 | + if ( \T_VARIABLE === $this->tokens[ $i ][ 'code' ] ) { |
|
203 | + if ( '$wpdb' !== $this->tokens[ $i ][ 'content' ] ) { |
|
204 | 204 | $variable_found = true; |
205 | 205 | } |
206 | 206 | continue; |
207 | 207 | } |
208 | 208 | |
209 | 209 | // Detect a specific pattern for variable replacements in combination with `IN`. |
210 | - if ( \T_STRING === $this->tokens[ $i ]['code'] ) { |
|
210 | + if ( \T_STRING === $this->tokens[ $i ][ 'code' ] ) { |
|
211 | 211 | |
212 | - if ( 'sprintf' === strtolower( $this->tokens[ $i ]['content'] ) ) { |
|
212 | + if ( 'sprintf' === strtolower( $this->tokens[ $i ][ 'content' ] ) ) { |
|
213 | 213 | $sprintf_parameters = $this->get_function_call_parameters( $i ); |
214 | 214 | |
215 | 215 | if ( ! empty( $sprintf_parameters ) ) { |
216 | - $skip_from = ( $sprintf_parameters[1]['end'] + 1 ); |
|
216 | + $skip_from = ( $sprintf_parameters[ 1 ][ 'end' ] + 1 ); |
|
217 | 217 | $last_param = end( $sprintf_parameters ); |
218 | - $skip_to = ( $last_param['end'] + 1 ); |
|
218 | + $skip_to = ( $last_param[ 'end' ] + 1 ); |
|
219 | 219 | |
220 | - $valid_in_clauses['implode_fill'] += $this->analyse_sprintf( $sprintf_parameters ); |
|
221 | - $valid_in_clauses['adjustment_count'] += ( \count( $sprintf_parameters ) - 1 ); |
|
220 | + $valid_in_clauses[ 'implode_fill' ] += $this->analyse_sprintf( $sprintf_parameters ); |
|
221 | + $valid_in_clauses[ 'adjustment_count' ] += ( \count( $sprintf_parameters ) - 1 ); |
|
222 | 222 | } |
223 | 223 | unset( $sprintf_parameters, $last_param ); |
224 | 224 | |
225 | - } elseif ( 'implode' === strtolower( $this->tokens[ $i ]['content'] ) ) { |
|
225 | + } elseif ( 'implode' === strtolower( $this->tokens[ $i ][ 'content' ] ) ) { |
|
226 | 226 | $prev = $this->phpcsFile->findPrevious( |
227 | 227 | Tokens::$textStringTokens, |
228 | 228 | ( $i - 1 ), |
229 | - $query['start'] |
|
229 | + $query[ 'start' ] |
|
230 | 230 | ); |
231 | 231 | |
232 | - $prev_content = $this->strip_quotes( $this->tokens[ $prev ]['content'] ); |
|
233 | - $regex_quote = $this->get_regex_quote_snippet( $prev_content, $this->tokens[ $prev ]['content'] ); |
|
232 | + $prev_content = $this->strip_quotes( $this->tokens[ $prev ][ 'content' ] ); |
|
233 | + $regex_quote = $this->get_regex_quote_snippet( $prev_content, $this->tokens[ $prev ][ 'content' ] ); |
|
234 | 234 | |
235 | 235 | // Only examine the implode if preceded by an ` IN (`. |
236 | 236 | if ( preg_match( '`\s+IN\s*\(\s*(' . $regex_quote . ')?$`i', $prev_content, $match ) > 0 ) { |
237 | 237 | |
238 | - if ( isset( $match[1] ) && $regex_quote !== $this->regex_quote ) { |
|
238 | + if ( isset( $match[ 1 ] ) && $regex_quote !== $this->regex_quote ) { |
|
239 | 239 | $this->phpcsFile->addError( |
240 | 240 | 'Dynamic placeholder generation should not have surrounding quotes.', |
241 | 241 | $i, |
@@ -244,15 +244,15 @@ discard block |
||
244 | 244 | } |
245 | 245 | |
246 | 246 | if ( $this->analyse_implode( $i ) === true ) { |
247 | - ++$valid_in_clauses['uses_in']; |
|
248 | - ++$valid_in_clauses['implode_fill']; |
|
247 | + ++$valid_in_clauses[ 'uses_in' ]; |
|
248 | + ++$valid_in_clauses[ 'implode_fill' ]; |
|
249 | 249 | |
250 | 250 | $next = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $i + 1 ), null, true ); |
251 | - if ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ]['code'] |
|
252 | - && isset( $this->tokens[ $next ]['parenthesis_closer'] ) |
|
251 | + if ( \T_OPEN_PARENTHESIS === $this->tokens[ $next ][ 'code' ] |
|
252 | + && isset( $this->tokens[ $next ][ 'parenthesis_closer' ] ) |
|
253 | 253 | ) { |
254 | 254 | $skip_from = ( $i + 1 ); |
255 | - $skip_to = ( $this->tokens[ $next ]['parenthesis_closer'] + 1 ); |
|
255 | + $skip_to = ( $this->tokens[ $next ][ 'parenthesis_closer' ] + 1 ); |
|
256 | 256 | } |
257 | 257 | } |
258 | 258 | } |
@@ -264,16 +264,16 @@ discard block |
||
264 | 264 | } |
265 | 265 | |
266 | 266 | $text_string_tokens_found = true; |
267 | - $content = $this->tokens[ $i ]['content']; |
|
267 | + $content = $this->tokens[ $i ][ 'content' ]; |
|
268 | 268 | |
269 | 269 | $regex_quote = $this->regex_quote; |
270 | - if ( isset( Tokens::$stringTokens[ $this->tokens[ $i ]['code'] ] ) ) { |
|
270 | + if ( isset( Tokens::$stringTokens[ $this->tokens[ $i ][ 'code' ] ] ) ) { |
|
271 | 271 | $content = $this->strip_quotes( $content ); |
272 | - $regex_quote = $this->get_regex_quote_snippet( $content, $this->tokens[ $i ]['content'] ); |
|
272 | + $regex_quote = $this->get_regex_quote_snippet( $content, $this->tokens[ $i ][ 'content' ] ); |
|
273 | 273 | } |
274 | 274 | |
275 | - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $i ]['code'] |
|
276 | - || \T_HEREDOC === $this->tokens[ $i ]['code'] |
|
275 | + if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $i ][ 'code' ] |
|
276 | + || \T_HEREDOC === $this->tokens[ $i ][ 'code' ] |
|
277 | 277 | ) { |
278 | 278 | // Only interested in actual query text, so strip out variables. |
279 | 279 | $stripped_content = $this->strip_interpolated_variables( $content ); |
@@ -305,23 +305,23 @@ discard block |
||
305 | 305 | $regex = '`\s+LIKE\s*(?:(' . $regex_quote . ')(?!%s(?:\1|$))(?P<content>.*?)(?:\1|$)|(?:concat\((?![^\)]*%s[^\)]*\))(?P<concat>[^\)]*))\))`i'; |
306 | 306 | if ( preg_match_all( $regex, $content, $matches ) > 0 ) { |
307 | 307 | $walk = array(); |
308 | - if ( ! empty( $matches['content'] ) ) { |
|
309 | - $matches['content'] = array_filter( $matches['content'] ); |
|
310 | - if ( ! empty( $matches['content'] ) ) { |
|
311 | - $walk[] = 'content'; |
|
308 | + if ( ! empty( $matches[ 'content' ] ) ) { |
|
309 | + $matches[ 'content' ] = array_filter( $matches[ 'content' ] ); |
|
310 | + if ( ! empty( $matches[ 'content' ] ) ) { |
|
311 | + $walk[ ] = 'content'; |
|
312 | 312 | } |
313 | 313 | } |
314 | - if ( ! empty( $matches['concat'] ) ) { |
|
315 | - $matches['concat'] = array_filter( $matches['concat'] ); |
|
316 | - if ( ! empty( $matches['concat'] ) ) { |
|
317 | - $walk[] = 'concat'; |
|
314 | + if ( ! empty( $matches[ 'concat' ] ) ) { |
|
315 | + $matches[ 'concat' ] = array_filter( $matches[ 'concat' ] ); |
|
316 | + if ( ! empty( $matches[ 'concat' ] ) ) { |
|
317 | + $walk[ ] = 'concat'; |
|
318 | 318 | } |
319 | 319 | } |
320 | 320 | |
321 | 321 | if ( ! empty( $walk ) ) { |
322 | 322 | foreach ( $walk as $match_key ) { |
323 | 323 | foreach ( $matches[ $match_key ] as $index => $match ) { |
324 | - $data = array( $matches[0][ $index ] ); |
|
324 | + $data = array( $matches[ 0 ][ $index ] ); |
|
325 | 325 | |
326 | 326 | // Both a `%` as well as a `_` are wildcards in SQL. |
327 | 327 | if ( strpos( $match, '%' ) === false && strpos( $match, '_' ) === false ) { |
@@ -370,8 +370,8 @@ discard block |
||
370 | 370 | * Analyse the query for unsupported placeholders. |
371 | 371 | */ |
372 | 372 | if ( preg_match_all( self::UNSUPPORTED_PLACEHOLDER_REGEX, $content, $matches ) > 0 ) { |
373 | - if ( ! empty( $matches[0] ) ) { |
|
374 | - foreach ( $matches[0] as $match ) { |
|
373 | + if ( ! empty( $matches[ 0 ] ) ) { |
|
374 | + foreach ( $matches[ 0 ] as $match ) { |
|
375 | 375 | if ( '%' === $match ) { |
376 | 376 | $this->phpcsFile->addError( |
377 | 377 | 'Found unescaped literal "%%" character.', |
@@ -397,8 +397,8 @@ discard block |
||
397 | 397 | */ |
398 | 398 | $regex = '`(' . $regex_quote . ')%[dfFs]\1`'; |
399 | 399 | if ( preg_match_all( $regex, $content, $matches ) > 0 ) { |
400 | - if ( ! empty( $matches[0] ) ) { |
|
401 | - foreach ( $matches[0] as $match ) { |
|
400 | + if ( ! empty( $matches[ 0 ] ) ) { |
|
401 | + foreach ( $matches[ 0 ] as $match ) { |
|
402 | 402 | $this->phpcsFile->addError( |
403 | 403 | 'Simple placeholders should not be quoted in the query string in $wpdb->prepare(). Found: %s.', |
404 | 404 | $i, |
@@ -415,8 +415,8 @@ discard block |
||
415 | 415 | */ |
416 | 416 | $regex = '`(?<!' . $regex_quote . ')' . self::PREPARE_PLACEHOLDER_REGEX . '(?!' . $regex_quote . ')`x'; |
417 | 417 | if ( preg_match_all( $regex, $content, $matches ) > 0 ) { |
418 | - if ( ! empty( $matches[0] ) ) { |
|
419 | - foreach ( $matches[0] as $match ) { |
|
418 | + if ( ! empty( $matches[ 0 ] ) ) { |
|
419 | + foreach ( $matches[ 0 ] as $match ) { |
|
420 | 420 | if ( preg_match( '`%[dfFs]`', $match ) !== 1 ) { |
421 | 421 | $this->phpcsFile->addWarning( |
422 | 422 | 'Complex placeholders used for values in the query string in $wpdb->prepare() will NOT be quoted automagically. Found: %s.', |
@@ -435,7 +435,7 @@ discard block |
||
435 | 435 | */ |
436 | 436 | $found_in = preg_match_all( '`\s+IN\s*\(\s*%s\s*\)`i', $content, $matches ); |
437 | 437 | if ( $found_in > 0 ) { |
438 | - $valid_in_clauses['uses_in'] += $found_in; |
|
438 | + $valid_in_clauses[ 'uses_in' ] += $found_in; |
|
439 | 439 | } |
440 | 440 | unset( $found_in ); |
441 | 441 | } |
@@ -465,7 +465,7 @@ discard block |
||
465 | 465 | 'UnnecessaryPrepare' |
466 | 466 | ); |
467 | 467 | } |
468 | - } elseif ( false === $count_diff_whitelisted && 0 === $valid_in_clauses['uses_in'] ) { |
|
468 | + } elseif ( false === $count_diff_whitelisted && 0 === $valid_in_clauses[ 'uses_in' ] ) { |
|
469 | 469 | $this->phpcsFile->addWarning( |
470 | 470 | 'Replacement variables found, but no valid placeholders found in the query.', |
471 | 471 | $i, |
@@ -494,28 +494,28 @@ discard block |
||
494 | 494 | array_shift( $replacements ); // Remove the query. |
495 | 495 | |
496 | 496 | // The parameters may have been passed as an array in parameter 2. |
497 | - if ( isset( $parameters[2] ) && 2 === $total_parameters ) { |
|
497 | + if ( isset( $parameters[ 2 ] ) && 2 === $total_parameters ) { |
|
498 | 498 | $next = $this->phpcsFile->findNext( |
499 | 499 | Tokens::$emptyTokens, |
500 | - $parameters[2]['start'], |
|
501 | - ( $parameters[2]['end'] + 1 ), |
|
500 | + $parameters[ 2 ][ 'start' ], |
|
501 | + ( $parameters[ 2 ][ 'end' ] + 1 ), |
|
502 | 502 | true |
503 | 503 | ); |
504 | 504 | |
505 | 505 | if ( false !== $next |
506 | - && ( \T_ARRAY === $this->tokens[ $next ]['code'] |
|
507 | - || \T_OPEN_SHORT_ARRAY === $this->tokens[ $next ]['code'] ) |
|
506 | + && ( \T_ARRAY === $this->tokens[ $next ][ 'code' ] |
|
507 | + || \T_OPEN_SHORT_ARRAY === $this->tokens[ $next ][ 'code' ] ) |
|
508 | 508 | ) { |
509 | 509 | $replacements = $this->get_function_call_parameters( $next ); |
510 | 510 | } |
511 | 511 | } |
512 | 512 | |
513 | 513 | $total_replacements = \count( $replacements ); |
514 | - $total_placeholders -= $valid_in_clauses['adjustment_count']; |
|
514 | + $total_placeholders -= $valid_in_clauses[ 'adjustment_count' ]; |
|
515 | 515 | |
516 | 516 | // Bow out when `IN` clauses have been used which appear to be correct. |
517 | - if ( $valid_in_clauses['uses_in'] > 0 |
|
518 | - && $valid_in_clauses['uses_in'] === $valid_in_clauses['implode_fill'] |
|
517 | + if ( $valid_in_clauses[ 'uses_in' ] > 0 |
|
518 | + && $valid_in_clauses[ 'uses_in' ] === $valid_in_clauses[ 'implode_fill' ] |
|
519 | 519 | && 1 === $total_replacements |
520 | 520 | ) { |
521 | 521 | return; |
@@ -553,7 +553,7 @@ discard block |
||
553 | 553 | $regex_quote = $this->regex_quote; |
554 | 554 | |
555 | 555 | if ( $original_content !== $stripped_content ) { |
556 | - $quote_style = $original_content[0]; |
|
556 | + $quote_style = $original_content[ 0 ]; |
|
557 | 557 | |
558 | 558 | if ( '"' === $quote_style ) { |
559 | 559 | $regex_quote = '\\\\"|\''; |
@@ -581,21 +581,21 @@ discard block |
||
581 | 581 | protected function analyse_sprintf( $sprintf_params ) { |
582 | 582 | $found = 0; |
583 | 583 | |
584 | - unset( $sprintf_params[1] ); |
|
584 | + unset( $sprintf_params[ 1 ] ); |
|
585 | 585 | |
586 | 586 | foreach ( $sprintf_params as $sprintf_param ) { |
587 | - if ( strpos( strtolower( $sprintf_param['raw'] ), 'implode' ) === false ) { |
|
587 | + if ( strpos( strtolower( $sprintf_param[ 'raw' ] ), 'implode' ) === false ) { |
|
588 | 588 | continue; |
589 | 589 | } |
590 | 590 | |
591 | 591 | $implode = $this->phpcsFile->findNext( |
592 | 592 | Tokens::$emptyTokens, |
593 | - $sprintf_param['start'], |
|
594 | - $sprintf_param['end'], |
|
593 | + $sprintf_param[ 'start' ], |
|
594 | + $sprintf_param[ 'end' ], |
|
595 | 595 | true |
596 | 596 | ); |
597 | - if ( \T_STRING === $this->tokens[ $implode ]['code'] |
|
598 | - && 'implode' === strtolower( $this->tokens[ $implode ]['content'] ) |
|
597 | + if ( \T_STRING === $this->tokens[ $implode ][ 'code' ] |
|
598 | + && 'implode' === strtolower( $this->tokens[ $implode ][ 'content' ] ) |
|
599 | 599 | ) { |
600 | 600 | if ( $this->analyse_implode( $implode ) === true ) { |
601 | 601 | ++$found; |
@@ -628,23 +628,23 @@ discard block |
||
628 | 628 | return false; |
629 | 629 | } |
630 | 630 | |
631 | - if ( preg_match( '`^(["\']), ?\1$`', $implode_params[1]['raw'] ) !== 1 ) { |
|
631 | + if ( preg_match( '`^(["\']), ?\1$`', $implode_params[ 1 ][ 'raw' ] ) !== 1 ) { |
|
632 | 632 | return false; |
633 | 633 | } |
634 | 634 | |
635 | - if ( strpos( strtolower( $implode_params[2]['raw'] ), 'array_fill' ) === false ) { |
|
635 | + if ( strpos( strtolower( $implode_params[ 2 ][ 'raw' ] ), 'array_fill' ) === false ) { |
|
636 | 636 | return false; |
637 | 637 | } |
638 | 638 | |
639 | 639 | $array_fill = $this->phpcsFile->findNext( |
640 | 640 | Tokens::$emptyTokens, |
641 | - $implode_params[2]['start'], |
|
642 | - $implode_params[2]['end'], |
|
641 | + $implode_params[ 2 ][ 'start' ], |
|
642 | + $implode_params[ 2 ][ 'end' ], |
|
643 | 643 | true |
644 | 644 | ); |
645 | 645 | |
646 | - if ( \T_STRING !== $this->tokens[ $array_fill ]['code'] |
|
647 | - || 'array_fill' !== strtolower( $this->tokens[ $array_fill ]['content'] ) |
|
646 | + if ( \T_STRING !== $this->tokens[ $array_fill ][ 'code' ] |
|
647 | + || 'array_fill' !== strtolower( $this->tokens[ $array_fill ][ 'content' ] ) |
|
648 | 648 | ) { |
649 | 649 | return false; |
650 | 650 | } |
@@ -655,7 +655,7 @@ discard block |
||
655 | 655 | return false; |
656 | 656 | } |
657 | 657 | |
658 | - return (bool) preg_match( '`^(["\'])%[dfFs]\1$`', $array_fill_params[3]['raw'] ); |
|
658 | + return (bool)preg_match( '`^(["\'])%[dfFs]\1$`', $array_fill_params[ 3 ][ 'raw' ] ); |
|
659 | 659 | } |
660 | 660 | |
661 | 661 | } |
@@ -98,7 +98,7 @@ |
||
98 | 98 | * |
99 | 99 | * @since 0.8.0 |
100 | 100 | * |
101 | - * @return array |
|
101 | + * @return integer[] |
|
102 | 102 | */ |
103 | 103 | public function register() { |
104 | 104 |
@@ -132,17 +132,17 @@ discard block |
||
132 | 132 | |
133 | 133 | for ( $this->i; $this->i < $this->end; $this->i++ ) { |
134 | 134 | |
135 | - if ( isset( $this->ignored_tokens[ $this->tokens[ $this->i ]['code'] ] ) ) { |
|
135 | + if ( isset( $this->ignored_tokens[ $this->tokens[ $this->i ][ 'code' ] ] ) ) { |
|
136 | 136 | continue; |
137 | 137 | } |
138 | 138 | |
139 | - if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $this->i ]['code'] |
|
140 | - || \T_HEREDOC === $this->tokens[ $this->i ]['code'] |
|
139 | + if ( \T_DOUBLE_QUOTED_STRING === $this->tokens[ $this->i ][ 'code' ] |
|
140 | + || \T_HEREDOC === $this->tokens[ $this->i ][ 'code' ] |
|
141 | 141 | ) { |
142 | 142 | |
143 | 143 | $bad_variables = array_filter( |
144 | - $this->get_interpolated_variables( $this->tokens[ $this->i ]['content'] ), |
|
145 | - function ( $symbol ) { |
|
144 | + $this->get_interpolated_variables( $this->tokens[ $this->i ][ 'content' ] ), |
|
145 | + function( $symbol ) { |
|
146 | 146 | return ( 'wpdb' !== $symbol ); |
147 | 147 | } |
148 | 148 | ); |
@@ -154,15 +154,15 @@ discard block |
||
154 | 154 | 'InterpolatedNotPrepared', |
155 | 155 | array( |
156 | 156 | $bad_variable, |
157 | - $this->tokens[ $this->i ]['content'], |
|
157 | + $this->tokens[ $this->i ][ 'content' ], |
|
158 | 158 | ) |
159 | 159 | ); |
160 | 160 | } |
161 | 161 | continue; |
162 | 162 | } |
163 | 163 | |
164 | - if ( \T_VARIABLE === $this->tokens[ $this->i ]['code'] ) { |
|
165 | - if ( '$wpdb' === $this->tokens[ $this->i ]['content'] ) { |
|
164 | + if ( \T_VARIABLE === $this->tokens[ $this->i ][ 'code' ] ) { |
|
165 | + if ( '$wpdb' === $this->tokens[ $this->i ][ 'content' ] ) { |
|
166 | 166 | $this->is_wpdb_method_call( $this->i, $this->methods ); |
167 | 167 | continue; |
168 | 168 | } |
@@ -172,25 +172,25 @@ discard block |
||
172 | 172 | } |
173 | 173 | } |
174 | 174 | |
175 | - if ( \T_STRING === $this->tokens[ $this->i ]['code'] ) { |
|
175 | + if ( \T_STRING === $this->tokens[ $this->i ][ 'code' ] ) { |
|
176 | 176 | |
177 | 177 | if ( |
178 | - isset( $this->SQLEscapingFunctions[ $this->tokens[ $this->i ]['content'] ] ) |
|
179 | - || isset( $this->SQLAutoEscapedFunctions[ $this->tokens[ $this->i ]['content'] ] ) |
|
178 | + isset( $this->SQLEscapingFunctions[ $this->tokens[ $this->i ][ 'content' ] ] ) |
|
179 | + || isset( $this->SQLAutoEscapedFunctions[ $this->tokens[ $this->i ][ 'content' ] ] ) |
|
180 | 180 | ) { |
181 | 181 | |
182 | 182 | // Find the opening parenthesis. |
183 | 183 | $opening_paren = $this->phpcsFile->findNext( Tokens::$emptyTokens, ( $this->i + 1 ), null, true, null, true ); |
184 | 184 | |
185 | 185 | if ( false !== $opening_paren |
186 | - && \T_OPEN_PARENTHESIS === $this->tokens[ $opening_paren ]['code'] |
|
187 | - && isset( $this->tokens[ $opening_paren ]['parenthesis_closer'] ) |
|
186 | + && \T_OPEN_PARENTHESIS === $this->tokens[ $opening_paren ][ 'code' ] |
|
187 | + && isset( $this->tokens[ $opening_paren ][ 'parenthesis_closer' ] ) |
|
188 | 188 | ) { |
189 | 189 | // Skip past the end of the function. |
190 | - $this->i = $this->tokens[ $opening_paren ]['parenthesis_closer']; |
|
190 | + $this->i = $this->tokens[ $opening_paren ][ 'parenthesis_closer' ]; |
|
191 | 191 | continue; |
192 | 192 | } |
193 | - } elseif ( isset( $this->formattingFunctions[ $this->tokens[ $this->i ]['content'] ] ) ) { |
|
193 | + } elseif ( isset( $this->formattingFunctions[ $this->tokens[ $this->i ][ 'content' ] ] ) ) { |
|
194 | 194 | continue; |
195 | 195 | } |
196 | 196 | } |
@@ -199,7 +199,7 @@ discard block |
||
199 | 199 | 'Use placeholders and $wpdb->prepare(); found %s', |
200 | 200 | $this->i, |
201 | 201 | 'NotPrepared', |
202 | - array( $this->tokens[ $this->i ]['content'] ) |
|
202 | + array( $this->tokens[ $this->i ][ 'content' ] ) |
|
203 | 203 | ); |
204 | 204 | } |
205 | 205 |