Skip to content

Commit

Permalink
DeclareStrictTypesSniff: Clean options
Browse files Browse the repository at this point in the history
  • Loading branch information
kukulich committed Nov 27, 2020
1 parent 6e44b36 commit b71f8d7
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 67 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,9 @@ Enforces having `declare(strict_types = 1)` at the top of each PHP file. Allows

Sniff provides the following settings:

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

#### SlevomatCodingStandard.Arrays.DisallowImplicitArrayCreation
Expand Down
39 changes: 22 additions & 17 deletions SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,14 @@ class DeclareStrictTypesSniff implements Sniff

public const CODE_INCORRECT_WHITESPACE_AFTER_DECLARE = 'IncorrectWhitespaceAfterDeclare';

/** @var bool */
public $declareOnFirstLine = false;

/** @var int */
public $newlinesCountBeforeDeclare = 0;
public $linesCountBeforeDeclare = 1;

/** @var int */
public $newlinesCountAfterDeclare = 2;
public $linesCountAfterDeclare = 1;

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

$requiredNewlinesCountBeforeDeclare = SniffSettingsHelper::normalizeInteger($this->newlinesCountBeforeDeclare);
if ($requiredNewlinesCountBeforeDeclare === 0) {
$requiredLinesCountBeforeDeclare = SniffSettingsHelper::normalizeInteger($this->linesCountBeforeDeclare);
if ($this->declareOnFirstLine) {
if ($whitespaceBefore !== ' ') {
$fix = $phpcsFile->addFixableError(
'There must be a single space between the PHP open tag and declare statement.',
Expand All @@ -177,13 +180,14 @@ public function process(File $phpcsFile, $openTagPointer): void
}
}
} else {
$newlinesCountBefore = substr_count($whitespaceBefore, $phpcsFile->eolChar);
if ($newlinesCountBefore !== $requiredNewlinesCountBeforeDeclare) {
$newLinesCountBefore = substr_count($whitespaceBefore, $phpcsFile->eolChar);
$linesCountBefore = $newLinesCountBefore > 0 ? $newLinesCountBefore - 1 : 0;
if ($linesCountBefore !== $requiredLinesCountBeforeDeclare) {
$fix = $phpcsFile->addFixableError(
sprintf(
'Expected %d newlines before declare statement, found %d.',
$requiredNewlinesCountBeforeDeclare,
$newlinesCountBefore
'Expected %d lines before declare statement, found %d.',
$requiredLinesCountBeforeDeclare,
$linesCountBefore
),
$declarePointer,
self::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE
Expand All @@ -198,7 +202,7 @@ public function process(File $phpcsFile, $openTagPointer): void
for ($i = $pointerBeforeDeclare + 1; $i < $declarePointer; $i++) {
$phpcsFile->fixer->replaceToken($i, '');
}
for ($i = 0; $i < $requiredNewlinesCountBeforeDeclare; $i++) {
for ($i = 0; $i <= $requiredLinesCountBeforeDeclare; $i++) {
$phpcsFile->fixer->addNewline($pointerBeforeDeclare);
}
$phpcsFile->fixer->endChangeset();
Expand All @@ -215,18 +219,19 @@ public function process(File $phpcsFile, $openTagPointer): void

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

$requiredNewlinesCountAfter = SniffSettingsHelper::normalizeInteger($this->newlinesCountAfterDeclare);
$newlinesCountAfter = substr_count($whitespaceAfter, $phpcsFile->eolChar);
$requiredLinesCountAfter = SniffSettingsHelper::normalizeInteger($this->linesCountAfterDeclare);
$newLinesAfter = substr_count($whitespaceAfter, $phpcsFile->eolChar);
$linesCountAfter = $newLinesAfter > 0 ? $newLinesAfter - 1 : 0;

if ($newlinesCountAfter === $requiredNewlinesCountAfter) {
if ($linesCountAfter === $requiredLinesCountAfter) {
return;
}

$fix = $phpcsFile->addFixableError(
sprintf(
'Expected %d newlines after declare statement, found %d.',
$requiredNewlinesCountAfter,
$newlinesCountAfter
'Expected %d lines after declare statement, found %d.',
$requiredLinesCountAfter,
$linesCountAfter
),
$declarePointer,
self::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE
Expand All @@ -239,7 +244,7 @@ public function process(File $phpcsFile, $openTagPointer): void
for ($i = $declareSemicolonPointer + 1; $i < $pointerAfterWhitespaceEnd; $i++) {
$phpcsFile->fixer->replaceToken($i, '');
}
for ($i = 0; $i < $requiredNewlinesCountAfter; $i++) {
for ($i = 0; $i <= $requiredLinesCountAfter; $i++) {
$phpcsFile->fixer->addNewline($declareSemicolonPointer);
}
$phpcsFile->fixer->endChangeset();
Expand Down
2 changes: 1 addition & 1 deletion build/phpcs-consistence.xml
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@
<rule ref="SlevomatCodingStandard.Namespaces.UseFromSameNamespace"/>
<rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
<properties>
<property name="newlinesCountBeforeDeclare" value="2"/>
<property name="linesCountBeforeDeclare" value="1"/>
</properties>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.LongTypeHints"/>
Expand Down
2 changes: 1 addition & 1 deletion build/phpcs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.DeclareStrictTypes">
<properties>
<property name="newlinesCountBeforeDeclare" value="0"/>
<property name="declareOnFirstLine" value="true"/>
</properties>
</rule>
<rule ref="SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint">
Expand Down
72 changes: 37 additions & 35 deletions tests/Sniffs/TypeHints/DeclareStrictTypesSniffTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ class DeclareStrictTypesSniffTest extends TestCase

public function testMultipleOpenTagsInFile(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesMultipleOpenTags.php');
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesMultipleOpenTags.php', [
'declareOnFirstLine' => true,
]);
self::assertNoSniffErrorInFile($report);
}

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

public function testEmptyFile(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesEmptyFile.php');
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesEmptyFile.php', [
'declareOnFirstLine' => true,
]);
self::assertNoSniffErrorInFile($report);
}

Expand All @@ -94,14 +98,16 @@ public function testDeclareStrictTypesIncorrectFormatNoSpaces(): void
public function testDeclareStrictTwoNewlinesBefore(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesBefore.php', [
'newlinesCountBeforeDeclare' => ' 2 ',
'linesCountBeforeDeclare' => ' 1 ',
]);
self::assertNoSniffErrorInFile($report);
}

public function testDeclareStrictTwoNewlinesBeforeError(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesBeforeError.php');
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesBeforeError.php', [
'declareOnFirstLine' => true,
]);
self::assertSniffError(
$report,
3,
Expand All @@ -113,7 +119,7 @@ public function testDeclareStrictTwoNewlinesBeforeError(): void
public function testDeclareStrictTwoNewlinesAfter(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesTwoNewlinesAfter.php', [
'newlinesCountAfterDeclare' => ' 2 ',
'linesCountAfterDeclare' => ' 1 ',
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
self::assertNoSniffErrorInFile($report);
}
Expand All @@ -125,91 +131,103 @@ public function testDeclareStrictTwoNewlinesAfterError(): void
$report,
3,
DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE,
'Expected 2 newlines after declare statement, found 1.'
'Expected 1 lines after declare statement, found 0.'
);
}

public function testDeclareStrictOneSpaceError(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesOneSpaceError.php', [
'newlinesCountBeforeDeclare' => '2',
'linesCountBeforeDeclare' => '1',
]);
self::assertSniffError(
$report,
1,
DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE,
'Expected 2 newlines before declare statement, found 0.'
'Expected 1 lines before declare statement, found 0.'
);
}

public function testDeclareStrictOneSpace(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesOneSpace.php');
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesOneSpace.php', [
'declareOnFirstLine' => true,
]);
self::assertNoSniffErrorInFile($report);
}

public function testDeclareStrictWithFileCommentAbove(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesWithFileCommentAbove.php', [
'newlinesCountBeforeDeclare' => 2,
'linesCountBeforeDeclare' => 1,
]);
self::assertNoSniffErrorInFile($report);
}

public function testDeclareStrictWithTicks(): void
{
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesWithTicks.php');
$report = self::checkFile(__DIR__ . '/data/declareStrictTypesWithTicks.php', [
'declareOnFirstLine' => true,
]);
self::assertNoSniffErrorInFile($report);
}

public function testFixableNoNewLinesBefore(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesNoNewLinesBefore.php', [
'newlinesCountBeforeDeclare' => 0,
'declareOnFirstLine' => true,
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableMissingNoNewLines(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMissingNoNewLines.php', [
'newlinesCountBeforeDeclare' => 0,
'declareOnFirstLine' => true,
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableOneNewLineBefore(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesOneNewLineBefore.php', [
'newlinesCountBeforeDeclare' => 1,
'linesCountBeforeDeclare' => 0,
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableMissingOneNewLine(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMissingOneNewLine.php', [
'newlinesCountBeforeDeclare' => 1,
'linesCountBeforeDeclare' => 0,
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableMoreNewLinesBefore(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMoreNewLinesBefore.php', [
'newlinesCountBeforeDeclare' => 4,
'linesCountBeforeDeclare' => 3,
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableMissingMoreNewLines(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMissingMoreNewLines.php', [
'newlinesCountBeforeDeclare' => 4,
'linesCountBeforeDeclare' => 3,
], [DeclareStrictTypesSniff::CODE_DECLARE_STRICT_TYPES_MISSING, DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableCommentBefore(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesCommentBefore.php', [
'linesCountBeforeDeclare' => 1,
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableMissingIncorrectFormatOneSpace(): void
{
$report = self::checkFile(
Expand Down Expand Up @@ -259,33 +277,17 @@ public function testFixableDisabled(): void
public function testFixableOneNewLineAfter(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesOneNewLineAfter.php', [
'newlinesCountAfterDeclare' => 2,
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableNoNewLinesAfter(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesNoNewLinesAfter.php', [
'newlinesCountAfterDeclare' => 0,
'linesCountAfterDeclare' => 1,
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableMoreNewLinesAfter(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesMoreNewLinesAfter.php', [
'newlinesCountAfterDeclare' => 4,
'linesCountAfterDeclare' => 3,
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_AFTER_DECLARE]);
self::assertAllFixedInFile($report);
}

public function testFixableCommentBefore(): void
{
$report = self::checkFile(__DIR__ . '/data/fixableDeclareStrictTypesCommentBefore.php', [
'newlinesCountBeforeDeclare' => 2,
], [DeclareStrictTypesSniff::CODE_INCORRECT_WHITESPACE_BEFORE_DECLARE]);
self::assertAllFixedInFile($report);
}

}

This file was deleted.

This file was deleted.

0 comments on commit b71f8d7

Please sign in to comment.