From bf55f29a3f146146745c4c3c43c2cfea64af64ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20Hansl=C3=ADk?= Date: Fri, 24 Jun 2022 13:25:03 +0200 Subject: [PATCH] SlevomatCodingStandard.Classes.ForbiddenPublicProperty: New option "checkPromoted" to enable check of promoted properties --- README.md | 4 ++++ .../Classes/ForbiddenPublicPropertySniff.php | 5 ++++- .../ForbiddenPublicPropertySniffTest.php | 21 +++++++++++++++++++ .../data/forbiddenPublicPropertyNoErrors.php | 6 +++++- .../forbiddenPublicPropertyPromotedErrors.php | 18 ++++++++++++++++ ...orbiddenPublicPropertyPromotedNoErrors.php | 8 +++++++ 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedErrors.php create mode 100644 tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedNoErrors.php diff --git a/README.md b/README.md index 4cdb76587..4e5964961 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,10 @@ Disallows late static binding for constants. Disallows using public properties. +This sniff provides the following setting: + +* `checkPromoted`: will check promoted properties too. + #### SlevomatCodingStandard.Classes.RequireAbstractOrFinal 🔧 Requires the class to be declared either as abstract or as final. diff --git a/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php b/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php index dda65bf93..ce53dec7e 100644 --- a/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php +++ b/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php @@ -20,6 +20,9 @@ final class ForbiddenPublicPropertySniff implements Sniff public const CODE_FORBIDDEN_PUBLIC_PROPERTY = 'ForbiddenPublicProperty'; + /** @var bool */ + public $checkPromoted = false; + /** * @return array */ @@ -34,7 +37,7 @@ public function register(): array */ public function process(File $file, $variablePointer): void { - if (!PropertyHelper::isProperty($file, $variablePointer)) { + if (!PropertyHelper::isProperty($file, $variablePointer, $this->checkPromoted)) { return; } diff --git a/tests/Sniffs/Classes/ForbiddenPublicPropertySniffTest.php b/tests/Sniffs/Classes/ForbiddenPublicPropertySniffTest.php index 9d8b6b449..cba0619a1 100644 --- a/tests/Sniffs/Classes/ForbiddenPublicPropertySniffTest.php +++ b/tests/Sniffs/Classes/ForbiddenPublicPropertySniffTest.php @@ -24,4 +24,25 @@ public function testErrors(): void self::assertSniffError($report, 7, ForbiddenPublicPropertySniff::CODE_FORBIDDEN_PUBLIC_PROPERTY); } + public function testPromotedNoErrors(): void + { + $report = self::checkFile(__DIR__ . '/data/forbiddenPublicPropertyPromotedNoErrors.php', [ + 'checkPromoted' => true, + ]); + self::assertNoSniffErrorInFile($report); + } + + public function testPromotedErrors(): void + { + $report = self::checkFile(__DIR__ . '/data/forbiddenPublicPropertyPromotedErrors.php', [ + 'checkPromoted' => true, + ]); + + self::assertSame(4, $report->getErrorCount()); + + self::assertSniffError($report, 5, ForbiddenPublicPropertySniff::CODE_FORBIDDEN_PUBLIC_PROPERTY); + self::assertSniffError($report, 13, ForbiddenPublicPropertySniff::CODE_FORBIDDEN_PUBLIC_PROPERTY); + self::assertSniffError($report, 14, ForbiddenPublicPropertySniff::CODE_FORBIDDEN_PUBLIC_PROPERTY); + } + } diff --git a/tests/Sniffs/Classes/data/forbiddenPublicPropertyNoErrors.php b/tests/Sniffs/Classes/data/forbiddenPublicPropertyNoErrors.php index 8857fc473..98cd284f5 100644 --- a/tests/Sniffs/Classes/data/forbiddenPublicPropertyNoErrors.php +++ b/tests/Sniffs/Classes/data/forbiddenPublicPropertyNoErrors.php @@ -1,4 +1,4 @@ -= 8.1 function add(int $a, int $b) { @@ -8,6 +8,10 @@ function add(int $a, int $b) class Test { private $one, $two; + + public function __construct(public int $promoted) + { + } } class TestSniff diff --git a/tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedErrors.php b/tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedErrors.php new file mode 100644 index 000000000..1160802f5 --- /dev/null +++ b/tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedErrors.php @@ -0,0 +1,18 @@ += 8.1 + +class Test +{ + public function __construct(public int $promoted1, readonly public string $promoted2) + { + } +} + +class Test2 +{ + public function __construct( + public int $promoted3, + readonly public string $promoted4, + ) + { + } +} diff --git a/tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedNoErrors.php b/tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedNoErrors.php new file mode 100644 index 000000000..33e91c33b --- /dev/null +++ b/tests/Sniffs/Classes/data/forbiddenPublicPropertyPromotedNoErrors.php @@ -0,0 +1,8 @@ += 8.1 + +class Test +{ + public function __construct(protected int $promoted1, readonly private string $promoted2) + { + } +}