in src/parser/PhutilTypeSpec.php [301:379]
public static function didReduceTokens($rule, $production, array $tokens) {
switch ($rule) {
case 'start':
case 'some_type':
case 'not_or_type':
return $tokens[0];
case 'type':
if ($production == 'yes') {
$tokens[0]->optional = true;
}
return $tokens[0];
case 'basic_type':
$obj = new PhutilTypeSpec();
$obj->type = $tokens[0][1];
return $obj;
case 'or_type':
$l = $tokens[0];
$r = $tokens[2];
if ($l->type == 'or') {
if ($r->type == 'or') {
foreach ($r->subtypes as $subtype) {
$l->subtypes[] = $subtype;
}
} else {
$l->subtypes[] = $r;
}
return $l;
} else if ($r->type == 'or') {
$r->subtypes[] = $l;
return $r;
} else {
$obj = new PhutilTypeSpec();
$obj->type = 'or';
$obj->subtypes[] = $l;
$obj->subtypes[] = $r;
return $obj;
}
break;
case 'map_type':
$obj = new PhutilTypeSpec();
$obj->type = 'map';
$obj->subtypes[] = $tokens[2];
$obj->subtypes[] = $tokens[4];
return $obj;
case 'list_type':
$obj = new PhutilTypeSpec();
$obj->type = 'list';
$obj->subtypes[] = $tokens[2];
return $obj;
case 'maybe_optional':
if ($production == 'yes') {
$tokens[1]->optional = true;
return $tokens[1];
} else {
return $tokens[0];
}
break;
case 'maybe_comment':
if ($production == 'yes') {
$tokens[0]->comment = $tokens[1];
}
return $tokens[0];
case 'comment':
return $tokens[1];
case 'comment_text':
$result = '';
foreach ($tokens as $token) {
if (is_array($token)) {
$result .= $token[1];
} else {
$result .= $token;
}
}
return $result;
default:
throw new Exception(pht("Unhandled parser rule '%s'!", $rule));
}
}