in src/api-gen/DataMerger.php [48:107]
public static function mergeAll(vec<Documentable> $in): vec<Documentable> {
/* We start by throwing any documentables with parents (e.g. methods
* have a class as a parent), as we need to de-dupe the parents first;
* the children are de-duped as part of that process, so we can extract
* them from the parents after */
$top_level = $in
|> Vec\filter(
$$,
$d ==> $d['parent'] === null &&
!(
$d['definition'] is ScannedType ||
$d['definition'] is ScannedNewtype
),
)
|> Dict\group_by($$, $item ==> self::getMergeKey($item))
|> Vec\map(
$$,
$items ==> {
$first = C\firstx($items);
$rest = Vec\drop($items, 1);
if (C\is_empty($rest)) {
return $first;
}
$merged = $first;
foreach ($rest as $item) {
$merged = self::mergePair($merged, $item);
}
return $merged;
},
);
$methods = $top_level
|> Vec\map(
$$,
$parent ==> {
$def = $parent['definition'];
if ($def is ScannedClassish) {
// Type refinement
$parent['definition'] = $def;
return $parent;
}
return null;
},
)
|> Vec\filter_nulls($$)
|> Vec\map(
$$,
$parent ==> Vec\map(
$parent['definition']->getMethods(),
$method ==> shape(
'definition' => $method,
'parent' => $parent['definition'],
'sources' => $parent['sources'],
),
),
)
|> Vec\flatten($$);
return Vec\concat($top_level, $methods)
|> Vec\sort_by($$, $d ==> $d['definition']->getName());
}