Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d63c9e6

Browse files
committed
add nullable types for php7.3
1 parent d67b8f9 commit d63c9e6

File tree

8 files changed

+80
-6
lines changed

8 files changed

+80
-6
lines changed

src/config/CodeGeneratorConfig.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ protected function configureOptions(OptionsResolver $resolver): void {
4343
},
4444
'generateScalarTypeHints' => false,
4545
'generateReturnTypeHints' => false,
46+
'generateNullableTypes' => false,
4647
'enableFormatting' => false,
4748
'enableSorting' => true,
4849
'useStatementSorting' => CodeGenerator::SORT_USESTATEMENTS_DEFAULT,
@@ -56,6 +57,7 @@ protected function configureOptions(OptionsResolver $resolver): void {
5657
$resolver->setAllowedTypes('generateEmptyDocblock', 'bool');
5758
$resolver->setAllowedTypes('generateScalarTypeHints', 'bool');
5859
$resolver->setAllowedTypes('generateReturnTypeHints', 'bool');
60+
$resolver->setAllowedTypes('generateNullableTypes', 'bool');
5961
$resolver->setAllowedTypes('enableFormatting', 'bool');
6062
$resolver->setAllowedTypes('enableSorting', 'bool');
6163
$resolver->setAllowedTypes('useStatementSorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']);
@@ -141,6 +143,8 @@ public function setGenerateEmptyDocblock(bool $generate) {
141143
public function getGenerateScalarTypeHints(): bool {
142144
return $this->options['generateScalarTypeHints'];
143145
}
146+
147+
144148

145149
/**
146150
* Returns whether sorting is enabled
@@ -226,6 +230,26 @@ public function setGenerateReturnTypeHints(bool $generate) {
226230
$this->options['generateReturnTypeHints'] = $generate;
227231
return $this;
228232
}
233+
234+
/**
235+
* Returns whether return nullable type hints will be generated (PHP 7.3)
236+
*
237+
* @return bool `true` if they will be generated and `false` if not
238+
*/
239+
public function getGenerateNullableTypes(): bool {
240+
return $this->options['generateNullableTypes'];
241+
}
242+
243+
/**
244+
* Sets whether return nullable type hints will be generated (PHP 7.3)
245+
*
246+
* @param bool $generate `true` if they will be generated and `false` if not
247+
* @return $this
248+
*/
249+
public function setGenerateNullableTypes(bool $generate) {
250+
$this->options['generateNullableTypes'] = $generate;
251+
return $this;
252+
}
229253

230254
/**
231255
* Sets whether sorting is enabled

src/generator/builder/ParameterBuilder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class ParameterBuilder extends AbstractBuilder {
1313
use TypeBuilderPart;
1414

1515
public function build(AbstractModel $model): void {
16-
$type = $this->getType($model, $this->config->getGenerateScalarTypeHints());
16+
$type = $this->getType($model, $this->config->getGenerateScalarTypeHints(), $this->config->getGenerateNullableTypes());
1717
if ($type !== null) {
1818
$this->writer->write($type . ' ');
1919
}

src/generator/builder/parts/RoutineBuilderPart.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ protected function writeParameters(RoutineInterface $model): void {
4242
}
4343

4444
protected function writeFunctionReturnType(RoutineInterface $model): void {
45-
$type = $this->getType($model, $this->config->getGenerateReturnTypeHints());
45+
$type = $this->getType($model, $this->config->getGenerateReturnTypeHints(), $this->config->getGenerateNullableTypes());
4646
if ($type !== null && $this->config->getGenerateReturnTypeHints()) {
4747
$this->writer->write(': ')->write($type);
4848
}

src/generator/builder/parts/TypeBuilderPart.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,20 @@ trait TypeBuilderPart {
3131
* @param bool $allowed
3232
* @return string|null
3333
*/
34-
private function getType(AbstractModel $model, bool $allowed): ?string {
34+
private function getType(AbstractModel $model, bool $allowed, bool $nullable): ?string {
3535
$type = $model->getType();
3636
if (!empty($type) && strpos($type, '|') === false
3737
&& (!in_array($type, self::$noTypeHints)
3838
|| ($allowed && in_array($type, self::$php7typeHints)))
3939
) {
40-
if (isset(self::$typeHintMap[$type])) {
41-
return self::$typeHintMap[$type];
42-
}
40+
41+
$type = isset(self::$typeHintMap[$type])
42+
? self::$typeHintMap[$type]
43+
: $type;
44+
45+
if ($nullable && $model->getNullable()) {
46+
$type = '?' . $type;
47+
}
4348

4449
return $type;
4550
}

src/model/parts/TypePart.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ trait TypePart {
1717

1818
/** @var string */
1919
private $typeDescription;
20+
21+
/** @var bool */
22+
private $typeNullable;
2023

2124
/**
2225
* Sets the type
@@ -62,4 +65,24 @@ public function getType(): ?string {
6265
public function getTypeDescription(): ?string {
6366
return $this->typeDescription;
6467
}
68+
69+
/**
70+
* Returns whether the type is nullable
71+
*
72+
* @return bool
73+
*/
74+
public function getNullable(): bool {
75+
return $this->typeNullable;
76+
}
77+
78+
/**
79+
* Sets the type nullable
80+
*
81+
* @param bool $nullable
82+
* @return $this
83+
*/
84+
public function setNullable(bool $nullable) {
85+
$this->typeNullable = $nullable;
86+
return $this;
87+
}
6588
}

tests/config/ConfigTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ public function testCodeGeneratorConfigSetters() {
6363

6464
$config->setGenerateScalarTypeHints(true);
6565
$this->assertTrue($config->getGenerateScalarTypeHints());
66+
67+
$config->setGenerateNullableTypes(true);
68+
$this->assertTrue($config->getGenerateNullableTypes());
6669

6770
$config->setUseStatementSorting(false);
6871
$this->assertFalse($config->getUseStatementSorting());

tests/generator/MethodGeneratorTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,17 @@ public function testReturnType() {
9090
$method = PhpMethod::create('foo')->setType('int');
9191
$this->assertEquals($expected, $generator->generate($method));
9292
}
93+
94+
public function testNullableReturnType() {
95+
$expected = "public function foo(): ?int {\n}\n";
96+
$generator = new ModelGenerator([
97+
'generateReturnTypeHints' => true,
98+
'generateDocblock' => false,
99+
'generateNullableTypes' => true
100+
]);
101+
102+
$method = PhpMethod::create('foo')->setType('int')->setNullable(true);
103+
$this->assertEquals($expected, $generator->generate($method));
104+
}
93105

94106
}

tests/generator/ParameterGeneratorTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,13 @@ public function testPhp7TypeHints() {
9595
$param = PhpParameter::create('foo')->setType('resource');
9696
$this->assertEquals('$foo', $generator->generate($param));
9797
}
98+
99+
public function testPhp73Nullable() {
100+
$generator = new ModelGenerator(['generateScalarTypeHints' => true, 'generateNullableTypes' => true]);
101+
102+
$param = PhpParameter::create('foo')->setType('float')->setNullable(true);
103+
$this->assertEquals('?float $foo', $generator->generate($param));
104+
}
98105

99106
public function testValues() {
100107
$generator = new ModelGenerator();

0 commit comments

Comments
 (0)