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