Skip to content

Commit b71f8d7

Browse files
committed
DeclareStrictTypesSniff: Clean options
1 parent 6e44b36 commit b71f8d7

7 files changed

+64
-67
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ Enforces having `declare(strict_types = 1)` at the top of each PHP file. Allows
9999

100100
Sniff provides the following settings:
101101

102-
* `newlinesCountBeforeDeclare`: allows to set 0 to N newlines to be between `<?php` and `declare`
103-
* `newlinesCountAfterDeclare`: allows to set 0 to N newlines to be between `declare` and next statement
102+
* `declareOnFirstLine`: requires `declare` on the first line right after `<?php`
103+
* `linesCountBeforeDeclare`: allows to set 0 to N lines to be between `declare` and previous statement. This option is ignored when `declareOnFirstLine` is enabled.
104+
* `linesCountAfterDeclare`: allows to set 0 to N lines to be between `declare` and next statement
104105
* `spacesCountAroundEqualsSign`: allows to set number of required spaces around the `=` operator
105106

106107
#### SlevomatCodingStandard.Arrays.DisallowImplicitArrayCreation

SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,14 @@ class DeclareStrictTypesSniff implements Sniff
2828

2929
public const CODE_INCORRECT_WHITESPACE_AFTER_DECLARE = 'IncorrectWhitespaceAfterDeclare';
3030

31+
/** @var bool */
32+
public $declareOnFirstLine = false;
33+
3134
/** @var int */
32-
public $newlinesCountBeforeDeclare = 0;
35+
public $linesCountBeforeDeclare = 1;
3336

3437
/** @var int */
35-
public $newlinesCountAfterDeclare = 2;
38+
public $linesCountAfterDeclare = 1;
3639

3740
/** @var int */
3841
public $spacesCountAroundEqualsSign = 1;
@@ -159,8 +162,8 @@ public function process(File $phpcsFile, $openTagPointer): void
159162
$whitespaceBefore .= TokenHelper::getContent($phpcsFile, $pointerBeforeDeclare + 1, $declarePointer - 1);
160163
}
161164

162-
$requiredNewlinesCountBeforeDeclare = SniffSettingsHelper::normalizeInteger($this->newlinesCountBeforeDeclare);
163-
if ($requiredNewlinesCountBeforeDeclare === 0) {
165+
$requiredLinesCountBeforeDeclare = SniffSettingsHelper::normalizeInteger($this->linesCountBeforeDeclare);
166+
if ($this->declareOnFirstLine) {
164167
if ($whitespaceBefore !== ' ') {
165168
$fix = $phpcsFile->addFixableError(
166169
'There must be a single space between the PHP open tag and declare statement.',
@@ -177,13 +180,14 @@ public function process(File $phpcsFile, $openTagPointer): void
177180
}
178181
}
179182
} else {
180-
$newlinesCountBefore = substr_count($whitespaceBefore, $phpcsFile->eolChar);
181-
if ($newlinesCountBefore !== $requiredNewlinesCountBeforeDeclare) {
183+
$newLinesCountBefore = substr_count($whitespaceBefore, $phpcsFile->eolChar);
184+
$linesCountBefore = $newLinesCountBefore > 0 ? $newLinesCountBefore - 1 : 0;
185+
if ($linesCountBefore !== $requiredLinesCountBeforeDeclare) {
182186
$fix = $phpcsFile->addFixableError(
183187
sprintf(
184-
'Expected %d newlines before declare statement, found %d.',
185-
$requiredNewlinesCountBeforeDeclare,
186-
$newlinesCountBefore
188+
'Expected %d lines before declare statement, found %d.',
189+
$requiredLinesCountBeforeDeclare,
190+
$linesCountBefore
187191
),
188192
$declarePointer,
189193
self::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE
@@ -198,7 +202,7 @@ public function process(File $phpcsFile, $openTagPointer): void
198202
for ($i = $pointerBeforeDeclare + 1; $i < $declarePointer; $i++) {
199203
$phpcsFile->fixer->replaceToken($i, '');
200204
}
201-
for ($i = 0; $i < $requiredNewlinesCountBeforeDeclare; $i++) {
205+
for ($i = 0; $i <= $requiredLinesCountBeforeDeclare; $i++) {
202206
$phpcsFile->fixer->addNewline($pointerBeforeDeclare);
203207
}
204208
$phpcsFile->fixer->endChangeset();
@@ -215,18 +219,19 @@ public function process(File $phpcsFile, $openTagPointer): void
215219

216220
$whitespaceAfter = TokenHelper::getContent($phpcsFile, $declareSemicolonPointer + 1, $pointerAfterWhitespaceEnd - 1);
217221

218-
$requiredNewlinesCountAfter = SniffSettingsHelper::normalizeInteger($this->newlinesCountAfterDeclare);
219-
$newlinesCountAfter = substr_count($whitespaceAfter, $phpcsFile->eolChar);
222+
$requiredLinesCountAfter = SniffSettingsHelper::normalizeInteger($this->linesCountAfterDeclare);
223+
$newLinesAfter = substr_count($whitespaceAfter, $phpcsFile->eolChar);
224+
$linesCountAfter = $newLinesAfter > 0 ? $newLinesAfter - 1 : 0;
220225

221-
if ($newlinesCountAfter === $requiredNewlinesCountAfter) {
226+
if ($linesCountAfter === $requiredLinesCountAfter) {
222227
return;
223228
}
224229

225230
$fix = $phpcsFile->addFixableError(
226231
sprintf(
227-
'Expected %d newlines after declare statement, found %d.',
228-
$requiredNewlinesCountAfter,
229-
$newlinesCountAfter
232+
'Expected %d lines after declare statement, found %d.',
233+
$requiredLinesCountAfter,
234+
$linesCountAfter
230235
),
231236
$declarePointer,
232237
self::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE
@@ -239,7 +244,7 @@ public function process(File $phpcsFile, $openTagPointer): void
239244
for ($i = $declareSemicolonPointer + 1; $i < $pointerAfterWhitespaceEnd; $i++) {
240245
$phpcsFile->fixer->replaceToken($i, '');
241246
}
242-
for ($i = 0; $i < $requiredNewlinesCountAfter; $i++) {
247+
for ($i = 0; $i <= $requiredLinesCountAfter; $i++) {
243248
$phpcsFile->fixer->addNewline($declareSemicolonPointer);
244249
}
245250
$phpcsFile->fixer->endChangeset();

build/phpcs-consistence.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@
131131
<rule ref="SlevomatCodingStandard.Namespaces.UseFromSameNamespace"/>
132132
<rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
133133
<properties>
134-
<property name="newlinesCountBeforeDeclare" value="2"/>
134+
<property name="linesCountBeforeDeclare" value="1"/>
135135
</properties>
136136
</rule>
137137
<rule ref="SlevomatCodingStandard.TypeHints.LongTypeHints"/>

build/phpcs.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@
279279
</rule>
280280
<rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
281281
<properties>
282-
<property name="newlinesCountBeforeDeclare" value="0"/>
282+
<property name="declareOnFirstLine" value="true"/>
283283
</properties>
284284
</rule>
285285
<rule ref="SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint">

tests/Sniffs/TypeHints/DeclareStrictTypesSniffTest.php

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ class DeclareStrictTypesSniffTest extends TestCase
99

1010
public function testMultipleOpenTagsInFile(): void
1111
{
12-
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesMultipleOpenTags.php');
12+
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesMultipleOpenTags.php', [
13+
'declareOnFirstLine' => true,
14+
]);
1315
self::assertNoSniffErrorInFile($report);
1416
}
1517

@@ -79,7 +81,9 @@ public function testDeclareStrictTypesIncorrectFormat(string $file): void
7981

8082
public function testEmptyFile(): void
8183
{
82-
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesEmptyFile.php');
84+
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesEmptyFile.php', [
85+
'declareOnFirstLine' => true,
86+
]);
8387
self::assertNoSniffErrorInFile($report);
8488
}
8589

@@ -94,14 +98,16 @@ public function testDeclareStrictTypesIncorrectFormatNoSpaces(): void
9498
public function testDeclareStrictTwoNewlinesBefore(): void
9599
{
96100
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesBefore.php', [
97-
'newlinesCountBeforeDeclare' => ' 2 ',
101+
'linesCountBeforeDeclare' => ' 1 ',
98102
]);
99103
self::assertNoSniffErrorInFile($report);
100104
}
101105

102106
public function testDeclareStrictTwoNewlinesBeforeError(): void
103107
{
104-
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesBeforeError.php');
108+
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesBeforeError.php', [
109+
'declareOnFirstLine' => true,
110+
]);
105111
self::assertSniffError(
106112
$report,
107113
3,
@@ -113,7 +119,7 @@ public function testDeclareStrictTwoNewlinesBeforeError(): void
113119
public function testDeclareStrictTwoNewlinesAfter(): void
114120
{
115121
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesAfter.php', [
116-
'newlinesCountAfterDeclare' => ' 2 ',
122+
'linesCountAfterDeclare' => ' 1 ',
117123
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
118124
self::assertNoSniffErrorInFile($report);
119125
}
@@ -125,91 +131,103 @@ public function testDeclareStrictTwoNewlinesAfterError(): void
125131
$report,
126132
3,
127133
DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE,
128-
'Expected 2 newlines after declare statement, found 1.'
134+
'Expected 1 lines after declare statement, found 0.'
129135
);
130136
}
131137

132138
public function testDeclareStrictOneSpaceError(): void
133139
{
134140
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesOneSpaceError.php', [
135-
'newlinesCountBeforeDeclare' => '2',
141+
'linesCountBeforeDeclare' => '1',
136142
]);
137143
self::assertSniffError(
138144
$report,
139145
1,
140146
DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE,
141-
'Expected 2 newlines before declare statement, found 0.'
147+
'Expected 1 lines before declare statement, found 0.'
142148
);
143149
}
144150

145151
public function testDeclareStrictOneSpace(): void
146152
{
147-
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesOneSpace.php');
153+
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesOneSpace.php', [
154+
'declareOnFirstLine' => true,
155+
]);
148156
self::assertNoSniffErrorInFile($report);
149157
}
150158

151159
public function testDeclareStrictWithFileCommentAbove(): void
152160
{
153161
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesWithFileCommentAbove.php', [
154-
'newlinesCountBeforeDeclare' => 2,
162+
'linesCountBeforeDeclare' => 1,
155163
]);
156164
self::assertNoSniffErrorInFile($report);
157165
}
158166

159167
public function testDeclareStrictWithTicks(): void
160168
{
161-
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesWithTicks.php');
169+
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesWithTicks.php', [
170+
'declareOnFirstLine' => true,
171+
]);
162172
self::assertNoSniffErrorInFile($report);
163173
}
164174

165175
public function testFixableNoNewLinesBefore(): void
166176
{
167177
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesNoNewLinesBefore.php', [
168-
'newlinesCountBeforeDeclare' => 0,
178+
'declareOnFirstLine' => true,
169179
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
170180
self::assertAllFixedInFile($report);
171181
}
172182

173183
public function testFixableMissingNoNewLines(): void
174184
{
175185
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMissingNoNewLines.php', [
176-
'newlinesCountBeforeDeclare' => 0,
186+
'declareOnFirstLine' => true,
177187
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
178188
self::assertAllFixedInFile($report);
179189
}
180190

181191
public function testFixableOneNewLineBefore(): void
182192
{
183193
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesOneNewLineBefore.php', [
184-
'newlinesCountBeforeDeclare' => 1,
194+
'linesCountBeforeDeclare' => 0,
185195
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
186196
self::assertAllFixedInFile($report);
187197
}
188198

189199
public function testFixableMissingOneNewLine(): void
190200
{
191201
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMissingOneNewLine.php', [
192-
'newlinesCountBeforeDeclare' => 1,
202+
'linesCountBeforeDeclare' => 0,
193203
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
194204
self::assertAllFixedInFile($report);
195205
}
196206

197207
public function testFixableMoreNewLinesBefore(): void
198208
{
199209
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMoreNewLinesBefore.php', [
200-
'newlinesCountBeforeDeclare' => 4,
210+
'linesCountBeforeDeclare' => 3,
201211
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
202212
self::assertAllFixedInFile($report);
203213
}
204214

205215
public function testFixableMissingMoreNewLines(): void
206216
{
207217
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMissingMoreNewLines.php', [
208-
'newlinesCountBeforeDeclare' => 4,
218+
'linesCountBeforeDeclare' => 3,
209219
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
210220
self::assertAllFixedInFile($report);
211221
}
212222

223+
public function testFixableCommentBefore(): void
224+
{
225+
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesCommentBefore.php', [
226+
'linesCountBeforeDeclare' => 1,
227+
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
228+
self::assertAllFixedInFile($report);
229+
}
230+
213231
public function testFixableMissingIncorrectFormatOneSpace(): void
214232
{
215233
$report = self::checkFile(
@@ -259,33 +277,17 @@ public function testFixableDisabled(): void
259277
public function testFixableOneNewLineAfter(): void
260278
{
261279
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesOneNewLineAfter.php', [
262-
'newlinesCountAfterDeclare' => 2,
263-
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
264-
self::assertAllFixedInFile($report);
265-
}
266-
267-
public function testFixableNoNewLinesAfter(): void
268-
{
269-
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesNoNewLinesAfter.php', [
270-
'newlinesCountAfterDeclare' => 0,
280+
'linesCountAfterDeclare' => 1,
271281
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
272282
self::assertAllFixedInFile($report);
273283
}
274284

275285
public function testFixableMoreNewLinesAfter(): void
276286
{
277287
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMoreNewLinesAfter.php', [
278-
'newlinesCountAfterDeclare' => 4,
288+
'linesCountAfterDeclare' => 3,
279289
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
280290
self::assertAllFixedInFile($report);
281291
}
282292

283-
public function testFixableCommentBefore(): void
284-
{
285-
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesCommentBefore.php', [
286-
'newlinesCountBeforeDeclare' => 2,
287-
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
288-
self::assertAllFixedInFile($report);
289-
}
290-
291293
}

tests/Sniffs/TypeHints/data/fixableDeclareStrictTypesNoNewLinesAfter.fixed.php

Lines changed: 0 additions & 4 deletions
This file was deleted.

tests/Sniffs/TypeHints/data/fixableDeclareStrictTypesNoNewLinesAfter.php

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)