src/build/RoutingCodegenBuildStep.php (74 lines of code) (raw):
<?hh // strict
/*
* Copyright (c) 2004-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
namespace HHVM\UserDocumentation;
use type Facebook\HackRouter\Codegen;
use namespace Facebook\{HackCodegen as hcg, TypeAssert};
final class RoutingCodegenBuildStep extends BuildStep {
<<__Override>>
public function buildAll(): void {
Log::i("\nBuilding Router-related codegen...");
Codegen::forTree(
LocalConfig::ROOT.'/src/site',
shape(
'controllerBase' => \RoutableController::class,
'router' => self::getRouterConfig(),
'requestParameters' => self::getRequestParametersConfig(),
'uriBuilders' => self::getUriBuildersConfig(),
'hackCodegenConfig' => (new hcg\HackCodegenConfig())
->withRootDir(LocalConfig::ROOT),
),
)->build();
}
private static function getRouterConfig(): Codegen::TRouterCodegenConfig {
return shape(
'file' => LocalConfig::ROOT.'/src/site/RouterCodegenBase.php',
'class' => 'RouterCodegenBase',
'abstract' => true,
);
}
private static function getRequestParametersConfig(
): Codegen::TRequestParametersCodegenConfig {
$root = LocalConfig::ROOT.'/src/site/controllers/codegen/';
return shape(
'getParameters' => $class ==> {
$class = TypeAssert\classname_of(\WebController::class, $class);
$spec = $class::getParametersSpec();
$out = Vector {};
foreach ($spec['required'] as $p) {
$out[] = shape('spec' => $p, 'optional' => false);
}
foreach ($spec['optional'] as $p) {
$out[] = shape('spec' => $p, 'optional' => true);
}
return $out->immutable();
},
'trait' => shape(
'requireExtends' => ImmSet {
\WebController::class,
},
'methodName' => 'getParameters',
'getRawParametersCode' => '$this->getParameters_PRIVATE_IMPL()',
),
'output' => $classname ==> shape(
'file' => $root.$classname.'Parameters.php',
'class' => shape(
'name' => $classname.'Parameters',
),
'trait' => shape(
'name' => $classname.'ParametersTrait',
),
),
);
}
private static function getUriBuildersConfig(
): Codegen::TUriBuilderCodegenConfig {
$root = LocalConfig::ROOT.'/src/site/controllers/codegen/';
return shape(
'output' => $classname ==> shape(
'file' => $root.$classname.'URIBuilder.php',
'class' => shape(
'name' => $classname.'URIBuilder',
),
),
);
}
}