public static function didReduceTokens()

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