protected function getCodegenClass()

in src/UriBuilderCodegenBuilder.hack [33:94]


  protected function getCodegenClass(self::TSpec $spec): CodegenClass {
    $param_builder = $this->parameterBuilder;
    $controller = $spec['controller'];
    $param_shape = vec[];

    $body = $this->cg
      ->codegenHackBuilder()
      ->addLine('return self::createInnerBuilder()')
      ->indent();

    foreach ($controller::getUriPattern()->getParameters() as $param) {
      $param_spec = $param_builder::getUriSpec($param);
      $setter_spec = $param_spec::getSetterSpec($param);
      $param_shape[] =
        new CodegenShapeMember($param->getName(), $setter_spec['type']);
      $body
        ->ensureNewLine()
        ->addMultilineCall(
          '->set'.$setter_spec['accessorSuffix'],
          $setter_spec['args']->map(
            $arg ==> $arg->render(
              $param,
              \sprintf('$parameters[\'%s\']', $param->getName()),
            ),
          ),
          /* semicolon at end = */ false,
        );
    }
    $body
      ->addLinef('->%s();', $this->uriGetter)
      ->unindent();

    $method = $this->cg
      ->codegenMethod($this->uriGetter)
      ->setReturnType($this->uriType)
      ->setIsStatic(true)
      ->setBody($body->getCode());
    if (\count($param_shape) !== 0) {
      $method->addParameter('self::TParameters $parameters');
    }

    $common = $this->cg
      ->codegenClass($spec['class']['name'])
      ->addConstant(
        $this->cg->codegenClassConstant('CONTROLLER')
          ->setTypef('classname<\\%s>', HasUriPattern::class)
          ->setValue($controller, HackBuilderValues::classname()),
      )
      ->addTypeConstant(
        $this->cg->codegenTypeConstant('TParameters')
          ->setValue(
            $this->cg->codegenShape(...$param_shape),
            HackBuilderValues::codegen(),
          )
      )
      ->addMethod($method)
      ->setIsAbstract(true)
      ->setIsFinal(true)
      ->setExtends('\\'.$this->base);

    return $common;
  }