fluentChainMethodCallNodeAnalyzer = $fluentChainMethodCallNodeAnalyzer; $this->fluentChainMethodCallRootExtractor = $fluentChainMethodCallRootExtractor; $this->nonFluentChainMethodCallFactory = $nonFluentChainMethodCallFactory; $this->sameClassMethodCallAnalyzer = $sameClassMethodCallAnalyzer; $this->fluentMethodCallSkipper = $fluentMethodCallSkipper; } public function match(MethodCall $methodCall, string $kind): ?AssignAndRootExprAndNodesToAdd { $chainMethodCalls = $this->fluentChainMethodCallNodeAnalyzer->collectAllMethodCallsInChain($methodCall); if (! $this->sameClassMethodCallAnalyzer->haveSingleClass($chainMethodCalls)) { return null; } $assignAndRootExpr = $this->fluentChainMethodCallRootExtractor->extractFromMethodCalls( $chainMethodCalls, $kind ); if (! $assignAndRootExpr instanceof AssignAndRootExpr) { return null; } if ($this->fluentMethodCallSkipper->shouldSkipMethodCalls($assignAndRootExpr, $chainMethodCalls)) { return null; } $nodesToAdd = $this->nonFluentChainMethodCallFactory->createFromAssignObjectAndMethodCalls( $assignAndRootExpr, $chainMethodCalls, $kind ); return new AssignAndRootExprAndNodesToAdd($assignAndRootExpr, $nodesToAdd); } }