private static function untypedToShape()

in src/builders/FactParseScanner.hack [25:70]


  private static function untypedToShape(mixed $data): self::TFacts {
    invariant(
      $data is KeyedTraversable<_, _>,
      'FactsParse did not give us an array',
    );

    $out = darray[];
    foreach ($data as $file => $facts) {
      invariant($file is string, 'FactsParse data is not string-keyed');
      invariant(
        $facts is KeyedContainer<_, _>,
        'FactsParse data for file "%s" is not a KeyedContainer',
        $file,
      );

      try {
        $out[$file] = shape(
          'types' => TypeAssert\is_array_of_shapes_with_name_field(
            $facts['types'] ?? null,
            'FactParse types',
          ),
          'constants' => TypeAssert\is_array_of_strings(
            $facts['constants'] ?? null,
            'FactParse constants',
          ),
          'functions' => TypeAssert\is_array_of_strings(
            $facts['functions'] ?? null,
            'FactParse functions',
          ),
          'typeAliases' => TypeAssert\is_array_of_strings(
            $facts['typeAliases'] ?? null,
            'FactParse typeAliases',
          ),
        );
      } catch (\Exception $e) {
        $error_level = \error_reporting(0);
        $file_is_empty = \filesize($file) === 0;
        \error_reporting($error_level);
        if ($file_is_empty) {
          continue;
        }
        throw new \Exception("Failed to parse '".$file.'"', $e->getCode(), $e);
      }
    }
    return $out;
  }