Skip to content
This repository was archived by the owner on Aug 25, 2025. It is now read-only.

Commit 9af145b

Browse files
gmarcottefredemmott
authored andcommitted
Support for rendering enums in CodegenFile
Summary: In commit cd388d6 to hhvm/hack-codegen, CodegenEnum stopped extending CodegenClassish, which means that CodegenFile::addClass can no longer be used to add an Enum into CodegenFile. This diff adds methods CodegenFile::addEnum[s]/getEnums identical to addClass[es]/getClasses but that operate on CodegenEnum instances. When the CodegenFile is rendered, enums will be rendered after constants and before any functions or classes. Test Plan: Add a test case into tests/CodegenFileTest Issue #:
1 parent c84291f commit 9af145b

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

src/CodegenFile.hack

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ final class CodegenFile {
4545
private vec<CodegenType> $beforeTypes = vec[];
4646
private vec<CodegenType> $afterTypes = vec[];
4747
private vec<CodegenConstant> $consts = vec[];
48+
private vec<CodegenEnum> $enums = vec [];
4849
private bool $doClobber = false;
4950
protected ?CodegenGeneratedFrom $generatedFrom;
5051
private bool $isSignedFile = true;
@@ -84,6 +85,22 @@ final class CodegenFile {
8485
return $this;
8586
}
8687

88+
public function addEnums(Traversable<CodegenEnum> $enums): this {
89+
foreach ($enums as $enum) {
90+
$this->addEnum($enum);
91+
}
92+
return $this;
93+
}
94+
95+
public function addEnum(CodegenEnum $enum): this {
96+
$this->enums[] = $enum;
97+
return $this;
98+
}
99+
100+
public function getEnums(): vec<CodegenEnum> {
101+
return $this->enums;
102+
}
103+
87104
public function addClasses(Traversable<CodegenClassish> $classes): this {
88105
foreach ($classes as $class) {
89106
$this->addClass($class);
@@ -412,6 +429,10 @@ final class CodegenFile {
412429
foreach ($this->consts as $const) {
413430
$builder->ensureEmptyLine()->add($const->render());
414431
}
432+
foreach ($this->enums as $enum) {
433+
$builder->ensureNewLine()->newLine();
434+
$builder->add($enum->render());
435+
}
415436
foreach ($this->functions as $function) {
416437
$builder->ensureNewLine()->newLine();
417438
$builder->add($function->render());

tests/CodegenFileTest.codegen

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,21 @@ function my_func(
151151
);
152152
}
153153

154+
!@#$%codegentest:testGenerateEnums
155+
<?hh // strict
156+
// Codegen Tests
157+
/**
158+
* This file is generated. Do not modify it manually!
159+
*
160+
* @-generated SignedSource<<9627a8d7e6cf7a65a9bf2ad85d657e03>>
161+
*/
162+
163+
164+
enum TestEnum : int {
165+
FIRST = 0;
166+
SECOND = 1;
167+
}
168+
154169
!@#$%codegentest:testGenerateTopLevelFunctions
155170
<?hh // strict
156171
// Codegen Tests

tests/CodegenFileTest.hack

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,20 @@ final class CodegenFileTest extends CodegenBaseTest {
4242
expect_with_context(static::class, $code)->toBeUnchanged();
4343
}
4444

45+
public function testGenerateEnums(): void {
46+
$cgf = $this->getCodegenFactory();
47+
$enum = $cgf->codegenEnum('TestEnum', 'int')
48+
->addMember(
49+
$cgf->codegenEnumMember('FIRST')
50+
->setValue(0, HackBuilderValues::export()))
51+
->addMember(
52+
$cgf->codegenEnumMember('SECOND')
53+
->setValue(1, HackBuilderValues::export()));
54+
$code = $cgf->codegenFile('no_file')->addEnum($enum)->render();
55+
56+
expect_with_context(static::class, $code)->toBeUnchanged();
57+
}
58+
4559
public function testPartiallyGenerated(): void {
4660
$cgf = $this->getCodegenFactory();
4761
$code = $cgf

0 commit comments

Comments
 (0)