> */ public function getNodeTypes() : array { return [Class_::class]; } /** * @param Class_ $node */ public function refactorWithScope(Node $node, Scope $scope) : ?Node { $hasChanged = \false; $this->traverseNodesWithCallable($node, function (Node $node) use(&$hasChanged) { if ($node instanceof Ternary) { return NodeTraverser::STOP_TRAVERSAL; } if (!$node instanceof FuncCall) { return null; } // just created func call if ($node->getAttribute(AttributeKey::DO_NOT_CHANGE) === \true) { return null; } if (!$this->isName($node, 'get_class')) { return null; } if ($node->isFirstClassCallable()) { return null; } $firstArg = $node->getArgs()[0] ?? null; if (!$firstArg instanceof Arg) { return null; } $firstArgValue = $firstArg->value; $firstArgType = $this->getType($firstArgValue); if (!$this->nodeTypeResolver->isNullableType($firstArgValue) && !$firstArgType instanceof NullType) { return null; } $notIdentical = new NotIdentical($firstArgValue, $this->nodeFactory->createNull()); $funcCall = $this->createGetClassFuncCall($node); $selfClassConstFetch = $this->nodeFactory->createClassConstReference('self'); $hasChanged = \true; return new Ternary($notIdentical, $funcCall, $selfClassConstFetch); }); if ($hasChanged) { return $node; } return null; } private function createGetClassFuncCall(FuncCall $oldFuncCall) : FuncCall { $funcCall = new FuncCall($oldFuncCall->name, $oldFuncCall->args); $funcCall->setAttribute(AttributeKey::DO_NOT_CHANGE, \true); return $funcCall; } }