function collectNamespaceBoundaries(Source $s) { if (!$s->has(T_NAMESPACE)) { return ['' => [[0, INF]]]; } $result = []; foreach ($s->all(T_NAMESPACE) as $keyword) { if ($s->next(';', $keyword) < $s->next(Generic\LEFT_CURLY, $keyword)) { return [scanQualifiedName($s, $keyword + 1) => [[0, INF]]]; } $begin = $s->next(Generic\LEFT_CURLY, $keyword) + 1; $end = $s->match($begin) - 1; $name = scanQualifiedName($s, $keyword + 1); if (!isset($result[$name])) { $result[$name] = []; } $result[$name][] = [$begin, $end]; } return $result; }