private static function parseParameter()

in src/PatternParser/Parser.php [81:131]


  private static function parseParameter(
    vec<Token> $tokens,
  ): (ParameterNode, vec<Token>) {
    list($type, $text) = C\firstx($tokens);
    invariant(
      $type === TokenType::STRING,
      'Expected parameter to start with a name, got "%s" (%s)',
      $text,
      $type,
    );
    $name = $text;
    $tokens = Vec\drop($tokens, 1);

    list($type, $text) = C\firstx($tokens);
    if ($type === TokenType::CLOSE_BRACE) {
      return tuple(new ParameterNode($name, null), $tokens);
    }

    invariant(
      $type === TokenType::COLON,
      'Expected parameter name "%s" to be followed by "%s" or "%s", got "%s"',
      $name,
      TokenType::CLOSE_BRACE,
      TokenType::COLON,
      $text,
    );
    $tokens = Vec\drop($tokens, 1);
    $regexp = '';
    $depth = 0;
    while (!C\is_empty($tokens)) {
      list($type, $text) = C\firstx($tokens);
      if ($type === TokenType::OPEN_BRACE) {
        ++$depth;
      } else if ($type === TokenType::CLOSE_BRACE) {
        if ($depth === 0) {
          break;
        }
        --$depth;
      }
      $tokens = Vec\drop($tokens, 1);
      $regexp .= $text;
    }
    invariant(
      $depth === 0,
      '%s without matching %s in regexp',
      TokenType::OPEN_BRACE,
      TokenType::CLOSE_BRACE,
    );

    return tuple(new ParameterNode($name, $regexp), $tokens);
  }