diff --git a/src/config/CodeGeneratorConfig.php b/src/config/CodeGeneratorConfig.php index f0744f6..b31ebeb 100644 --- a/src/config/CodeGeneratorConfig.php +++ b/src/config/CodeGeneratorConfig.php @@ -39,13 +39,15 @@ protected function configureOptions(OptionsResolver $resolver) { 'useStatementSorting' => CodeGenerator::SORT_USESTATEMENTS_DEFAULT, 'constantSorting' => CodeGenerator::SORT_CONSTANTS_DEFAULT, 'propertySorting' => CodeGenerator::SORT_PROPERTIES_DEFAULT, - 'methodSorting' => CodeGenerator::SORT_METHODS_DEFAULT + 'methodSorting' => CodeGenerator::SORT_METHODS_DEFAULT, + 'generatePsrCode' => false ]); $resolver->setAllowedTypes('generateDocblock', 'bool'); $resolver->setAllowedTypes('generateEmptyDocblock', 'bool'); $resolver->setAllowedTypes('generateScalarTypeHints', 'bool'); $resolver->setAllowedTypes('generateReturnTypeHints', 'bool'); + $resolver->setAllowedTypes('generatePsrCode', 'bool'); $resolver->setAllowedTypes('enableSorting', 'bool'); $resolver->setAllowedTypes('useStatementSorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']); $resolver->setAllowedTypes('constantSorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']); @@ -107,7 +109,16 @@ public function setGenerateEmptyDocblock($generate) { public function getGenerateScalarTypeHints() { return $this->options['generateScalarTypeHints']; } - + + /** + * Returns whether PSR-code compatible will be generated + * + * @return bool `true` if they will be generated and `false` if not + */ + public function getGeneratePsrCode() { + return $this->options['generatePsrCode']; + } + /** * Returns whether sorting is enabled * @@ -116,7 +127,7 @@ public function getGenerateScalarTypeHints() { public function isSortingEnabled() { return $this->options['enableSorting']; } - + /** * Returns the use statement sorting * @@ -164,6 +175,16 @@ public function setGenerateScalarTypeHints($generate) { return $this; } + /** + * @param bool $generate `true` if they will be generated and `false` if not + * @return $this + */ + public function setGeneratePsrCode($generate) { + $this->options['generatePsrCode'] = $generate; + + return $this; + } + /** * Returns whether return type hints will be generated for method parameters (PHP 7) * diff --git a/src/generator/builder/ClassBuilder.php b/src/generator/builder/ClassBuilder.php index 7ef9b62..3a82580 100644 --- a/src/generator/builder/ClassBuilder.php +++ b/src/generator/builder/ClassBuilder.php @@ -20,9 +20,14 @@ public function build(AbstractModel $model) { // signature $this->buildSignature($model); - + // body - $this->writer->writeln(" {\n")->indent(); + if ($this->config->getGeneratePsrCode()) { + $this->writer->writeln("\n{")->indent(); + } else { + $this->writer->writeln(" {\n")->indent(); + } + $this->buildTraits($model); $this->buildConstants($model); $this->buildProperties($model); diff --git a/src/generator/builder/parts/RoutineBuilderPart.php b/src/generator/builder/parts/RoutineBuilderPart.php index 3dd1c2a..09f10c5 100644 --- a/src/generator/builder/parts/RoutineBuilderPart.php +++ b/src/generator/builder/parts/RoutineBuilderPart.php @@ -47,7 +47,12 @@ protected function writeFunctionReturnType(RoutineInterface $model) { } protected function writeBody(RoutineInterface $model) { - $this->writer->writeln(' {')->indent(); + if ($this->config->getGeneratePsrCode()) { + $this->writer->writeln("\n{")->indent(); + } else { + $this->writer->writeln(" {")->indent(); + } + $this->writer->writeln(trim($model->getBody())); $this->writer->outdent()->rtrim()->writeln('}'); } diff --git a/tests/config/ConfigTest.php b/tests/config/ConfigTest.php index 7ab4314..56cee5c 100644 --- a/tests/config/ConfigTest.php +++ b/tests/config/ConfigTest.php @@ -56,7 +56,10 @@ public function testCodeGeneratorConfigSetters() { $config->setGenerateScalarTypeHints(true); $this->assertTrue($config->getGenerateScalarTypeHints()); - + + $config->setGeneratePsrCode(true); + $this->assertTrue($config->getGeneratePsrCode()); + $config->setUseStatementSorting(false); $this->assertFalse($config->getUseStatementSorting()); diff --git a/tests/generator/ClassGeneratorTest.php b/tests/generator/ClassGeneratorTest.php index c731493..3278c12 100644 --- a/tests/generator/ClassGeneratorTest.php +++ b/tests/generator/ClassGeneratorTest.php @@ -111,7 +111,7 @@ public function testABClass() { $code = $generator->generate($class); $this->assertEquals($modelCode, $code); } - + public function testRequireTraitsClass() { $class = PhpClass::create('RequireTraitsClass') ->addRequiredFile('FooBar.php') @@ -123,4 +123,14 @@ public function testRequireTraitsClass() { $this->assertEquals($this->getGeneratedContent('RequireTraitsClass.php'), $code); } + public function testPsrClass() { + $expected = 'class MyClass' . "\n" . '{' . "\n" . '}'; + + $class = PhpClass::create('MyClass'); + $generator = new ModelGenerator(['generatePsrCode' => true, 'generateDocblock' => false]); + $code = $generator->generate($class); + + $this->assertEquals($expected, $code); + } + } diff --git a/tests/generator/MethodGeneratorTest.php b/tests/generator/MethodGeneratorTest.php index cec6d29..6c78219 100644 --- a/tests/generator/MethodGeneratorTest.php +++ b/tests/generator/MethodGeneratorTest.php @@ -90,4 +90,14 @@ public function testReturnType() { $this->assertEquals($expected, $generator->generate($method)); } + public function testPsrCode() { + $expected = "public function foo()\n{\n}\n"; + + $method = PhpMethod::create('foo'); + $generator = new ModelGenerator(['generatePsrCode' => true, 'generateDocblock' => false]); + $code = $generator->generate($method); + + $this->assertEquals($expected, $code); + } + }