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);
}