> */ public function getNodeTypes() : array { return [Function_::class, ClassMethod::class]; } /** * @param Function_|ClassMethod $node */ public function refactor(Node $node) : ?Node { // exception handle has 1 param exactly if (\count($node->params) !== 1) { return null; } $paramNode = $node->params[0]; if ($paramNode->type === null) { return null; } // handle only Exception typehint $actualType = $paramNode->type instanceof NullableType ? $this->getName($paramNode->type->type) : $this->getName($paramNode->type); if ($actualType !== 'Exception') { return null; } // is probably handling exceptions if (!StringUtils::isMatch((string) $node->name, self::HANDLE_INSENSITIVE_REGEX)) { return null; } if (!$paramNode->type instanceof NullableType) { $paramNode->type = new FullyQualified('Throwable'); } else { $paramNode->type->type = new FullyQualified('Throwable'); } return $node; } public function provideMinPhpVersion() : int { return PhpVersionFeature::THROWABLE_TYPE; } }