diff --git a/src/CodegenFile.php b/src/CodegenFile.php index 46816287..868bf8d4 100644 --- a/src/CodegenFile.php +++ b/src/CodegenFile.php @@ -16,6 +16,13 @@ enum CodegenFileResult: int { CREATE = 2; } +enum CodegenFileType: int { + PHP = 0; + HACK_DECL = 1; + HACK_PARTIAL = 2; + HACK_STRICT = 3; +} + /** * File of generated code. The file is composed by classes. * The file will be signed, either as autogenerated or partially generated, @@ -23,7 +30,7 @@ enum CodegenFileResult: int { */ final class CodegenFile { - private bool $isStrict = false; + private CodegenFileType $fileType = CodegenFileType::HACK_PARTIAL; private ?string $docBlock; private string $fileName; private string $relativeFileName; @@ -175,10 +182,20 @@ public function rekeyManualSection(string $old_key, string $new_key): this { } /** - * Whether the generated file will be Hack strict mode + * Whether the generated file will be Hack strict mode or partial mode. + * For more flexibility, use setFileType. */ public function setIsStrict(bool $value): this { - $this->isStrict = $value; + if ($value) { + $this->setFileType(CodegenFileType::HACK_STRICT); + } else { + $this->setFileType(CodegenFileType::HACK_PARTIAL); + } + return $this; + } + + public function setFileType(CodegenFileType $type): this { + $this->fileType = $type; return $this; } @@ -202,14 +219,23 @@ public function getFormatter(): ?ICodegenFormatter { } + private function getFileTypeDeclaration(): string { + switch($this->fileType) { + case CodegenFileType::PHP: + return 'isStrict) { - $first_line .= ' // strict'; - } - $builder->addLine($first_line); + $builder->addLine($this->getFileTypeDeclaration()); $header = $this->config->getFileHeader(); if ($header) { foreach ($header as $line) { diff --git a/test/CodegenFileTestCase.codegen b/test/CodegenFileTestCase.codegen index 58dea2c4..ebf11d22 100644 --- a/test/CodegenFileTestCase.codegen +++ b/test/CodegenFileTestCase.codegen @@ -83,6 +83,18 @@ class PartiallyGenerated { class PartiallyGeneratedLoader { } +!@#$%codegentest:testPhpFile +> + */ + +class Foo { +} + !@#$%codegentest:testSaveAutogenerated > + */ + +class Foo { +} + diff --git a/test/CodegenFileTestCase.php b/test/CodegenFileTestCase.php index fdb582c1..873741b6 100644 --- a/test/CodegenFileTestCase.php +++ b/test/CodegenFileTestCase.php @@ -245,4 +245,22 @@ public function testNamespace() { self::assertUnchanged($code); } + public function testStrictFile() { + $code = test_codegen_file('no_file') + ->setIsStrict(true) + ->addClass(codegen_class('Foo')) + ->render(); + + self::assertUnchanged($code); + } + + public function testPhpFile() { + $code = test_codegen_file('no_file') + ->setFileType(CodegenFileType::PHP) + ->addClass(codegen_class('Foo')) + ->render(); + + self::assertUnchanged($code); + } + }