From 3f4b1afcb79aa6512062de5b75ef80937b854e9c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 10 Apr 2025 18:24:01 +0700 Subject: [PATCH 1/8] [PHPUnit90] Handle crash on different object without second arg on SpecificAssertContainsWithoutIdentityRector --- .../Fixture/skip_no_second_arg.php.inc | 15 +++++++++++++++ src/NodeAnalyzer/TestsNodeAnalyzer.php | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 rules-tests/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector/Fixture/skip_no_second_arg.php.inc diff --git a/rules-tests/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector/Fixture/skip_no_second_arg.php.inc b/rules-tests/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector/Fixture/skip_no_second_arg.php.inc new file mode 100644 index 00000000..367af616 --- /dev/null +++ b/rules-tests/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector/Fixture/skip_no_second_arg.php.inc @@ -0,0 +1,15 @@ +transport()->queue()->assertContains(new stdClass()); + } +} \ No newline at end of file diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index b3f726b2..2e7d734e 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; @@ -33,7 +34,11 @@ public function __construct( public function isInTestClass(Node $node): bool { - $classReflection = $this->reflectionResolver->resolveClassReflection($node); + if ($node->var instanceof Variable && $this->nodeNameResolver->isNames($node->var, ['this', 'self'])) { + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + } else { + $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); + } if (! $classReflection instanceof ClassReflection) { return false; From 13555eff92fd9dee0d11d72916e048b3009e7737 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 10 Apr 2025 18:27:05 +0700 Subject: [PATCH 2/8] [PHPUnit90] Handle crash on different object without second arg on SpecificAssertContainsWithoutIdentityRector --- src/NodeAnalyzer/TestsNodeAnalyzer.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 2e7d734e..67b0999f 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -34,10 +34,10 @@ public function __construct( public function isInTestClass(Node $node): bool { - if ($node->var instanceof Variable && $this->nodeNameResolver->isNames($node->var, ['this', 'self'])) { - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - } else { + if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isNames($node->var, ['this', 'self']))) { $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); + } else { + $classReflection = $this->reflectionResolver->resolveClassReflection($node); } if (! $classReflection instanceof ClassReflection) { From d48c1a052f4c33b7a8efefb3cbbd3e5a2f3f9cae Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 10 Apr 2025 11:27:47 +0000 Subject: [PATCH 3/8] [ci-review] Rector Rectify --- src/NodeAnalyzer/TestsNodeAnalyzer.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 67b0999f..3f617c74 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -34,7 +34,10 @@ public function __construct( public function isInTestClass(Node $node): bool { - if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isNames($node->var, ['this', 'self']))) { + if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isNames( + $node->var, + ['this', 'self'] + ))) { $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); } else { $classReflection = $this->reflectionResolver->resolveClassReflection($node); From b48f99852c2faf9baf5e2f60ced21ca9c99d51e2 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 10 Apr 2025 18:31:01 +0700 Subject: [PATCH 4/8] [PHPUnit90] Handle crash on different object without second arg on SpecificAssertContainsWithoutIdentityRector --- src/NodeAnalyzer/TestsNodeAnalyzer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 3f617c74..5c850cff 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -36,7 +36,7 @@ public function isInTestClass(Node $node): bool { if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isNames( $node->var, - ['this', 'self'] + ['this', 'self', 'parent', 'static'] ))) { $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); } else { From f4e1a4653400fad96597826e380665bcb3dd56f2 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 10 Apr 2025 18:31:32 +0700 Subject: [PATCH 5/8] [PHPUnit90] Handle crash on different object without second arg on SpecificAssertContainsWithoutIdentityRector --- src/NodeAnalyzer/TestsNodeAnalyzer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 5c850cff..374d58b6 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -34,9 +34,9 @@ public function __construct( public function isInTestClass(Node $node): bool { - if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isNames( + if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isName( $node->var, - ['this', 'self', 'parent', 'static'] + 'this' ))) { $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); } else { From 51082810dc521ae8ba7fe56ff443121ba2d45d78 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 10 Apr 2025 18:40:17 +0700 Subject: [PATCH 6/8] Fix --- src/NodeAnalyzer/TestsNodeAnalyzer.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 374d58b6..50292116 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -39,6 +39,11 @@ public function isInTestClass(Node $node): bool 'this' ))) { $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); + + // fluent call PHPUnit methods + if ($classReflection instanceof ClassReflection && str_starts_with($classReflection->getName(),'PHPUnit\\')) { + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + } } else { $classReflection = $this->reflectionResolver->resolveClassReflection($node); } From bd96d32b21298fcee63f3b487a000565a711d208 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 10 Apr 2025 11:41:04 +0000 Subject: [PATCH 7/8] [ci-review] Rector Rectify --- src/NodeAnalyzer/TestsNodeAnalyzer.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 50292116..4a96fa8e 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -41,7 +41,10 @@ public function isInTestClass(Node $node): bool $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); // fluent call PHPUnit methods - if ($classReflection instanceof ClassReflection && str_starts_with($classReflection->getName(),'PHPUnit\\')) { + if ($classReflection instanceof ClassReflection && str_starts_with( + $classReflection->getName(), + 'PHPUnit\\' + )) { $classReflection = $this->reflectionResolver->resolveClassReflection($node); } } else { From 74fc29886d7dc50efa24e299530244e781cc8c78 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Thu, 10 Apr 2025 18:45:13 +0700 Subject: [PATCH 8/8] Fix --- ...ificAssertContainsWithoutIdentityRector.php | 4 ++++ src/NodeAnalyzer/TestsNodeAnalyzer.php | 18 +----------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php b/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php index 0e6cf40d..66a220cc 100644 --- a/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php +++ b/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php @@ -92,6 +92,10 @@ public function refactor(Node $node): ?Node return null; } + if (count($node->getArgs()) < 2) { + return null; + } + // when second argument is string: do nothing $secondArgType = $this->getType($node->getArgs()[1]->value); if ($secondArgType instanceof StringType) { diff --git a/src/NodeAnalyzer/TestsNodeAnalyzer.php b/src/NodeAnalyzer/TestsNodeAnalyzer.php index 4a96fa8e..b3f726b2 100644 --- a/src/NodeAnalyzer/TestsNodeAnalyzer.php +++ b/src/NodeAnalyzer/TestsNodeAnalyzer.php @@ -7,7 +7,6 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; @@ -34,22 +33,7 @@ public function __construct( public function isInTestClass(Node $node): bool { - if ($node instanceof MethodCall && (! $node->var instanceof Variable || ! $this->nodeNameResolver->isName( - $node->var, - 'this' - ))) { - $classReflection = $this->reflectionResolver->resolveClassReflectionSourceObject($node); - - // fluent call PHPUnit methods - if ($classReflection instanceof ClassReflection && str_starts_with( - $classReflection->getName(), - 'PHPUnit\\' - )) { - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - } - } else { - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - } + $classReflection = $this->reflectionResolver->resolveClassReflection($node); if (! $classReflection instanceof ClassReflection) { return false;