Skip to content

Commit a54c619

Browse files
committed
Added fixes for errors
1 parent 64ed03a commit a54c619

File tree

6 files changed

+172
-45
lines changed

6 files changed

+172
-45
lines changed

CodeSniffer/Standards/Generic/Sniffs/ControlStructures/InlineControlStructureSniff.php

+67-22
Original file line numberDiff line numberDiff line change
@@ -81,36 +81,81 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
8181
{
8282
$tokens = $phpcsFile->getTokens();
8383

84-
if (isset($tokens[$stackPtr]['scope_opener']) === false) {
85-
// Ignore the ELSE in ELSE IF. We'll process the IF part later.
86-
if (($tokens[$stackPtr]['code'] === T_ELSE) && ($tokens[($stackPtr + 2)]['code'] === T_IF)) {
87-
return;
88-
}
84+
if (isset($tokens[$stackPtr]['scope_opener']) === true) {
85+
return;
86+
}
8987

90-
if ($tokens[$stackPtr]['code'] === T_WHILE) {
91-
// This could be from a DO WHILE, which doesn't have an opening brace.
92-
$lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true);
93-
if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) {
94-
$brace = $tokens[$lastContent];
95-
if (isset($brace['scope_condition']) === true) {
96-
$condition = $tokens[$brace['scope_condition']];
97-
if ($condition['code'] === T_DO) {
98-
return;
99-
}
88+
// Ignore the ELSE in ELSE IF. We'll process the IF part later.
89+
if (($tokens[$stackPtr]['code'] === T_ELSE) && ($tokens[($stackPtr + 2)]['code'] === T_IF)) {
90+
return;
91+
}
92+
93+
if ($tokens[$stackPtr]['code'] === T_WHILE) {
94+
// This could be from a DO WHILE, which doesn't have an opening brace.
95+
$lastContent = $phpcsFile->findPrevious(T_WHITESPACE, ($stackPtr - 1), null, true);
96+
if ($tokens[$lastContent]['code'] === T_CLOSE_CURLY_BRACKET) {
97+
$brace = $tokens[$lastContent];
98+
if (isset($brace['scope_condition']) === true) {
99+
$condition = $tokens[$brace['scope_condition']];
100+
if ($condition['code'] === T_DO) {
101+
return;
100102
}
101103
}
102104
}
105+
}
106+
107+
// This is a control structure without an opening brace,
108+
// so it is an inline statement.
109+
if ($this->error === true) {
110+
$fix = $phpcsFile->addFixableError('Inline control structures are not allowed', $stackPtr, 'NotAllowed');
111+
} else {
112+
$fix = $phpcsFile->addFixableWarning('Inline control structures are discouraged', $stackPtr, 'Discouraged');
113+
}
114+
115+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
116+
$phpcsFile->fixer->beginChangeset();
117+
if (isset($tokens[$stackPtr]['parenthesis_closer']) === true) {
118+
$closer = $tokens[$stackPtr]['parenthesis_closer'];
119+
} else {
120+
$closer = $stackPtr;
121+
}
122+
123+
$phpcsFile->fixer->addContent($closer, ' { ');
103124

104-
// This is a control structure without an opening brace,
105-
// so it is an inline statement.
106-
if ($this->error === true) {
107-
$phpcsFile->addError('Inline control structures are not allowed', $stackPtr, 'NotAllowed');
125+
$semicolon = $phpcsFile->findNext(T_SEMICOLON, ($closer + 1));
126+
$next = $phpcsFile->findNext(T_WHITESPACE, ($closer + 1), ($semicolon + 1), true);
127+
128+
// Account for a comment on the end of the line.
129+
for ($endLine = $semicolon; $endLine < $phpcsFile->numTokens; $endLine++) {
130+
if (isset($tokens[($endLine + 1)]) === false
131+
|| $tokens[$endLine]['line'] !== $tokens[($endLine + 1)]['line']
132+
) {
133+
break;
134+
}
135+
}
136+
137+
if ($tokens[$endLine]['code'] !== T_COMMENT) {
138+
$endLine = $semicolon;
139+
}
140+
141+
if ($next !== $semicolon) {
142+
if ($endLine !== $semicolon) {
143+
$phpcsFile->fixer->addContent($endLine, '}');
144+
} else {
145+
$phpcsFile->fixer->addContent($semicolon, ' }');
146+
}
108147
} else {
109-
$phpcsFile->addWarning('Inline control structures are discouraged', $stackPtr, 'Discouraged');
148+
if ($endLine !== $semicolon) {
149+
$phpcsFile->fixer->replaceToken($semicolon, '');
150+
$phpcsFile->fixer->addNewlineBefore($endLine);
151+
$phpcsFile->fixer->addContent($endLine, '}');
152+
} else {
153+
$phpcsFile->fixer->replaceToken($semicolon, '}');
154+
}
110155
}
111156

112-
return;
113-
}//end if
157+
$phpcsFile->fixer->endChangeset();
158+
}
114159

115160
}//end process()
116161

CodeSniffer/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.inc

+10
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,14 @@ foreach ($array as $element) :
3939
echo 'hello';
4040
endforeach;
4141

42+
while (!$this->readLine($tokens, $tag));
43+
while (!$this->readLine($tokens, $tag)); //skip to end of file
44+
45+
foreach ($cookies as $cookie)
46+
if ($cookie->match($uri, $matchSessionCookies, $now))
47+
$ret[] = $cookie;
48+
49+
foreach ($stringParade as $hit)
50+
$hitParade[] = $hit + 0; //cast to integer
51+
4252
?>

CodeSniffer/Standards/Generic/Tests/ControlStructures/InlineControlStructureUnitTest.php

+5
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ public function getErrorList($testFile='InlineControlStructureUnitTest.inc')
5454
15 => 1,
5555
17 => 1,
5656
23 => 1,
57+
42 => 1,
58+
43 => 1,
59+
45 => 1,
60+
46 => 1,
61+
49 => 1,
5762
);
5863
break;
5964
case 'InlineControlStructureUnitTest.js':

CodeSniffer/Standards/PSR2/Sniffs/ControlStructures/SwitchDeclarationSniff.php

+8-2
Original file line numberDiff line numberDiff line change
@@ -102,14 +102,20 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
102102
|| $tokens[($nextCase + 1)]['content'] !== ' ')
103103
) {
104104
$error = 'CASE keyword must be followed by a single space';
105-
$phpcsFile->addError($error, $nextCase, 'SpacingAfterCase');
105+
$fix = $phpcsFile->addFixableError($error, $nextCase, 'SpacingAfterCase');
106+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
107+
$phpcsFile->fixer->addContent($nextCase, ' ');
108+
}
106109
}
107110

108111
$opener = $tokens[$nextCase]['scope_opener'];
109112
if ($tokens[$opener]['code'] === T_COLON) {
110113
if ($tokens[($opener - 1)]['code'] === T_WHITESPACE) {
111114
$error = 'There must be no space before the colon in a '.strtoupper($type).' statement';
112-
$phpcsFile->addError($error, $nextCase, 'SpaceBeforeColon'.$type);
115+
$fix = $phpcsFile->addFixableError($error, $nextCase, 'SpaceBeforeColon'.strtoupper($type));
116+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
117+
$phpcsFile->fixer->replaceToken(($opener - 1), '');
118+
}
113119
}
114120
} else {
115121
$error = strtoupper($type).' statements must not be defined using curly braces';

CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForEachLoopDeclarationSniff.php

+45-11
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,18 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
6161

6262
if ($tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) {
6363
$error = 'Space found after opening bracket of FOREACH loop';
64-
$phpcsFile->addError($error, $stackPtr, 'SpaceAfterOpen');
64+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceAfterOpen');
65+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
66+
$phpcsFile->fixer->replaceToken(($openingBracket + 1), '');
67+
}
6568
}
6669

6770
if ($tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) {
6871
$error = 'Space found before closing bracket of FOREACH loop';
69-
$phpcsFile->addError($error, $stackPtr, 'SpaceBeforeClose');
72+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpaceBeforeClose');
73+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
74+
$phpcsFile->fixer->replaceToken(($closingBracket - 1), '');
75+
}
7076
}
7177

7278
$asToken = $phpcsFile->findNext(T_AS, $openingBracket);
@@ -78,34 +84,50 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
7884
$expected,
7985
$content,
8086
);
81-
$phpcsFile->addError($error, $stackPtr, 'AsNotLower', $data);
87+
88+
$fix = $phpcsFile->addFixableError($error, $asToken, 'AsNotLower', $data);
89+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
90+
$phpcsFile->fixer->replaceToken($asToken, $expected);
91+
}
8292
}
8393

8494
$doubleArrow = $phpcsFile->findNext(T_DOUBLE_ARROW, $openingBracket, $closingBracket);
8595

8696
if ($doubleArrow !== false) {
8797
if ($tokens[($doubleArrow - 1)]['code'] !== T_WHITESPACE) {
8898
$error = 'Expected 1 space before "=>"; 0 found';
89-
$phpcsFile->addError($error, $stackPtr, 'NoSpaceBeforeArrow');
99+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeArrow');
100+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
101+
$phpcsFile->fixer->addContentBefore($doubleArrow, ' ');
102+
}
90103
} else {
91104
if (strlen($tokens[($doubleArrow - 1)]['content']) !== 1) {
92105
$spaces = strlen($tokens[($doubleArrow - 1)]['content']);
93106
$error = 'Expected 1 space before "=>"; %s found';
94107
$data = array($spaces);
95-
$phpcsFile->addError($error, $stackPtr, 'SpacingBeforeArrow', $data);
108+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeArrow', $data);
109+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
110+
$phpcsFile->fixer->replaceToken(($doubleArrow - 1), ' ');
111+
}
96112
}
97113

98114
}
99115

100116
if ($tokens[($doubleArrow + 1)]['code'] !== T_WHITESPACE) {
101117
$error = 'Expected 1 space after "=>"; 0 found';
102-
$phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterArrow');
118+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterArrow');
119+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
120+
$phpcsFile->fixer->addContent($doubleArrow, ' ');
121+
}
103122
} else {
104123
if (strlen($tokens[($doubleArrow + 1)]['content']) !== 1) {
105124
$spaces = strlen($tokens[($doubleArrow + 1)]['content']);
106125
$error = 'Expected 1 space after "=>"; %s found';
107126
$data = array($spaces);
108-
$phpcsFile->addError($error, $stackPtr, 'SpacingAfterArrow', $data);
127+
$phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterArrow', $data);
128+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
129+
$phpcsFile->fixer->replaceToken(($doubleArrow + 1), ' ');
130+
}
109131
}
110132

111133
}
@@ -114,25 +136,37 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
114136

115137
if ($tokens[($asToken - 1)]['code'] !== T_WHITESPACE) {
116138
$error = 'Expected 1 space before "as"; 0 found';
117-
$phpcsFile->addError($error, $stackPtr, 'NoSpaceBeforeAs');
139+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceBeforeAs');
140+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
141+
$phpcsFile->fixer->addContentBefore($asToken, ' ');
142+
}
118143
} else {
119144
if (strlen($tokens[($asToken - 1)]['content']) !== 1) {
120145
$spaces = strlen($tokens[($asToken - 1)]['content']);
121146
$error = 'Expected 1 space before "as"; %s found';
122147
$data = array($spaces);
123-
$phpcsFile->addError($error, $stackPtr, 'SpacingBeforeAs', $data);
148+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeAs', $data);
149+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
150+
$phpcsFile->fixer->replaceToken(($asToken - 1), ' ');
151+
}
124152
}
125153
}
126154

127155
if ($tokens[($asToken + 1)]['code'] !== T_WHITESPACE) {
128156
$error = 'Expected 1 space after "as"; 0 found';
129-
$phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterAs');
157+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterAs');
158+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
159+
$phpcsFile->fixer->addContent($asToken, ' ');
160+
}
130161
} else {
131162
if (strlen($tokens[($asToken + 1)]['content']) !== 1) {
132163
$spaces = strlen($tokens[($asToken + 1)]['content']);
133164
$error = 'Expected 1 space after "as"; %s found';
134165
$data = array($spaces);
135-
$phpcsFile->addError($error, $stackPtr, 'SpacingAfterAs', $data);
166+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterAs', $data);
167+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
168+
$phpcsFile->fixer->replaceToken(($asToken + 1), ' ');
169+
}
136170
}
137171
}
138172

CodeSniffer/Standards/Squiz/Sniffs/ControlStructures/ForLoopDeclarationSniff.php

+37-10
Original file line numberDiff line numberDiff line change
@@ -77,32 +77,47 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
7777

7878
if ($tokens[($openingBracket + 1)]['code'] === T_WHITESPACE) {
7979
$error = 'Space found after opening bracket of FOR loop';
80-
$phpcsFile->addError($error, $stackPtr, 'SpacingAfterOpen');
80+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterOpen');
81+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
82+
$phpcsFile->fixer->replaceToken(($openingBracket + 1), '');
83+
}
8184
}
8285

8386
if ($tokens[($closingBracket - 1)]['code'] === T_WHITESPACE) {
8487
$error = 'Space found before closing bracket of FOR loop';
85-
$phpcsFile->addError($error, $stackPtr, 'SpacingBeforeClose');
88+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeClose');
89+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
90+
$phpcsFile->fixer->replaceToken(($closingBracket - 1), '');
91+
}
8692
}
8793

88-
$firstSemicolon = $phpcsFile->findNext(T_SEMICOLON, $openingBracket, $closingBracket);
94+
$firstSemicolon = $phpcsFile->findNext(T_SEMICOLON, $openingBracket, $closingBracket);
8995

9096
// Check whitespace around each of the tokens.
9197
if ($firstSemicolon !== false) {
9298
if ($tokens[($firstSemicolon - 1)]['code'] === T_WHITESPACE) {
9399
$error = 'Space found before first semicolon of FOR loop';
94-
$phpcsFile->addError($error, $stackPtr, 'SpacingBeforeFirst');
100+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeFirst');
101+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
102+
$phpcsFile->fixer->replaceToken(($firstSemicolon - 1), '');
103+
}
95104
}
96105

97106
if ($tokens[($firstSemicolon + 1)]['code'] !== T_WHITESPACE) {
98107
$error = 'Expected 1 space after first semicolon of FOR loop; 0 found';
99-
$phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterFirst');
108+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterFirst');
109+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
110+
$phpcsFile->fixer->addContent($firstSemicolon, ' ');
111+
}
100112
} else {
101113
if (strlen($tokens[($firstSemicolon + 1)]['content']) !== 1) {
102114
$spaces = strlen($tokens[($firstSemicolon + 1)]['content']);
103115
$error = 'Expected 1 space after first semicolon of FOR loop; %s found';
104116
$data = array($spaces);
105-
$phpcsFile->addError($error, $stackPtr, 'SpacingAfterFirst', $data);
117+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterFirst', $data);
118+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
119+
$phpcsFile->fixer->replaceToken(($firstSemicolon + 1), ' ');
120+
}
106121
}
107122
}
108123

@@ -111,24 +126,36 @@ public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
111126
if ($secondSemicolon !== false) {
112127
if ($tokens[($secondSemicolon - 1)]['code'] === T_WHITESPACE) {
113128
$error = 'Space found before second semicolon of FOR loop';
114-
$phpcsFile->addError($error, $stackPtr, 'SpacingBeforeSecond');
129+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingBeforeSecond');
130+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
131+
$phpcsFile->fixer->replaceToken(($secondSemicolon - 1), '');
132+
}
115133
}
116134

117135
if (($secondSemicolon + 1) !== $closingBracket
118136
&& $tokens[($secondSemicolon + 1)]['code'] !== T_WHITESPACE
119137
) {
120138
$error = 'Expected 1 space after second semicolon of FOR loop; 0 found';
121-
$phpcsFile->addError($error, $stackPtr, 'NoSpaceAfterSecond');
139+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'NoSpaceAfterSecond');
140+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
141+
$phpcsFile->fixer->addContent($secondSemicolon, ' ');
142+
}
122143
} else {
123144
if (strlen($tokens[($secondSemicolon + 1)]['content']) !== 1) {
124145
$spaces = strlen($tokens[($secondSemicolon + 1)]['content']);
125146
$data = array($spaces);
126147
if (($secondSemicolon + 2) === $closingBracket) {
127148
$error = 'Expected no space after second semicolon of FOR loop; %s found';
128-
$phpcsFile->addError($error, $stackPtr, 'SpacingAfterSecondNoThird', $data);
149+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterSecondNoThird', $data);
150+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
151+
$phpcsFile->fixer->replaceToken(($secondSemicolon + 1), '');
152+
}
129153
} else {
130154
$error = 'Expected 1 space after second semicolon of FOR loop; %s found';
131-
$phpcsFile->addError($error, $stackPtr, 'SpacingAfterSecond', $data);
155+
$fix = $phpcsFile->addFixableError($error, $stackPtr, 'SpacingAfterSecond', $data);
156+
if ($fix === true && $phpcsFile->fixer->enabled === true) {
157+
$phpcsFile->fixer->replaceToken(($secondSemicolon + 1), ' ');
158+
}
132159
}
133160
}
134161
}

0 commit comments

Comments
 (0)