From 1d13a3f71456a99e56b617a48e88f1e321d124bf Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 1 Dec 2022 17:12:51 +0100 Subject: [PATCH 01/26] - added sniff for abstract class naming convention; - added sniff for interface naming convention; - added basic tests (consistent to existing ones); --- .gitignore | 3 +- LICENSE | 2 +- .../Sniffs/Naming/AbstractClassNameSniff.php | 34 ++++++++++++++++++ Proton/Sniffs/Naming/InterfaceNameSniff.php | 35 +++++++++++++++++++ Proton/ruleset.xml | 2 ++ tests/correct/AbstractClassOk.php | 13 +++++++ tests/correct/ValidInterface.php | 10 ++++++ tests/expected.txt | 10 +++--- tests/expected_csv.txt | 2 ++ tests/wrong/ClassWrongAbstract.php | 13 +++++++ tests/wrong/InterfaceWrong.php | 10 ++++++ 11 files changed, 128 insertions(+), 6 deletions(-) create mode 100644 Proton/Sniffs/Naming/AbstractClassNameSniff.php create mode 100644 Proton/Sniffs/Naming/InterfaceNameSniff.php create mode 100644 tests/correct/AbstractClassOk.php create mode 100644 tests/correct/ValidInterface.php create mode 100644 tests/wrong/ClassWrongAbstract.php create mode 100644 tests/wrong/InterfaceWrong.php diff --git a/.gitignore b/.gitignore index 7ea08c9..7bf1542 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ .vscode .phpintel /vendor/ -out.csv \ No newline at end of file +out.csv +composer.lock \ No newline at end of file diff --git a/LICENSE b/LICENSE index ab60297..4d20996 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 +Copyright (c) 2022 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Proton/Sniffs/Naming/AbstractClassNameSniff.php b/Proton/Sniffs/Naming/AbstractClassNameSniff.php new file mode 100644 index 0000000..5b49c25 --- /dev/null +++ b/Proton/Sniffs/Naming/AbstractClassNameSniff.php @@ -0,0 +1,34 @@ +getTokens(); + + if ($tokens[$stackPtr]['code'] === T_ABSTRACT) { + $namePointer = TokenHelper::findNext($phpcsFile, T_STRING, $stackPtr + 1); + + if (substr($tokens[$namePointer]['content'], 0, 8) !== 'Abstract') { + $phpcsFile->addError( + 'An abstract class should always start with `Abstract`', + $namePointer, + 'Found' + ); + } + } + } +} diff --git a/Proton/Sniffs/Naming/InterfaceNameSniff.php b/Proton/Sniffs/Naming/InterfaceNameSniff.php new file mode 100644 index 0000000..0ccb9ec --- /dev/null +++ b/Proton/Sniffs/Naming/InterfaceNameSniff.php @@ -0,0 +1,35 @@ +getTokens(); + + if ($tokens[$stackPtr]['code'] === T_INTERFACE) { + $namePointer = TokenHelper::findNext($phpcsFile, T_STRING, $stackPtr + 1); + $className = $tokens[$namePointer]['content']; + + if (substr($className, strlen($className) - 9, 9) !== 'Interface') { + $phpcsFile->addError( + 'An interface should always end with `Interface`', + $namePointer, + 'Found' + ); + } + } + } +} diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index 1f75fdc..047b1da 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -247,6 +247,8 @@ + + */node_modules/* */vendor/* diff --git a/tests/correct/AbstractClassOk.php b/tests/correct/AbstractClassOk.php new file mode 100644 index 0000000..7309b86 --- /dev/null +++ b/tests/correct/AbstractClassOk.php @@ -0,0 +1,13 @@ + Date: Thu, 1 Dec 2022 17:16:42 +0100 Subject: [PATCH 02/26] - code styling; --- Proton/Sniffs/Naming/InterfaceNameSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Proton/Sniffs/Naming/InterfaceNameSniff.php b/Proton/Sniffs/Naming/InterfaceNameSniff.php index 0ccb9ec..639511d 100644 --- a/Proton/Sniffs/Naming/InterfaceNameSniff.php +++ b/Proton/Sniffs/Naming/InterfaceNameSniff.php @@ -18,7 +18,7 @@ public function register() public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); - + if ($tokens[$stackPtr]['code'] === T_INTERFACE) { $namePointer = TokenHelper::findNext($phpcsFile, T_STRING, $stackPtr + 1); $className = $tokens[$namePointer]['content']; From 4beddbcdde0b28d6a22f06f75d3732f9db8e35c4 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 1 Dec 2022 17:17:14 +0100 Subject: [PATCH 03/26] - code styling; --- Proton/Sniffs/Naming/InterfaceNameSniff.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Proton/Sniffs/Naming/InterfaceNameSniff.php b/Proton/Sniffs/Naming/InterfaceNameSniff.php index 639511d..0ccb9ec 100644 --- a/Proton/Sniffs/Naming/InterfaceNameSniff.php +++ b/Proton/Sniffs/Naming/InterfaceNameSniff.php @@ -18,7 +18,7 @@ public function register() public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); - + if ($tokens[$stackPtr]['code'] === T_INTERFACE) { $namePointer = TokenHelper::findNext($phpcsFile, T_STRING, $stackPtr + 1); $className = $tokens[$namePointer]['content']; From eee2a334953b8a6715dde8794595150db1848a00 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 1 Dec 2022 17:18:25 +0100 Subject: [PATCH 04/26] - enable worflow; --- .github/workflows/php.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 9bd1424..170f1a8 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -2,7 +2,7 @@ name: PHP Composer CI on: push: - branches: [ master ] + branches: [ master, naming-sniffs ] pull_request: branches: [ master ] From 625c2d08e43e7bcd39dca0901584c4c5aaecba30 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 1 Dec 2022 17:24:07 +0100 Subject: [PATCH 05/26] - added some debugging output for fixing/checking the github workflow; --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9222d47..814661e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=tests/phpcs.xml --report=summary tests", - "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", From a7b4f80bdb005402c5b6ea02eb6c05a5d2356bad Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 1 Dec 2022 17:25:56 +0100 Subject: [PATCH 06/26] - fix expected result; --- tests/expected_csv.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index 77155fa..cb7410c 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -67,4 +67,5 @@ Line,Column,Type,Source 10,27,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace 10,27,error,PSR2.Classes.ClassDeclaration.OpenBraceNewLine 10,27,error,PSR12.Classes.OpeningBraceSpace.Found +10,22,error,Proton.Naming.AbstractClassName.Found 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing From db016299fab6521751cb06e3da0b43af5c8882d7 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 1 Dec 2022 17:27:40 +0100 Subject: [PATCH 07/26] - revert workflow changes; --- .github/workflows/php.yml | 2 +- composer.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 170f1a8..9bd1424 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -2,7 +2,7 @@ name: PHP Composer CI on: push: - branches: [ master, naming-sniffs ] + branches: [ master ] pull_request: branches: [ master ] diff --git a/composer.json b/composer.json index 814661e..9222d47 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=tests/phpcs.xml --report=summary tests", - "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", From 96c924a69d53aceccc507b2ad99137829448bb7f Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Fri, 2 Dec 2022 08:09:04 +0100 Subject: [PATCH 08/26] - added return type hint; --- Proton/Sniffs/Naming/AbstractClassNameSniff.php | 6 +++--- Proton/Sniffs/Naming/InterfaceNameSniff.php | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Proton/Sniffs/Naming/AbstractClassNameSniff.php b/Proton/Sniffs/Naming/AbstractClassNameSniff.php index 5b49c25..a03df03 100644 --- a/Proton/Sniffs/Naming/AbstractClassNameSniff.php +++ b/Proton/Sniffs/Naming/AbstractClassNameSniff.php @@ -10,12 +10,12 @@ class AbstractClassNameSniff implements Sniff { - public function register() + public function register(): array { return [T_ABSTRACT]; } - public function process(File $phpcsFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr): void { $tokens = $phpcsFile->getTokens(); @@ -26,7 +26,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( 'An abstract class should always start with `Abstract`', $namePointer, - 'Found' + 'Found', ); } } diff --git a/Proton/Sniffs/Naming/InterfaceNameSniff.php b/Proton/Sniffs/Naming/InterfaceNameSniff.php index 0ccb9ec..9cb3047 100644 --- a/Proton/Sniffs/Naming/InterfaceNameSniff.php +++ b/Proton/Sniffs/Naming/InterfaceNameSniff.php @@ -10,12 +10,12 @@ class InterfaceNameSniff implements Sniff { - public function register() + public function register(): array { return [T_INTERFACE]; } - public function process(File $phpcsFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr): void { $tokens = $phpcsFile->getTokens(); @@ -27,7 +27,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( 'An interface should always end with `Interface`', $namePointer, - 'Found' + 'Found', ); } } From 1526e8dab092d4f6e48779e617a86b37667c52ee Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 8 Dec 2022 13:19:26 +0100 Subject: [PATCH 09/26] - check only class on AbstractClassNameSniff; - optimized reading of the class name; --- .../Sniffs/Naming/AbstractClassNameSniff.php | 30 ++++++++++++------ Proton/Sniffs/Naming/InterfaceNameSniff.php | 31 ++++++++++++------- tests/correct/AbstractClassOk.php | 2 ++ tests/wrong/ClassWrongAbstract.php | 3 ++ 4 files changed, 45 insertions(+), 21 deletions(-) diff --git a/Proton/Sniffs/Naming/AbstractClassNameSniff.php b/Proton/Sniffs/Naming/AbstractClassNameSniff.php index a03df03..12523ef 100644 --- a/Proton/Sniffs/Naming/AbstractClassNameSniff.php +++ b/Proton/Sniffs/Naming/AbstractClassNameSniff.php @@ -12,23 +12,33 @@ class AbstractClassNameSniff implements Sniff { public function register(): array { - return [T_ABSTRACT]; + return [T_CLASS]; } public function process(File $phpcsFile, $stackPtr): void { + if (!TokenHelper::findPrevious($phpcsFile, T_ABSTRACT, $stackPtr)) { + return; + } + $tokens = $phpcsFile->getTokens(); - if ($tokens[$stackPtr]['code'] === T_ABSTRACT) { - $namePointer = TokenHelper::findNext($phpcsFile, T_STRING, $stackPtr + 1); + $opener = $tokens[$stackPtr]['scope_opener']; + $nameStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $opener, true); + $nameEnd = $phpcsFile->findNext([T_WHITESPACE, T_COLON], $nameStart, $opener); + if ($nameEnd === false) { + $name = $tokens[$nameStart]['content']; + } else { + $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); + } + - if (substr($tokens[$namePointer]['content'], 0, 8) !== 'Abstract') { - $phpcsFile->addError( - 'An abstract class should always start with `Abstract`', - $namePointer, - 'Found', - ); - } + if (substr($name, 0, 8) !== 'Abstract') { + $phpcsFile->addError( + 'An abstract class should always start with `Abstract`', + $nameStart, + 'Found', + ); } } } diff --git a/Proton/Sniffs/Naming/InterfaceNameSniff.php b/Proton/Sniffs/Naming/InterfaceNameSniff.php index 9cb3047..926d578 100644 --- a/Proton/Sniffs/Naming/InterfaceNameSniff.php +++ b/Proton/Sniffs/Naming/InterfaceNameSniff.php @@ -19,17 +19,26 @@ public function process(File $phpcsFile, $stackPtr): void { $tokens = $phpcsFile->getTokens(); - if ($tokens[$stackPtr]['code'] === T_INTERFACE) { - $namePointer = TokenHelper::findNext($phpcsFile, T_STRING, $stackPtr + 1); - $className = $tokens[$namePointer]['content']; - - if (substr($className, strlen($className) - 9, 9) !== 'Interface') { - $phpcsFile->addError( - 'An interface should always end with `Interface`', - $namePointer, - 'Found', - ); - } + if ($tokens[$stackPtr]['code'] !== T_INTERFACE) { + return; } + + $opener = $tokens[$stackPtr]['scope_opener']; + $nameStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $opener, true); + $nameEnd = $phpcsFile->findNext([T_WHITESPACE, T_COLON], $nameStart, $opener); + if ($nameEnd === false) { + $name = $tokens[$nameStart]['content']; + } else { + $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); + } + + if (substr($name, strlen($name) - 9, 9) !== 'Interface') { + $phpcsFile->addError( + 'An interface should always end with `Interface`', + $nameStart, + 'Found', + ); + } + } } diff --git a/tests/correct/AbstractClassOk.php b/tests/correct/AbstractClassOk.php index 7309b86..bf1ff15 100644 --- a/tests/correct/AbstractClassOk.php +++ b/tests/correct/AbstractClassOk.php @@ -6,6 +6,8 @@ abstract class AbstractClassOk { + abstract public function setOne(int $one = 1): void; + public function getOne(): int { return 1; diff --git a/tests/wrong/ClassWrongAbstract.php b/tests/wrong/ClassWrongAbstract.php index 11d2caa..0d84d98 100644 --- a/tests/wrong/ClassWrongAbstract.php +++ b/tests/wrong/ClassWrongAbstract.php @@ -6,6 +6,9 @@ abstract class ClassWrongAbstract { + + abstract public function setOne(int $one = 1): void; + public function getOne(): int { return 1; From 9e0cba7e773800e0e596b268d7c85aa2a06cec98 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 8 Dec 2022 13:23:35 +0100 Subject: [PATCH 10/26] cleanup; --- Proton/Sniffs/Naming/AbstractClassNameSniff.php | 1 - 1 file changed, 1 deletion(-) diff --git a/Proton/Sniffs/Naming/AbstractClassNameSniff.php b/Proton/Sniffs/Naming/AbstractClassNameSniff.php index 12523ef..915627a 100644 --- a/Proton/Sniffs/Naming/AbstractClassNameSniff.php +++ b/Proton/Sniffs/Naming/AbstractClassNameSniff.php @@ -32,7 +32,6 @@ public function process(File $phpcsFile, $stackPtr): void $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); } - if (substr($name, 0, 8) !== 'Abstract') { $phpcsFile->addError( 'An abstract class should always start with `Abstract`', From 76bdd03e3c172b567c66b909db712cb656530a9b Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 8 Dec 2022 13:31:22 +0100 Subject: [PATCH 11/26] debugging testing output; --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9222d47..814661e 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=tests/phpcs.xml --report=summary tests", - "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", From 9ae8ab623f33190c0c636c3f92d3a38123a838ef Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Thu, 8 Dec 2022 13:34:25 +0100 Subject: [PATCH 12/26] removed test debugging output; --- composer.json | 2 +- tests/expected_csv.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 814661e..9222d47 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=tests/phpcs.xml --report=summary tests", - "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index cb7410c..601685f 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -2,6 +2,8 @@ Line,Column,Type,Source 4,10,error,PSR2.Files.EndFileNewline.NoneFound 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing 7,11,error,Proton.Naming.InterfaceName.Found +8,1,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace +8,1,error,PSR12.Classes.OpeningBraceSpace.Found 7,16,error,Proton.Naming.AbstractClassName.Found 6,12,warning,Generic.Metrics.NestingLevel.TooHigh 6,12,error,SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint From 557f8f2003be9ad6eb58240388c54a172513afe4 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Fri, 9 Dec 2022 11:29:09 +0100 Subject: [PATCH 13/26] - activate DisallowMultipleAssignment (only one assignment per line); - activate AssignmentInCondition rule; - replace custom AbstractClassNameSniff by existing AbstractClassNamePrefix; - replace custom InterfaceNameSniff by existing InterfaceNameSuffix; - cleanup; --- .../ForbiddenNamespacedFunctionsSniff.php | 4 ++ .../Sniffs/Naming/AbstractClassNameSniff.php | 43 ------------------ Proton/Sniffs/Naming/InterfaceNameSniff.php | 44 ------------------- .../Spacing/ArrowFunctionSpacingSniff.php | 8 +++- Proton/ruleset.xml | 6 ++- composer.json | 4 +- tests/phpcs.xml => phpcs.xml | 2 +- tests/expected.txt | 22 +++++----- tests/wrong/Class1.php | 8 ++++ 9 files changed, 37 insertions(+), 104 deletions(-) delete mode 100644 Proton/Sniffs/Naming/AbstractClassNameSniff.php delete mode 100644 Proton/Sniffs/Naming/InterfaceNameSniff.php rename tests/phpcs.xml => phpcs.xml (89%) diff --git a/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php b/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php index b6471c7..429eef0 100644 --- a/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php +++ b/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php @@ -4,11 +4,15 @@ namespace Proton\Sniffs\Architecture; +use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\ForbiddenFunctionsSniff; use SlevomatCodingStandard\Helpers\NamespaceHelper; class ForbiddenNamespacedFunctionsSniff extends ForbiddenFunctionsSniff { + /** + * @inheritDoc + */ protected function addError($phpcsFile, $stackPtr, $function, $pattern = null): void { $fqfn = NamespaceHelper::resolveName($phpcsFile, $function, 'function', $stackPtr); diff --git a/Proton/Sniffs/Naming/AbstractClassNameSniff.php b/Proton/Sniffs/Naming/AbstractClassNameSniff.php deleted file mode 100644 index 915627a..0000000 --- a/Proton/Sniffs/Naming/AbstractClassNameSniff.php +++ /dev/null @@ -1,43 +0,0 @@ -getTokens(); - - $opener = $tokens[$stackPtr]['scope_opener']; - $nameStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $opener, true); - $nameEnd = $phpcsFile->findNext([T_WHITESPACE, T_COLON], $nameStart, $opener); - if ($nameEnd === false) { - $name = $tokens[$nameStart]['content']; - } else { - $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); - } - - if (substr($name, 0, 8) !== 'Abstract') { - $phpcsFile->addError( - 'An abstract class should always start with `Abstract`', - $nameStart, - 'Found', - ); - } - } -} diff --git a/Proton/Sniffs/Naming/InterfaceNameSniff.php b/Proton/Sniffs/Naming/InterfaceNameSniff.php deleted file mode 100644 index 926d578..0000000 --- a/Proton/Sniffs/Naming/InterfaceNameSniff.php +++ /dev/null @@ -1,44 +0,0 @@ -getTokens(); - - if ($tokens[$stackPtr]['code'] !== T_INTERFACE) { - return; - } - - $opener = $tokens[$stackPtr]['scope_opener']; - $nameStart = $phpcsFile->findNext(T_WHITESPACE, ($stackPtr + 1), $opener, true); - $nameEnd = $phpcsFile->findNext([T_WHITESPACE, T_COLON], $nameStart, $opener); - if ($nameEnd === false) { - $name = $tokens[$nameStart]['content']; - } else { - $name = trim($phpcsFile->getTokensAsString($nameStart, ($nameEnd - $nameStart))); - } - - if (substr($name, strlen($name) - 9, 9) !== 'Interface') { - $phpcsFile->addError( - 'An interface should always end with `Interface`', - $nameStart, - 'Found', - ); - } - - } -} diff --git a/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php b/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php index 48acd70..e23d49a 100644 --- a/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php +++ b/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php @@ -9,11 +9,17 @@ class ArrowFunctionSpacingSniff implements Sniff { + /** + * @inheritDoc + */ public function register(): array { return [T_FN]; } + /** + * @inheritDoc + */ public function process(File $phpcsFile, $stackPtr) { $tokens = $phpcsFile->getTokens(); @@ -22,7 +28,7 @@ public function process(File $phpcsFile, $stackPtr) $phpcsFile->addError( 'The fn arrow function token should always be followed by a space.', $stackPtr, - 'Found' + 'Found', ); } } diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index 047b1da..5d45cb4 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -26,12 +26,15 @@ + + + @@ -99,6 +102,7 @@ + @@ -247,8 +251,6 @@ - - */node_modules/* */vendor/* diff --git a/composer.json b/composer.json index 9222d47..9bf9197 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,8 @@ "minimum-stability": "dev", "prefer-stable": true, "scripts": { - "test-print": "phpcs --standard=tests/phpcs.xml --report=summary tests", - "test": "phpcs --standard=tests/phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test-print": "phpcs --standard=phpcs.xml --report=summary tests", + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/phpcs.xml b/phpcs.xml similarity index 89% rename from tests/phpcs.xml rename to phpcs.xml index ecbe214..f7ee662 100644 --- a/tests/phpcs.xml +++ b/phpcs.xml @@ -4,7 +4,7 @@ Proton PHP Coding Standard - + diff --git a/tests/expected.txt b/tests/expected.txt index ec5afae..d52f0fc 100644 --- a/tests/expected.txt +++ b/tests/expected.txt @@ -1,15 +1,15 @@ PHP CODE SNIFFER REPORT SUMMARY ------------------------------------------------------------------------------------------------- -FILE ERRORS WARNINGS ------------------------------------------------------------------------------------------------- -/Users/Username/dev/Proton/php-coding-standard/tests/wrong/Class1.php 39 4 -/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassMetrics.php 4 2 -/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassWrongAbstract.php 1 0 +------------------------------------------------------------------------------------------------------ +FILE ERRORS WARNINGS +------------------------------------------------------------------------------------------------------ +/Users/Username/dev/Proton/php-coding-standard/tests/wrong/Class1.php 51 6 +/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassMetrics.php 11 2 +/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassWrongAbstract.php 3 0 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/file.php 2 0 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/InterfaceWrong.php 1 0 ------------------------------------------------------------------------------------------------- -A TOTAL OF 39 ERRORS AND 5 WARNINGS WERE FOUND IN 5 FILES ------------------------------------------------------------------------------------------------- -PHPCBF CAN FIX 29 OF THESE SNIFF VIOLATIONS AUTOMATICALLY ------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------------ +A TOTAL OF 68 ERRORS AND 8 WARNINGS WERE FOUND IN 5 FILES +------------------------------------------------------------------------------------------------------ +PHPCBF CAN FIX 43 OF THESE SNIFF VIOLATIONS AUTOMATICALLY +------------------------------------------------------------------------------------------------------ diff --git a/tests/wrong/Class1.php b/tests/wrong/Class1.php index 4d8ceb2..ff4b351 100644 --- a/tests/wrong/Class1.php +++ b/tests/wrong/Class1.php @@ -59,4 +59,12 @@ private function testUnion(null|float|int|string $a,): null|int|float { return 1; } + + private function testAssignmentInCondition(int $a): void { + if ($a == 1 && $b = 2) { + $c = 3; + } + + $c == 3 && $d = 4; + } } \ No newline at end of file From a28dec80fe1f4d7ba376bdb83066ace2f7f60130 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Fri, 9 Dec 2022 11:31:42 +0100 Subject: [PATCH 14/26] - removed testing debug; - update expected test output; --- composer.json | 2 +- tests/expected_csv.txt | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 9bf9197..0867f90 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index 601685f..0762cfc 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -1,10 +1,10 @@ Line,Column,Type,Source 4,10,error,PSR2.Files.EndFileNewline.NoneFound 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing -7,11,error,Proton.Naming.InterfaceName.Found +7,1,error,Generic.NamingConventions.InterfaceNameSuffix.Missing 8,1,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace 8,1,error,PSR12.Classes.OpeningBraceSpace.Found -7,16,error,Proton.Naming.AbstractClassName.Found +7,10,error,Generic.NamingConventions.AbstractClassNamePrefix.Missing 6,12,warning,Generic.Metrics.NestingLevel.TooHigh 6,12,error,SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint 6,12,error,SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingAnyTypeHint @@ -19,7 +19,11 @@ Line,Column,Type,Source 20,9,error,SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn.UselessIfCondition 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing 8,1,error, found 1." -62,1,error,PSR2.Files.EndFileNewline.NoneFound +70,1,error,PSR2.Files.EndFileNewline.NoneFound +68,23,error,Squiz.PHP.DisallowMultipleAssignments.Found +64,27,warning,Generic.CodeAnalysis.AssignmentInCondition.Found +64,27,error,Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure +63,62,error,Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine 6,18,error,PSR12.Files.FileHeader.SpacingInsideBlock 58,60,error,SlevomatCodingStandard.TypeHints.UnionTypeHintFormat.NullTypeHintNotOnLastPosition 58,32,error,SlevomatCodingStandard.TypeHints.UnionTypeHintFormat.NullTypeHintNotOnLastPosition @@ -69,5 +73,5 @@ Line,Column,Type,Source 10,27,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace 10,27,error,PSR2.Classes.ClassDeclaration.OpenBraceNewLine 10,27,error,PSR12.Classes.OpeningBraceSpace.Found -10,22,error,Proton.Naming.AbstractClassName.Found +10,16,error,Generic.NamingConventions.AbstractClassNamePrefix.Missing 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing From 1df400d5fa504755e588777dea922a596d32325a Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Fri, 9 Dec 2022 12:16:26 +0100 Subject: [PATCH 15/26] - check for trait naming; --- Proton/ruleset.xml | 1 + composer.json | 2 +- tests/correct/ValidTrait.php | 13 +++++++++++++ tests/expected.txt | 3 ++- tests/wrong/TraitInvalid.php | 13 +++++++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tests/correct/ValidTrait.php create mode 100644 tests/wrong/TraitInvalid.php diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index 5d45cb4..07d579b 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -35,6 +35,7 @@ + diff --git a/composer.json b/composer.json index 0867f90..9bf9197 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/correct/ValidTrait.php b/tests/correct/ValidTrait.php new file mode 100644 index 0000000..0ce3bf6 --- /dev/null +++ b/tests/correct/ValidTrait.php @@ -0,0 +1,13 @@ + Date: Fri, 9 Dec 2022 12:18:44 +0100 Subject: [PATCH 16/26] - removed testing output; --- composer.json | 2 +- tests/expected_csv.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9bf9197..0867f90 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index 0762cfc..c7121c6 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -1,6 +1,7 @@ Line,Column,Type,Source 4,10,error,PSR2.Files.EndFileNewline.NoneFound 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing +7,1,error,Generic.NamingConventions.TraitNameSuffix.Missing 7,1,error,Generic.NamingConventions.InterfaceNameSuffix.Missing 8,1,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace 8,1,error,PSR12.Classes.OpeningBraceSpace.Found From 0cae80e5ea138bd7f7c6fbc9ac19e57da3bc206c Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 13:06:37 +0100 Subject: [PATCH 17/26] added more cs rules; --- .../ForbiddenNamespacedFunctionsSniff.php | 1 - Proton/ruleset.xml | 48 +++++++++++++++++-- composer.json | 2 +- tests/correct/AbstractClassOk.php | 14 ++++++ tests/correct/ClassOk.php | 10 ++++ tests/expected.txt | 4 +- tests/wrong/ClassWrongAbstract.php | 29 +++++++++++ tests/wrong/ContainsHTML.php | 21 ++++++++ 8 files changed, 122 insertions(+), 7 deletions(-) create mode 100644 tests/wrong/ContainsHTML.php diff --git a/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php b/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php index 429eef0..cfcca4e 100644 --- a/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php +++ b/Proton/Sniffs/Architecture/ForbiddenNamespacedFunctionsSniff.php @@ -4,7 +4,6 @@ namespace Proton\Sniffs\Architecture; -use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Standards\Generic\Sniffs\PHP\ForbiddenFunctionsSniff; use SlevomatCodingStandard\Helpers\NamespaceHelper; diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index 07d579b..b51dce1 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -98,7 +98,7 @@ - + @@ -163,7 +163,6 @@ - @@ -199,7 +198,17 @@ - + + + + + + + + + + + @@ -253,6 +262,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + warning + + + + + + + warning + */node_modules/* */vendor/* */reports/* diff --git a/composer.json b/composer.json index 0867f90..9bf9197 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/correct/AbstractClassOk.php b/tests/correct/AbstractClassOk.php index bf1ff15..a434174 100644 --- a/tests/correct/AbstractClassOk.php +++ b/tests/correct/AbstractClassOk.php @@ -12,4 +12,18 @@ public function getOne(): int { return 1; } + + /** + * Method comment + */ + #[Attribute1, Attribute2('var')] + #[Attribute3(), Attribute4] + public function method( + /** @param int $parameter */ + #[Attribute1] #[Attribute2] #[Attribute3] + #[Attribute4] #[Attribute5] #[Attribute6] + int $parameter, + ): void { + echo $parameter; + } } diff --git a/tests/correct/ClassOk.php b/tests/correct/ClassOk.php index bad6c96..e52081c 100644 --- a/tests/correct/ClassOk.php +++ b/tests/correct/ClassOk.php @@ -20,10 +20,15 @@ final class ClassOk * Foo. */ protected array $foo = []; + private array $bar = []; private string $test = 'foo'; public function __construct(array $config) { + $this->bar = [ + 'bar' => 'foo', + ]; + $this->foo = $config + [ 'foo' => 'bar', ]; @@ -42,6 +47,7 @@ public function ping(Request $request): mixed ); } catch (\RuntimeException) { // ... + } catch (\Exception) { } return $request->query->get('test'); @@ -72,6 +78,10 @@ public function foo(string $a, string $b): bool|string throw new \RuntimeException(); } + if ($a === 'y') { + throw new \Exception(''); + } + return false; } diff --git a/tests/expected.txt b/tests/expected.txt index 26dcce4..e20aea3 100644 --- a/tests/expected.txt +++ b/tests/expected.txt @@ -10,7 +10,7 @@ FILE /Users/Username/dev/Proton/php-coding-standard/tests/wrong/InterfaceWrong.php 1 0 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/TraitInvalid.php 1 0 ------------------------------------------------------------------------------------------------------ -A TOTAL OF 69 ERRORS AND 8 WARNINGS WERE FOUND IN 6 FILES +A TOTAL OF 86 ERRORS AND 14 WARNINGS WERE FOUND IN 7 FILES ------------------------------------------------------------------------------------------------------ -PHPCBF CAN FIX 43 OF THESE SNIFF VIOLATIONS AUTOMATICALLY +PHPCBF CAN FIX 63 OF THESE SNIFF VIOLATIONS AUTOMATICALLY ------------------------------------------------------------------------------------------------------ diff --git a/tests/wrong/ClassWrongAbstract.php b/tests/wrong/ClassWrongAbstract.php index 0d84d98..c6040b1 100644 --- a/tests/wrong/ClassWrongAbstract.php +++ b/tests/wrong/ClassWrongAbstract.php @@ -2,15 +2,44 @@ declare(strict_types=1); + namespace wrong; +use RuntimeException; + +/** + * Class ClassWrongAbstract + */ abstract class ClassWrongAbstract { abstract public function setOne(int $one = 1): void; + /** + * one getter. + * + * Created by me + * User: me + * Date: now + * Time: see date + * + */ public function getOne(): int { return 1; } + + #[Attribute1, Attribute2('var')] + #[Attribute3(), Attribute4] + /** + * Method comment + */ + public function method( + #[Attribute1] #[Attribute2] #[Attribute3] + #[Attribute4] #[Attribute5] #[Attribute6] + /** @param int $parameter */ + int $parameter, + ): void { + echo $parameter; + } } diff --git a/tests/wrong/ContainsHTML.php b/tests/wrong/ContainsHTML.php new file mode 100644 index 0000000..9669e77 --- /dev/null +++ b/tests/wrong/ContainsHTML.php @@ -0,0 +1,21 @@ + 1, +]; + +$bar = [ + "bar" => 1, +]; + +eval("\$str = \"foo\";"); + +// + +if (count($foo) == 1) { +} + +?> + From c972c2ed7423d6ddbeb1cfdec629208eaaa390f5 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 13:09:04 +0100 Subject: [PATCH 18/26] - removed testing output; --- composer.json | 2 +- tests/expected_csv.txt | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/composer.json b/composer.json index 9bf9197..0867f90 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index c7121c6..38ace01 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -1,11 +1,28 @@ Line,Column,Type,Source 4,10,error,PSR2.Files.EndFileNewline.NoneFound +3,1,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing 7,1,error,Generic.NamingConventions.TraitNameSuffix.Missing 7,1,error,Generic.NamingConventions.InterfaceNameSuffix.Missing -8,1,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace -8,1,error,PSR12.Classes.OpeningBraceSpace.Found -7,10,error,Generic.NamingConventions.AbstractClassNamePrefix.Missing +6,9,error,Generic.Arrays.ArrayIndent.KeyIncorrect +21,1,error,Generic.Files.InlineHTML.Found +17,17,error, use === instead." +17,1,error,Generic.CodeAnalysis.EmptyStatement.DetectedIf +15,1,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment +13,1,warning,Squiz.PHP.Eval.Discouraged +10,3,error,Generic.Arrays.ArrayIndent.KeyIncorrect +8,1,warning,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse +6,1,error, found 2." +39,37,warning,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment +33,5,warning,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment +3,1,error, found 2." +23,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden +22,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden +19,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden +14,1,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace +14,1,error,PSR12.Classes.OpeningBraceSpace.Found +13,10,error,Generic.NamingConventions.AbstractClassNamePrefix.Missing +11,4,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 6,12,warning,Generic.Metrics.NestingLevel.TooHigh 6,12,error,SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint 6,12,error,SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingAnyTypeHint @@ -19,13 +36,17 @@ Line,Column,Type,Source 20,9,warning,Generic.CodeAnalysis.UnconditionalIfStatement.Found 20,9,error,SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn.UselessIfCondition 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing +8,1,warning,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 8,1,error, found 1." 70,1,error,PSR2.Files.EndFileNewline.NoneFound 68,23,error,Squiz.PHP.DisallowMultipleAssignments.Found +68,12,error, use === instead." 64,27,warning,Generic.CodeAnalysis.AssignmentInCondition.Found 64,27,error,Squiz.PHP.DisallowMultipleAssignments.FoundInControlStructure +64,16,error, use === instead." 63,62,error,Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine 6,18,error,PSR12.Files.FileHeader.SpacingInsideBlock +6,1,warning,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 58,60,error,SlevomatCodingStandard.TypeHints.UnionTypeHintFormat.NullTypeHintNotOnLastPosition 58,32,error,SlevomatCodingStandard.TypeHints.UnionTypeHintFormat.NullTypeHintNotOnLastPosition 58,13,warning,Generic.CodeAnalysis.UnusedFunctionParameter.Found @@ -49,6 +70,7 @@ Line,Column,Type,Source 38,9,error,Generic.PHP.LowerCaseKeyword.Found 38,9,error,Squiz.ControlStructures.LowercaseDeclaration.FoundUppercase 38,9,error,Squiz.ControlStructures.ControlSignature.SpaceAfterKeyword +38,21,error, use === instead." 38,12,error,Squiz.NamingConventions.ValidVariableName.NotCamelCaps 38,1,error,Generic.WhiteSpace.DisallowTabIndent.TabsUsed 36,9,error,Squiz.NamingConventions.ValidVariableName.NotCamelCaps @@ -60,6 +82,7 @@ Line,Column,Type,Source 34,13,error,SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint 31,24,error,Proton.Spacing.ArrowFunctionSpacing.Found 28,27,error,PSR12.Classes.AnonClassDeclaration.SpaceAfterKeyword +26,11,error,Generic.Arrays.ArrayIndent.CloseBraceIncorrect 25,13,error,SlevomatCodingStandard.Arrays.TrailingArrayComma.MissingTrailingComma 22,9,error,Proton.Architecture.ForbiddenNamespacedFunctions.FoundWithAlternative 20,19,error,Generic.PHP.BacktickOperator.Found From 915c68b4d4d96fce85cbe508de0c6e02df7988a3 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 14:26:14 +0100 Subject: [PATCH 19/26] - error instead of warning; --- Proton/ruleset.xml | 3 +-- composer.json | 2 +- tests/expected.txt | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index b51dce1..41a4803 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -286,14 +286,13 @@ - warning - warning + */node_modules/* */vendor/* diff --git a/composer.json b/composer.json index 0867f90..9bf9197 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected.txt b/tests/expected.txt index e20aea3..09ae548 100644 --- a/tests/expected.txt +++ b/tests/expected.txt @@ -10,7 +10,7 @@ FILE /Users/Username/dev/Proton/php-coding-standard/tests/wrong/InterfaceWrong.php 1 0 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/TraitInvalid.php 1 0 ------------------------------------------------------------------------------------------------------ -A TOTAL OF 86 ERRORS AND 14 WARNINGS WERE FOUND IN 7 FILES +A TOTAL OF 91 ERRORS AND 9 WARNINGS WERE FOUND IN 7 FILES ------------------------------------------------------------------------------------------------------ PHPCBF CAN FIX 63 OF THESE SNIFF VIOLATIONS AUTOMATICALLY ------------------------------------------------------------------------------------------------------ From 5f2338a9fc24ac2e11ab68dd02002fa1612b26f5 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 14:27:27 +0100 Subject: [PATCH 20/26] - removed debug output; --- composer.json | 2 +- tests/expected_csv.txt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index 9bf9197..0867f90 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "prefer-stable": true, "scripts": { "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index 38ace01..a9e9fb8 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -11,10 +11,10 @@ Line,Column,Type,Source 15,1,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment 13,1,warning,Squiz.PHP.Eval.Discouraged 10,3,error,Generic.Arrays.ArrayIndent.KeyIncorrect -8,1,warning,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse +8,1,error,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 6,1,error, found 2." -39,37,warning,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment -33,5,warning,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment +39,37,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment +33,5,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment 3,1,error, found 2." 23,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 22,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden @@ -36,7 +36,7 @@ Line,Column,Type,Source 20,9,warning,Generic.CodeAnalysis.UnconditionalIfStatement.Found 20,9,error,SlevomatCodingStandard.ControlStructures.UselessIfConditionWithReturn.UselessIfCondition 1,1,error,SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing -8,1,warning,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse +8,1,error,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 8,1,error, found 1." 70,1,error,PSR2.Files.EndFileNewline.NoneFound 68,23,error,Squiz.PHP.DisallowMultipleAssignments.Found @@ -46,7 +46,7 @@ Line,Column,Type,Source 64,16,error, use === instead." 63,62,error,Squiz.Functions.MultiLineFunctionDeclaration.BraceOnSameLine 6,18,error,PSR12.Files.FileHeader.SpacingInsideBlock -6,1,warning,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse +6,1,error,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 58,60,error,SlevomatCodingStandard.TypeHints.UnionTypeHintFormat.NullTypeHintNotOnLastPosition 58,32,error,SlevomatCodingStandard.TypeHints.UnionTypeHintFormat.NullTypeHintNotOnLastPosition 58,13,warning,Generic.CodeAnalysis.UnusedFunctionParameter.Found From 37ddb0b85465db307f9a24af0cab76273bb044ba Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 16:27:36 +0100 Subject: [PATCH 21/26] - added new sniff for detecting wrong comments (based on PEAR.Commenting.InlineComment but checks for missing leading space after comment start); --- .../Sniffs/Commenting/InlineCommentSniff.php | 67 +++++++++++++++++++ Proton/ruleset.xml | 2 +- tests/correct/ClassOk.php | 2 + tests/wrong/ClassWrongAbstract.php | 4 ++ 4 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 Proton/Sniffs/Commenting/InlineCommentSniff.php diff --git a/Proton/Sniffs/Commenting/InlineCommentSniff.php b/Proton/Sniffs/Commenting/InlineCommentSniff.php new file mode 100644 index 0000000..45839e3 --- /dev/null +++ b/Proton/Sniffs/Commenting/InlineCommentSniff.php @@ -0,0 +1,67 @@ +getTokens(); + + if ($tokens[$stackPtr]['content'][0] === '#') { + $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '# ...'); + + $error = 'Perl-style comments are not allowed. Use "// Comment."'; + $error .= ' or "/* comment */" instead.'; + $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); + if ($fix === true) { + $newComment = ltrim($tokens[$stackPtr]['content'], '# '); + $newComment = '// ' . $newComment; + $phpcsFile->fixer->replaceToken($stackPtr, $newComment); + } + } elseif ($tokens[$stackPtr]['content'][0] === '/' + && $tokens[$stackPtr]['content'][1] === '/' + ) { + $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '// ...'); + + $this->checkMissingSpaceSeparator($tokens[$stackPtr]['content'], $phpcsFile, $stackPtr); + } elseif ($tokens[$stackPtr]['content'][0] === '/' + && $tokens[$stackPtr]['content'][1] === '*' + ) { + $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '/* ... */'); + + $this->checkMissingSpaceSeparator($tokens[$stackPtr]['content'], $phpcsFile, $stackPtr); + } + } + + private function checkMissingSpaceSeparator(string $content, File $phpcsFile, int $stackPtr): void + { + if ($content[2] === ' ') { + return; + } + + $error = 'Missing space between comment start and comment description.'; + $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); + if ($fix === true) { + $type = substr($content, 0, 2); + $newComment = sprintf("%s %s", $type, ltrim($content, $type)); + $phpcsFile->fixer->replaceToken($stackPtr, $newComment); + } + } +} diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index 41a4803..f0e4c8c 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -13,7 +13,7 @@ - + diff --git a/tests/correct/ClassOk.php b/tests/correct/ClassOk.php index e52081c..bc5aa28 100644 --- a/tests/correct/ClassOk.php +++ b/tests/correct/ClassOk.php @@ -25,10 +25,12 @@ final class ClassOk public function __construct(array $config) { + // This is a valid comment $this->bar = [ 'bar' => 'foo', ]; + /* This is another valid comment */ $this->foo = $config + [ 'foo' => 'bar', ]; diff --git a/tests/wrong/ClassWrongAbstract.php b/tests/wrong/ClassWrongAbstract.php index c6040b1..d9cce49 100644 --- a/tests/wrong/ClassWrongAbstract.php +++ b/tests/wrong/ClassWrongAbstract.php @@ -26,6 +26,7 @@ abstract public function setOne(int $one = 1): void; */ public function getOne(): int { + //There should be a space separator return 1; } @@ -40,6 +41,9 @@ public function method( /** @param int $parameter */ int $parameter, ): void { + /*There should be a space separator*/ echo $parameter; + # This comment is not allowed + #This is wrong, too } } From b1832415e75c470ddb110fa5201eea9723d38263 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 16:46:13 +0100 Subject: [PATCH 22/26] - added test script (composer) for diff/fix; --- .gitignore | 1 + composer.json | 3 +- tests/expected.diff | 223 +++++++++++++++++++++++++++++ tests/expected.txt | 11 +- tests/wrong/ClassWrongAbstract.php | 4 +- 5 files changed, 234 insertions(+), 8 deletions(-) create mode 100644 tests/expected.diff diff --git a/.gitignore b/.gitignore index 7bf1542..803db5e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ .phpintel /vendor/ out.csv +out.diff composer.lock \ No newline at end of file diff --git a/composer.json b/composer.json index 0867f90..ed18216 100644 --- a/composer.json +++ b/composer.json @@ -11,8 +11,9 @@ "minimum-stability": "dev", "prefer-stable": true, "scripts": { + "test-fix": "phpcs --standard=phpcs.xml --report=diff tests > tests/out.diff && diff tests/out.diff tests/expected.diff", "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected.diff b/tests/expected.diff new file mode 100644 index 0000000..f37715a --- /dev/null +++ b/tests/expected.diff @@ -0,0 +1,223 @@ +--- tests/wrong/file.php ++++ PHP_CodeSniffer +@@ -1,4 +1,5 @@ + test = new class() { ++ $this->test = new class () { + }; + + call_user_func(fn() => {}); + } + +- private function unused() { ++ private function unused() ++ { + $fooBar = 1; +- $foo_bar = '1';; ++ $foo_bar = '1'; + +- IF($foo_bar == '1') { +- return true; +- return true; +- } +- +- $this->foo( +- 'a', +- 2 ++ ++ if ($foo_bar === '1') { ++ return true; ++ return true; ++ } ++ ++ $this->foo( ++ 'a', ++ 2, + ); + } + + /** +- * @param string $a + * @deprecated + */ +- private static function Foo(string $a, $b, $c) : array |object ++ private static function Foo(string $a, $b, $c): array|object + { + return [$a, $b]; + } + +- private function testUnion(null|float|int|string $a,): null|int|float ++ private function testUnion(float|int|string|null $a,): int|float|null + { + return 1; + } + +- private function testAssignmentInCondition(int $a): void { +- if ($a == 1 && $b = 2) { ++ private function testAssignmentInCondition(int $a): void ++ { ++ if ($a === 1 && $b = 2) { + $c = 3; + } + +- $c == 3 && $d = 4; ++ $c === 3 && $d = 4; + } +-} +\ No newline at end of file ++} +--- tests/wrong/ClassWrongAbstract.php ++++ PHP_CodeSniffer +@@ -2,48 +2,32 @@ + + declare(strict_types=1); + +- + namespace wrong; + +-use RuntimeException; +- +-/** +- * Class ClassWrongAbstract +- */ + abstract class ClassWrongAbstract + { +- + abstract public function setOne(int $one = 1): void; + +- /** +- * one getter. +- * +- * Created by me. +- * User: me +- * Date: now +- * Time: now +- * +- */ + public function getOne(): int + { +- //There should be a space separator ++ // There should be a space separator + return 1; + } + +- #[Attribute1, Attribute2('var')] +- #[Attribute3(), Attribute4] + /** + * Method comment + */ ++ #[Attribute1, Attribute2('var')] ++ #[Attribute3(), Attribute4] + public function method( ++ /** @param int $parameter */ + #[Attribute1] #[Attribute2] #[Attribute3] + #[Attribute4] #[Attribute5] #[Attribute6] +- /** @param int $parameter */ + int $parameter, + ): void { +- /*There should be a space separator*/ ++ /* There should be a space separator*/ + echo $parameter; +- # This comment is not allowed +- #This is wrong, too ++ // This comment is not allowed ++ // This is wrong, too + } + } +--- tests/wrong/ContainsHTML.php ++++ PHP_CodeSniffer +@@ -3,18 +3,18 @@ + declare(strict_types=1); + + $foo = [ +- "foo" => 1, ++ "foo" => 1, + ]; + + $bar = [ +- "bar" => 1, ++ "bar" => 1, + ]; + + eval("\$str = \"foo\";"); + +-// ++// + +-if (count($foo) == 1) { ++if (count($foo) === 1) { + } + + ?> +--- tests/wrong/ClassMetrics.php ++++ PHP_CodeSniffer +@@ -1,8 +1,11 @@ + Date: Mon, 12 Dec 2022 16:48:29 +0100 Subject: [PATCH 23/26] - removed test output; --- composer.json | 2 +- tests/expected_csv.txt | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index ed18216..8e86572 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "scripts": { "test-fix": "phpcs --standard=phpcs.xml --report=diff tests > tests/out.diff && diff tests/out.diff tests/expected.diff", "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^7.4 || ^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index a9e9fb8..501c569 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -8,16 +8,23 @@ Line,Column,Type,Source 21,1,error,Generic.Files.InlineHTML.Found 17,17,error, use === instead." 17,1,error,Generic.CodeAnalysis.EmptyStatement.DetectedIf +15,1,error,Proton.Commenting.InlineComment.WrongStyle 15,1,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment 13,1,warning,Squiz.PHP.Eval.Discouraged 10,3,error,Generic.Arrays.ArrayIndent.KeyIncorrect 8,1,error,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 6,1,error, found 2." -39,37,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment -33,5,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment +47,9,error,Proton.Commenting.InlineComment.WrongStyle +46,9,error,Proton.Commenting.InlineComment.WrongStyle +44,9,error,Proton.Commenting.InlineComment.WrongStyle +40,37,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment +34,5,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment 3,1,error, found 2." +29,9,error,Proton.Commenting.InlineComment.WrongStyle +24,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 23,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 22,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden +21,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 19,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 14,1,error,SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces.IncorrectEmptyLinesAfterOpeningBrace 14,1,error,PSR12.Classes.OpeningBraceSpace.Found From 00fe4db7c5a36e7b9fdf97e8c89e706a3fcb9337 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Mon, 12 Dec 2022 16:55:15 +0100 Subject: [PATCH 24/26] - removed PHP 7.4 from composer.json; --- Proton/Sniffs/Commenting/InlineCommentSniff.php | 4 ++-- Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php | 2 +- composer.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Proton/Sniffs/Commenting/InlineCommentSniff.php b/Proton/Sniffs/Commenting/InlineCommentSniff.php index 45839e3..5425be9 100644 --- a/Proton/Sniffs/Commenting/InlineCommentSniff.php +++ b/Proton/Sniffs/Commenting/InlineCommentSniff.php @@ -12,7 +12,7 @@ class InlineCommentSniff implements Sniff /** * @inheritDoc */ - public function register() + public function register(): array { return [T_COMMENT]; } @@ -20,7 +20,7 @@ public function register() /** * @inheritDoc */ - public function process(File $phpcsFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr): void { $tokens = $phpcsFile->getTokens(); diff --git a/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php b/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php index e23d49a..baf2ed9 100644 --- a/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php +++ b/Proton/Sniffs/Spacing/ArrowFunctionSpacingSniff.php @@ -20,7 +20,7 @@ public function register(): array /** * @inheritDoc */ - public function process(File $phpcsFile, $stackPtr) + public function process(File $phpcsFile, $stackPtr): void { $tokens = $phpcsFile->getTokens(); diff --git a/composer.json b/composer.json index 8e86572..48ef255 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { - "php": "^7.4 || ^8.0", + "php": "^8.0", "slevomat/coding-standard": "^8.0", "squizlabs/php_codesniffer": "^3.7" }, From 1364aafe4ab4e20588a90642f26cf0f3b2e38794 Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Tue, 13 Dec 2022 12:46:26 +0100 Subject: [PATCH 25/26] - separation of concerns; --- .../Sniffs/Commenting/InlineCommentSniff.php | 67 ------------------- .../InlineCommentStartsWithSpaceSniff.php | 62 +++++++++++++++++ Proton/ruleset.xml | 3 +- composer.json | 2 +- tests/expected.diff | 14 ++-- tests/expected.txt | 8 +-- tests/wrong/ClassWrongAbstract.php | 6 ++ 7 files changed, 85 insertions(+), 77 deletions(-) delete mode 100644 Proton/Sniffs/Commenting/InlineCommentSniff.php create mode 100644 Proton/Sniffs/Commenting/InlineCommentStartsWithSpaceSniff.php diff --git a/Proton/Sniffs/Commenting/InlineCommentSniff.php b/Proton/Sniffs/Commenting/InlineCommentSniff.php deleted file mode 100644 index 5425be9..0000000 --- a/Proton/Sniffs/Commenting/InlineCommentSniff.php +++ /dev/null @@ -1,67 +0,0 @@ -getTokens(); - - if ($tokens[$stackPtr]['content'][0] === '#') { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '# ...'); - - $error = 'Perl-style comments are not allowed. Use "// Comment."'; - $error .= ' or "/* comment */" instead.'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); - if ($fix === true) { - $newComment = ltrim($tokens[$stackPtr]['content'], '# '); - $newComment = '// ' . $newComment; - $phpcsFile->fixer->replaceToken($stackPtr, $newComment); - } - } elseif ($tokens[$stackPtr]['content'][0] === '/' - && $tokens[$stackPtr]['content'][1] === '/' - ) { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '// ...'); - - $this->checkMissingSpaceSeparator($tokens[$stackPtr]['content'], $phpcsFile, $stackPtr); - } elseif ($tokens[$stackPtr]['content'][0] === '/' - && $tokens[$stackPtr]['content'][1] === '*' - ) { - $phpcsFile->recordMetric($stackPtr, 'Inline comment style', '/* ... */'); - - $this->checkMissingSpaceSeparator($tokens[$stackPtr]['content'], $phpcsFile, $stackPtr); - } - } - - private function checkMissingSpaceSeparator(string $content, File $phpcsFile, int $stackPtr): void - { - if ($content[2] === ' ') { - return; - } - - $error = 'Missing space between comment start and comment description.'; - $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); - if ($fix === true) { - $type = substr($content, 0, 2); - $newComment = sprintf("%s %s", $type, ltrim($content, $type)); - $phpcsFile->fixer->replaceToken($stackPtr, $newComment); - } - } -} diff --git a/Proton/Sniffs/Commenting/InlineCommentStartsWithSpaceSniff.php b/Proton/Sniffs/Commenting/InlineCommentStartsWithSpaceSniff.php new file mode 100644 index 0000000..18755db --- /dev/null +++ b/Proton/Sniffs/Commenting/InlineCommentStartsWithSpaceSniff.php @@ -0,0 +1,62 @@ +getTokens(); + $content = $tokens[$stackPtr]['content']; + + switch (true) { + case $content[0] === '#': + $commentStyle = '#'; + break; + case $content[0] === '/' && $content[1] === '/': + $commentStyle = '//'; + break; + case $content[0] === '/' && $content[1] === '*': + $commentStyle = '/*'; + break; + default: + return; + } + + $phpcsFile->recordMetric($stackPtr, 'Inline comment style', $commentStyle . '...'); + + $this->checkMissingSpaceSeparator($commentStyle, $content, $phpcsFile, $stackPtr); + } + + private function checkMissingSpaceSeparator(string $style, string $content, File $phpcsFile, int $stackPtr): void + { + $styleLength = strlen($style); + if (trim($content) === $style || $content[$styleLength] === ' ') { + return; + } + + $error = 'Missing space between comment start and comment description.'; + $fix = $phpcsFile->addFixableError($error, $stackPtr, 'WrongStyle'); + if ($fix === true) { + $type = substr($content, 0, $styleLength); + $newComment = sprintf("%s %s", $type, ltrim($content, $type)); + $phpcsFile->fixer->replaceToken($stackPtr, $newComment); + } + } +} diff --git a/Proton/ruleset.xml b/Proton/ruleset.xml index f0e4c8c..a97e198 100644 --- a/Proton/ruleset.xml +++ b/Proton/ruleset.xml @@ -13,7 +13,8 @@ - + + diff --git a/composer.json b/composer.json index 48ef255..df41984 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "scripts": { "test-fix": "phpcs --standard=phpcs.xml --report=diff tests > tests/out.diff && diff tests/out.diff tests/expected.diff", "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^8.0", diff --git a/tests/expected.diff b/tests/expected.diff index f37715a..533d600 100644 --- a/tests/expected.diff +++ b/tests/expected.diff @@ -112,7 +112,7 @@ +} --- tests/wrong/ClassWrongAbstract.php +++ PHP_CodeSniffer -@@ -2,48 +2,32 @@ +@@ -2,54 +2,33 @@ declare(strict_types=1); @@ -164,13 +164,20 @@ echo $parameter; - # This comment is not allowed - #This is wrong, too +- // +- /**/ +- +- // +- //The space is missing again +- // + // This comment is not allowed + // This is wrong, too ++ // The space is missing again } } --- tests/wrong/ContainsHTML.php +++ PHP_CodeSniffer -@@ -3,18 +3,18 @@ +@@ -3,18 +3,16 @@ declare(strict_types=1); $foo = [ @@ -186,8 +193,7 @@ eval("\$str = \"foo\";"); -// -+// - +- -if (count($foo) == 1) { +if (count($foo) === 1) { } diff --git a/tests/expected.txt b/tests/expected.txt index a199fa9..aced180 100644 --- a/tests/expected.txt +++ b/tests/expected.txt @@ -5,13 +5,13 @@ FILE ------------------------------------------------------------------------------------------------------ /Users/Username/dev/Proton/php-coding-standard/tests/wrong/Class1.php 57 6 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassMetrics.php 11 2 -/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassWrongAbstract.php 18 0 -/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ContainsHTML.php 7 1 +/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ClassWrongAbstract.php 24 0 +/Users/Username/dev/Proton/php-coding-standard/tests/wrong/ContainsHTML.php 6 1 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/file.php 3 0 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/InterfaceWrong.php 1 0 /Users/Username/dev/Proton/php-coding-standard/tests/wrong/TraitInvalid.php 1 0 ------------------------------------------------------------------------------------------------------ -A TOTAL OF 98 ERRORS AND 9 WARNINGS WERE FOUND IN 7 FILES +A TOTAL OF 103 ERRORS AND 9 WARNINGS WERE FOUND IN 7 FILES ------------------------------------------------------------------------------------------------------ -PHPCBF CAN FIX 70 OF THESE SNIFF VIOLATIONS AUTOMATICALLY +PHPCBF CAN FIX 75 OF THESE SNIFF VIOLATIONS AUTOMATICALLY ------------------------------------------------------------------------------------------------------ diff --git a/tests/wrong/ClassWrongAbstract.php b/tests/wrong/ClassWrongAbstract.php index 935a045..a89adb0 100644 --- a/tests/wrong/ClassWrongAbstract.php +++ b/tests/wrong/ClassWrongAbstract.php @@ -45,5 +45,11 @@ public function method( echo $parameter; # This comment is not allowed #This is wrong, too + // + /**/ + + // + //The space is missing again + // } } From 5e4c2bdb3926236651e96da48ec60ea4d368660d Mon Sep 17 00:00:00 2001 From: Richard Prillwitz Date: Tue, 13 Dec 2022 12:48:15 +0100 Subject: [PATCH 26/26] - update test; --- composer.json | 2 +- tests/expected_csv.txt | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/composer.json b/composer.json index df41984..48ef255 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "scripts": { "test-fix": "phpcs --standard=phpcs.xml --report=diff tests > tests/out.diff && diff tests/out.diff tests/expected.diff", "test-print": "phpcs --standard=phpcs.xml --report=summary tests", - "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && cat tests/out.csv && diff tests/expected_csv.txt tests/out.csv" + "test": "phpcs --standard=phpcs.xml --report=csv tests | sort -r | cut -f 2,3,4,6 -d ',' > tests/out.csv && diff tests/expected_csv.txt tests/out.csv" }, "require": { "php": "^8.0", diff --git a/tests/expected_csv.txt b/tests/expected_csv.txt index 501c569..d92bf3a 100644 --- a/tests/expected_csv.txt +++ b/tests/expected_csv.txt @@ -8,19 +8,24 @@ Line,Column,Type,Source 21,1,error,Generic.Files.InlineHTML.Found 17,17,error, use === instead." 17,1,error,Generic.CodeAnalysis.EmptyStatement.DetectedIf -15,1,error,Proton.Commenting.InlineComment.WrongStyle 15,1,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment 13,1,warning,Squiz.PHP.Eval.Discouraged 10,3,error,Generic.Arrays.ArrayIndent.KeyIncorrect 8,1,error,SlevomatCodingStandard.Namespaces.UnusedUses.UnusedUse 6,1,error, found 2." -47,9,error,Proton.Commenting.InlineComment.WrongStyle -46,9,error,Proton.Commenting.InlineComment.WrongStyle -44,9,error,Proton.Commenting.InlineComment.WrongStyle +53,9,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment +52,9,error,Proton.Commenting.InlineCommentStartsWithSpace.WrongStyle +51,9,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment +49,9,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment +48,9,error,SlevomatCodingStandard.Commenting.EmptyComment.EmptyComment +47,9,error,PEAR.Commenting.InlineComment.WrongStyle +47,9,error,Proton.Commenting.InlineCommentStartsWithSpace.WrongStyle +46,9,error,PEAR.Commenting.InlineComment.WrongStyle +44,9,error,Proton.Commenting.InlineCommentStartsWithSpace.WrongStyle 40,37,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment 34,5,error,SlevomatCodingStandard.Attributes.RequireAttributeAfterDocComment.AttributeBeforeDocComment 3,1,error, found 2." -29,9,error,Proton.Commenting.InlineComment.WrongStyle +29,9,error,Proton.Commenting.InlineCommentStartsWithSpace.WrongStyle 24,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 23,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden 22,8,error,SlevomatCodingStandard.Commenting.ForbiddenComments.CommentForbidden