src/CodegenFactoryTrait.hack (190 lines of code) (raw):

/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * */ namespace Facebook\HackCodegen; use namespace HH\Lib\{C, Str, Vec}; /** * Trait to implement `ICodegenFactory` if no special behavior is provided. * * You must implement `getConfig()`, but all other methods are final. */ trait CodegenFactoryTrait implements ICodegenFactory { /** @selfdocumenting */ public abstract function getConfig(): IHackCodegenConfig; final public function codegenConstructor(): CodegenConstructor { return new CodegenConstructor($this->getConfig()); } final public function codegenConstant(string $name): CodegenConstant { return new CodegenConstant($this->getConfig(), $name); } final public function codegenConstantf( Str\SprintfFormatString $format, mixed ...$args ): CodegenConstant { return new CodegenConstant($this->getConfig(), \vsprintf($format, $args)); } final public function codegenClassConstant( string $name, ): CodegenClassConstant { return new CodegenClassConstant($this->getConfig(), $name); } final public function codegenClassConstantf( Str\SprintfFormatString $format, mixed ...$args ): CodegenClassConstant { return new CodegenClassConstant($this->getConfig(), \vsprintf($format, $args)); } final public function codegenEnumMember(string $name): CodegenEnumMember { return new CodegenEnumMember($this->getConfig(), $name); } final public function codegenEnumMemberf( Str\SprintfFormatString $format, mixed ...$args ): CodegenEnumMember { return new CodegenEnumMember($this->getConfig(), \vsprintf($format, $args)); } final public function codegenTypeConstant(string $name): CodegenTypeConstant { return new CodegenTypeConstant($this->getConfig(), $name); } final public function codegenTypeConstantf( Str\SprintfFormatString $format, mixed ...$args ): CodegenTypeConstant { return new CodegenTypeConstant($this->getConfig(), \vsprintf($format, $args)); } final public function codegenFile(string $file): CodegenFile { return new CodegenFile($this->getConfig(), $file); } final public function codegenFilef( Str\SprintfFormatString $format, mixed ...$args ): CodegenFile { return $this->codegenFile(\vsprintf($format, $args)); } final public function codegenFunction(string $name): CodegenFunction { return new CodegenFunction($this->getConfig(), $name); } final public function codegenFunctionf( Str\SprintfFormatString $format, mixed ...$args ): CodegenFunction { return $this->codegenFunction(\vsprintf($format, $args)); } final public function codegenClass(string $name): CodegenClass { return new CodegenClass($this->getConfig(), $name); } final public function codegenClassf( Str\SprintfFormatString $format, mixed ...$args ): CodegenClass { return $this->codegenClass(\vsprintf($format, $args)); } final public function codegenEnum( string $name, string $enumType, ): CodegenEnum { return new CodegenEnum($this->getConfig(), $name, $enumType); } final public function codegenInterface(string $name): CodegenInterface { return new CodegenInterface($this->getConfig(), $name); } final public function codegenTrait(string $name): CodegenTrait { return new CodegenTrait($this->getConfig(), $name); } final public function codegenMethod(string $name): CodegenMethod { return new CodegenMethod($this->getConfig(), $name); } final public function codegenMethodf( Str\SprintfFormatString $format, mixed ...$args ): CodegenMethod { return $this->codegenMethod(\vsprintf($format, $args)); } final public function codegenHackBuilder(): HackBuilder { return new HackBuilder($this->getConfig()); } final public function codegenImplementsInterface( string $name, ): CodegenImplementsInterface { return new CodegenImplementsInterface($this->getConfig(), $name); } final public function codegenImplementsInterfaces( Traversable<string> $names, ): vec<CodegenImplementsInterface> { return Vec\map($names, $name ==> $this->codegenImplementsInterface($name)); } final public function codegenProperty(string $name): CodegenProperty { return new CodegenProperty($this->getConfig(), $name); } final public function codegenPropertyf( Str\SprintfFormatString $format, mixed ...$args ): CodegenProperty { return $this->codegenProperty(\vsprintf($format, $args)); } final public function codegenUsesTrait(string $name): CodegenUsesTrait { return new CodegenUsesTrait($this->getConfig(), $name); } final public function codegenUsesTraits( Traversable<string> $names, ): vec<CodegenUsesTrait> { return Vec\map($names, $x ==> $this->codegenUsesTrait($x)); } final public function codegenGeneratedFromClass( string $class, ): CodegenGeneratedFrom { return new CodegenGeneratedFrom($this->getConfig(), 'Generated from '.$class); } final public function codegenGeneratedFromMethod( string $class, string $method, ): CodegenGeneratedFrom { return new CodegenGeneratedFrom( $this->getConfig(), 'Generated from '.$class.'::'.$method.'()', ); } final public function codegenGeneratedFromMethodWithKey( string $class, string $method, string $key, ): CodegenGeneratedFrom { return new CodegenGeneratedFrom( $this->getConfig(), 'Generated from '.$class.'::'.$method."()['".$key."']", ); } final public function codegenGeneratedFromScript( ?string $script = null, ): CodegenGeneratedFrom { if ($script === null) { $last = \debug_backtrace() |> Vec\filter($$, $frame ==> C\contains_key($frame, 'file')) |> C\last($$); invariant( $last !== null, "Couldn't get the strack trace. Please pass the script name to ". 'codegenGeneratedFromScript', ); $script = $this->codegenFile($last['file'])->getRelativeFileName(); } return new CodegenGeneratedFrom( $this->getConfig(), 'To re-generate this file run '.$script, ); } final public function codegenShape( CodegenShapeMember ...$members ): CodegenShape { return new CodegenShape($this->getConfig(), vec($members)); } final public function codegenType(string $name): CodegenType { return new CodegenType($this->getConfig(), $name); } final public function codegenNewtype(string $name): CodegenType { return (new CodegenType($this->getConfig(), $name))->newType(); } final public function codegenXHPAttribute(string $name): CodegenXHPAttribute { return new CodegenXHPAttribute($this->getConfig(), $name); } final public function codegenXHPAttributef( Str\SprintfFormatString $format, mixed ...$args ): CodegenXHPAttribute { return $this->codegenXHPAttribute(\vsprintf($format, $args)); } }