public function generate()

in src/__Private/codegen/CodegenNodeFromJSON.hack [22:120]


  public function generate(): void {
    $cg = $this->getCodegenFactory();

    $kind_to_class = Dict\merge(
      dict[
        'list' => 'NodeList',
        'list_item' => 'ListItem',
      ],
      Dict\pull(
        $this->getSchema()['trivia'],
        $trivia ==> $trivia['trivia_kind_name'],
        $trivia ==> $trivia['trivia_type_name'],
      ),
      Dict\pull(
        Dict\filter(
          $this->getSchema()['AST'],
          $ast ==> !C\contains_key(
            self::getHandWrittenSyntaxKinds(),
            $ast['kind_name'],
          ),
        ),
        $ast ==> $ast['kind_name'],
        $ast ==> $ast['description'],
      ),
    );

    $cg
      ->codegenFile($this->getOutputDirectory().'/node_from_json.hack')
      ->setFileType(CodegenFileType::DOT_HACK)
      ->setNamespace('Facebook\\HHAST\\__Private')
      ->useNamespace('Facebook\\HHAST')
      ->addFunction(
        $cg
          ->codegenFunction('node_from_json_unwrapped')
          ->setReturnType('?HHAST\\Node')
          ->addParameter('dict<arraykey, mixed> $json')
          ->addParameter('string $file')
          ->addParameter('int $offset')
          ->addParameter('string $source')
          ->addParameter('string $type_hint')
          ->setBody(
            $cg
              ->codegenHackBuilder()
              ->addAssignment(
                '$kind',
                '$json[\'kind\'] as string',
                HackBuilderValues::literal(),
              )
              ->startIfBlock('$kind === \'missing\'')
              ->addReturn('null', HackBuilderValues::literal())
              ->endIfBlock()
              ->startIfBlock('$kind === \'token\'')
              ->add('return ')
              ->addMultilineCall(
                'HHAST\\Token::fromJSON',
                vec[
                  '$json[\'token\'] as dict<_, _>',
                  '$file',
                  '$offset',
                  '$source',
                  '$type_hint',
                ],
              )
              ->endIfBlock()
              ->addAssignment(
                '$kind_to_class',
                $kind_to_class,
                HackBuilderValues::dict(
                  HackBuilderKeys::export(),
                  HackBuilderValues::lambda(
                    ($_, $v) ==> 'HHAST\\'.$v.'::class',
                  ),
                ),
              )
              ->addAssignment(
                '$class',
                '$kind_to_class[$kind] ?? null',
                HackBuilderValues::literal(),
              )
              ->startIfBlock('$class is nonnull')
              ->add('return ')
              ->addMultilineCall(
                '$class::fromJSON',
                vec['$json', '$file', '$offset', '$source', '$type_hint'],
              )
              ->endIfBlock()
              ->addMultilineCall(
                'throw new HHAST\\UnsupportedASTNodeError',
                vec[
                  '$file',
                  '$offset',
                  '(string) $json[\'kind\']',
                ],
              )
              ->getCode(),
          ),
      )
      ->save();
  }