fluentChainMethodCallNodeAnalyzer = $fluentChainMethodCallNodeAnalyzer; $this->fluentChainMethodCallRootExtractor = $fluentChainMethodCallRootExtractor; $this->nonFluentChainMethodCallFactory = $nonFluentChainMethodCallFactory; $this->sameClassMethodCallAnalyzer = $sameClassMethodCallAnalyzer; $this->fluentMethodCallSkipper = $fluentMethodCallSkipper; } public function match(\PhpParser\Node\Expr\MethodCall $methodCall, string $kind) : ?\Rector\Defluent\ValueObject\AssignAndRootExprAndNodesToAdd { $chainMethodCalls = $this->fluentChainMethodCallNodeAnalyzer->collectAllMethodCallsInChain($methodCall); if (!$this->sameClassMethodCallAnalyzer->haveSingleClass($chainMethodCalls)) { return null; } $assignAndRootExpr = $this->fluentChainMethodCallRootExtractor->extractFromMethodCalls($chainMethodCalls, $kind); if (!$assignAndRootExpr instanceof \Rector\Defluent\ValueObject\AssignAndRootExpr) { return null; } if ($this->fluentMethodCallSkipper->shouldSkipMethodCalls($assignAndRootExpr, $chainMethodCalls)) { return null; } $parentMethodCall = $methodCall->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::PARENT_NODE); $nodesToAdd = $this->nonFluentChainMethodCallFactory->createFromAssignObjectAndMethodCalls($assignAndRootExpr, $chainMethodCalls, $kind, $parentMethodCall); return new \Rector\Defluent\ValueObject\AssignAndRootExprAndNodesToAdd($assignAndRootExpr, $nodesToAdd); } }