private function iterateCodeSections()

in src/PartiallyGeneratedCode.hack [140:192]


  private function iterateCodeSections(
    string $code,
  ): \Generator<int, (?string, string), void> {
    // Regular expression to match the beginning of a manual section
    $begin = self::getBeginManualSectionRegex('(.*)');
    $valid_begin = self::getBeginManualSectionRegex('([A-Za-z0-9:_]+)');

    $seen_ids = keyset[];
    $current_id = null;
    $chunk = varray[];
    $lines = \explode("\n", $code);
    foreach ($lines as $line) {
      if (\strpos($line, self::$manualEnd) !== false) {
        yield tuple($current_id, Str\join($chunk, "\n"));
        $chunk = varray[$line];
        $current_id = null;

      } else if (\preg_match($begin, $line) === 1) {
        if ($current_id !== null) {
          throw new PartiallyGeneratedCodeException(
            'The manual section '.$current_id.' was open before '.
            'the previous one was closed',
          );
        }
        if (!\preg_match($valid_begin, $line)) {
          throw
            new PartiallyGeneratedCodeException('Invalid id specified: '.$line);
        }

        $chunk[] = $line;
        yield tuple(null, Str\join($chunk, "\n"));
        $chunk = varray[];
        $current_id = \trim(\preg_replace($begin, '\\1', $line));

        if (C\contains($seen_ids, $current_id)) {
          throw new PartiallyGeneratedCodeException(
            'Duplicate manual section id: '.$current_id,
          );
        }
        $seen_ids[] = $current_id;
      } else {
        $chunk[] = $line;
      }
    }
    if ($current_id !== null) {
      throw new PartiallyGeneratedCodeException(
        'The manual section '.$current_id.' was not closed at the end of code',
      );
    }
    if ($code !== '') {
      yield tuple(null, Str\join($chunk, "\n"));
    }
  }