nodeComparator = $nodeComparator; } /** * @param array $typeNodes * @return array */ public function unwrapNullableUnionTypes(array $typeNodes) : array { $unwrappedTypeNodes = []; foreach ($typeNodes as $typeNode) { if ($typeNode instanceof UnionType) { $unwrappedTypeNodes = \array_merge($unwrappedTypeNodes, $this->unwrapNullableUnionTypes($typeNode->types)); } elseif ($typeNode instanceof NullableType) { $unwrappedTypeNodes[] = $typeNode->type; $unwrappedTypeNodes[] = new Identifier('null'); } elseif ($typeNode instanceof IntersectionType) { $unwrappedTypeNodes = \array_merge($unwrappedTypeNodes, $this->unwrapNullableUnionTypes($typeNode->types)); } else { $unwrappedTypeNodes[] = $typeNode; } } return $this->uniquateNodes($unwrappedTypeNodes); } /** * @template TNode as Node * * @param TNode[] $nodes * @return TNode[] */ public function uniquateNodes(array $nodes) : array { $uniqueNodes = []; foreach ($nodes as $node) { $uniqueHash = $this->nodeComparator->printWithoutComments($node); $uniqueNodes[$uniqueHash] = $node; } // reset keys from 0, for further compatibility return \array_values($uniqueNodes); } }