diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_equal_strpos.php.inc deleted file mode 100644 index 95cda89f4eb..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_equal_strpos.php.inc +++ /dev/null @@ -1,25 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_expression_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_expression_equal_strpos.php.inc deleted file mode 100644 index f86c7683193..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_expression_equal_strpos.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_expression_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_expression_strpos.php.inc deleted file mode 100644 index c2e2c7ea05f..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_expression_strpos.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_negative_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_negative_equal_strpos.php.inc deleted file mode 100644 index 209324612af..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_negative_equal_strpos.php.inc +++ /dev/null @@ -1,25 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_negative_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_negative_strpos.php.inc deleted file mode 100644 index 3054576fcbc..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_negative_strpos.php.inc +++ /dev/null @@ -1,25 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_strpos.php.inc deleted file mode 100644 index d37fa271755..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_strpos.php.inc +++ /dev/null @@ -1,25 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_equal_strpos.php.inc deleted file mode 100644 index 3557b7de24b..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_equal_strpos.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_strpos.php.inc deleted file mode 100644 index fdcdb3475f2..00000000000 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_strpos.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_equal_strpos.php.inc index 9d891068846..66046e53e53 100644 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_equal_strpos.php.inc +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_equal_strpos.php.inc @@ -21,7 +21,7 @@ class OffsetVariableZeroStrpos public function run() { $offset = 0; - $isMatch = str_contains(substr('abc', $offset), 'a'); + $isMatch = str_contains('abc', 'a'); } } ?> diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_strpos.php.inc index c88698e3a49..a5580883e88 100644 --- a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_strpos.php.inc +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/offset_variable_zero_strpos.php.inc @@ -21,7 +21,7 @@ class OffsetVariableZeroStrpos public function run() { $offset = 0; - $isMatch = str_contains(substr('abc', $offset), 'a'); + $isMatch = str_contains('abc', 'a'); } } ?> diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_equal_strpos.php.inc new file mode 100644 index 00000000000..e9fe3831ce9 --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_equal_strpos.php.inc @@ -0,0 +1,12 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_expression_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_expression_equal_strpos.php.inc new file mode 100644 index 00000000000..73ab09a1ac5 --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_expression_equal_strpos.php.inc @@ -0,0 +1,13 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_expression_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_expression_strpos.php.inc new file mode 100644 index 00000000000..79dd57db7ac --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_expression_strpos.php.inc @@ -0,0 +1,13 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_loop_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_loop_strpos.php.inc new file mode 100644 index 00000000000..495d3df618d --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_loop_strpos.php.inc @@ -0,0 +1,15 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_negative_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_negative_equal_strpos.php.inc new file mode 100644 index 00000000000..824dc9df439 --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_negative_equal_strpos.php.inc @@ -0,0 +1,12 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_negative_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_negative_strpos.php.inc new file mode 100644 index 00000000000..b368503fdf4 --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_negative_strpos.php.inc @@ -0,0 +1,12 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_strpos.php.inc new file mode 100644 index 00000000000..f22964199f3 --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_strpos.php.inc @@ -0,0 +1,12 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_variable_equal_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_variable_equal_strpos.php.inc new file mode 100644 index 00000000000..869cbd814fd --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_variable_equal_strpos.php.inc @@ -0,0 +1,13 @@ + diff --git a/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_variable_strpos.php.inc b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_variable_strpos.php.inc new file mode 100644 index 00000000000..404320182da --- /dev/null +++ b/rules-tests/Php80/Rector/NotIdentical/StrContainsRector/Fixture/skip_offset_variable_strpos.php.inc @@ -0,0 +1,13 @@ + diff --git a/rules/Php80/Rector/NotIdentical/StrContainsRector.php b/rules/Php80/Rector/NotIdentical/StrContainsRector.php index 2d555b7bfba..a180fc4e6a5 100644 --- a/rules/Php80/Rector/NotIdentical/StrContainsRector.php +++ b/rules/Php80/Rector/NotIdentical/StrContainsRector.php @@ -5,7 +5,6 @@ namespace Rector\Php80\Rector\NotIdentical; use PhpParser\Node; -use PhpParser\Node\Arg; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Equal; use PhpParser\Node\Expr\BinaryOp\Identical; @@ -14,9 +13,9 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; -use PhpParser\Node\Scalar\Int_; use PhpParser\Node\Scalar\String_; use Rector\Php80\NodeResolver\StrFalseComparisonResolver; +use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; use Rector\RuleDoc\CodeSample\CodeSample; use Rector\RuleDoc\RuleDefinition; @@ -36,7 +35,8 @@ final class StrContainsRector extends AbstractRector implements MinPhpVersionInt private const array OLD_STR_NAMES = ['strpos', 'strstr']; public function __construct( - private readonly StrFalseComparisonResolver $strFalseComparisonResolver + private readonly StrFalseComparisonResolver $strFalseComparisonResolver, + private readonly ValueResolver $valueResolver ) { } @@ -103,14 +103,10 @@ public function refactor(Node $node): ?Node return null; } - if (isset($funcCall->getArgs()[2])) { - $secondArg = $funcCall->getArgs()[2]; - - if ($this->isName($funcCall->name, 'strpos') && ! $this->isIntegerZero($secondArg->value)) { - $funcCall->args[0] = new Arg($this->nodeFactory->createFuncCall( - 'substr', - [$funcCall->args[0], $secondArg] - )); + if (isset($args[2])) { + // str_contains() has no offset, and substr() would copy the haystack on every call + if ($this->isName($funcCall->name, 'strpos') && ! $this->valueResolver->isValue($args[2]->value, 0)) { + return null; } unset($funcCall->args[2]); @@ -130,15 +126,6 @@ public function providePolyfillPackage(): string return PolyfillPackage::PHP_80; } - private function isIntegerZero(Expr $expr): bool - { - if (! $expr instanceof Int_) { - return false; - } - - return $expr->value === 0; - } - private function isEmptyStringNeedle(Expr $expr): bool { if (! $expr instanceof String_) {