function generic_from_ast()

in src/consumers/generic_from_ast.hack [15:65]


function generic_from_ast(
  ConsumerContext $context,
  HHAST\TypeParameter $node,
): ScannedGeneric {
  $v = $node->getVariance();
  if ($v is HHAST\PlusToken) {
    $variance = VarianceToken::COVARIANT;
  } else if ($v is HHAST\MinusToken) {
    $variance = VarianceToken::CONTRAVARIANT;
  } else {
    invariant($v === null, 'unknown variance');
    $variance = VarianceToken::INVARIANT;
  }

  $constraints = $node->getConstraints();
  if ($constraints === null) {
    $constraints = vec[];
  } else {
    $constraints = Vec\map(
      $constraints->getChildren(),
      (HHAST\TypeConstraint $c) ==> {
        $kw = $c->getKeyword();
        if ($kw is HHAST\AsToken) {
          $r = RelationshipToken::SUBTYPE;
        } else {
          invariant(
            $kw is HHAST\SuperToken,
            'unexpected relationship token: %s',
            $kw->getCode(),
          );
          $r = RelationshipToken::SUPERTYPE;
        }
        $type = typehint_from_ast($context, $c->getType());
        if ($type === null) {
          return null;
        }

        return shape(
          'type' => $type,
          'relationship' => $r,
        );
      },
    ) |> Vec\filter_nulls($$);
  }

  return new ScannedGeneric(
    $node->getName()->getText(),
    $variance,
    $constraints,
  );
}