From e48c4c42e389cf31160fd6db919412bc69a9d8cb Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Thu, 14 Nov 2024 15:47:28 +0100 Subject: [PATCH 1/3] RegularExpressionPatternRule: support extended Strings --- src/Rule/Nette/RegularExpressionPatternRule.php | 4 ++-- tests/Rule/Nette/RegularExpressionPatternRuleTest.php | 4 ++++ tests/Rule/Nette/data/valid-regex-pattern.php | 3 +++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Rule/Nette/RegularExpressionPatternRule.php b/src/Rule/Nette/RegularExpressionPatternRule.php index bee94ea..7625fb2 100644 --- a/src/Rule/Nette/RegularExpressionPatternRule.php +++ b/src/Rule/Nette/RegularExpressionPatternRule.php @@ -51,8 +51,8 @@ private function extractPatterns(StaticCall $staticCall, Scope $scope): array if (!$staticCall->class instanceof Node\Name || !$staticCall->name instanceof Node\Identifier) { return []; } - $className = $scope->resolveName($staticCall->class); - if ($className !== Strings::class) { + $caller = $scope->resolveTypeByName($staticCall->class); + if ($caller->getClassReflection() === null || !$caller->getClassReflection()->is(Strings::class)) { return []; } $methodName = strtolower((string) $staticCall->name); diff --git a/tests/Rule/Nette/RegularExpressionPatternRuleTest.php b/tests/Rule/Nette/RegularExpressionPatternRuleTest.php index 86ae8bd..e3db48f 100644 --- a/tests/Rule/Nette/RegularExpressionPatternRuleTest.php +++ b/tests/Rule/Nette/RegularExpressionPatternRuleTest.php @@ -71,6 +71,10 @@ public function testValidRegexPatternAfter73(): void 'Regex pattern is invalid: Compilation failed: missing closing parenthesis at offset 1 in pattern: ~(~', 26, ], + [ + 'Regex pattern is invalid: Delimiter must not be alphanumeric, backslash, or NUL in pattern: nok', + 36, + ], ], ); } diff --git a/tests/Rule/Nette/data/valid-regex-pattern.php b/tests/Rule/Nette/data/valid-regex-pattern.php index d76813f..a039d32 100644 --- a/tests/Rule/Nette/data/valid-regex-pattern.php +++ b/tests/Rule/Nette/data/valid-regex-pattern.php @@ -31,3 +31,6 @@ '~(~' => function () {}, ] ); + +class MyStrings extends \Nette\Utils\Strings {} +MyStrings::replace('', 'nok', ''); From 58901c16ae5f496e2a4782d297057e75fde859b2 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Thu, 14 Nov 2024 15:50:45 +0100 Subject: [PATCH 2/3] Fix diffs among php versions --- tests/Rule/Nette/RegularExpressionPatternRuleTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Rule/Nette/RegularExpressionPatternRuleTest.php b/tests/Rule/Nette/RegularExpressionPatternRuleTest.php index e3db48f..88d222c 100644 --- a/tests/Rule/Nette/RegularExpressionPatternRuleTest.php +++ b/tests/Rule/Nette/RegularExpressionPatternRuleTest.php @@ -72,7 +72,7 @@ public function testValidRegexPatternAfter73(): void 26, ], [ - 'Regex pattern is invalid: Delimiter must not be alphanumeric, backslash, or NUL in pattern: nok', + sprintf('Regex pattern is invalid: Delimiter must not be %s in pattern: nok', $messagePart), 36, ], ], From 0533fa2c8a9bb3c5c82c9aa76de9c28e4b0e85e2 Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Fri, 15 Nov 2024 14:31:03 +0100 Subject: [PATCH 3/3] Use isSuperTypeOf --- src/Rule/Nette/RegularExpressionPatternRule.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Rule/Nette/RegularExpressionPatternRule.php b/src/Rule/Nette/RegularExpressionPatternRule.php index 7625fb2..9a9638c 100644 --- a/src/Rule/Nette/RegularExpressionPatternRule.php +++ b/src/Rule/Nette/RegularExpressionPatternRule.php @@ -9,6 +9,7 @@ use PHPStan\Analyser\Scope; use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; +use PHPStan\Type\ObjectType; use function in_array; use function sprintf; use function strtolower; @@ -52,7 +53,7 @@ private function extractPatterns(StaticCall $staticCall, Scope $scope): array return []; } $caller = $scope->resolveTypeByName($staticCall->class); - if ($caller->getClassReflection() === null || !$caller->getClassReflection()->is(Strings::class)) { + if (!(new ObjectType(Strings::class))->isSuperTypeOf($caller)->yes()) { return []; } $methodName = strtolower((string) $staticCall->name);