Skip to content

Commit 4fb6ea8

Browse files
committed
Merge pull request #12 from RobinGeuze/master
Add PHP7 type hinting support
2 parents 0a303ab + 5489e2e commit 4fb6ea8

7 files changed

+250
-110
lines changed

src/config/CodeFileGeneratorConfig.php

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,39 @@
22
namespace gossi\codegen\config;
33

44
use gossi\docblock\Docblock;
5+
use Symfony\Component\OptionsResolver\Options;
6+
57
class CodeFileGeneratorConfig extends CodeGeneratorConfig {
68

79
protected function getOptionalOptions() {
810
return array_merge([
9-
'headerComment', 'headerDocblock', 'blankLineAtEnd'
11+
'headerComment', 'headerDocblock', 'blankLineAtEnd', 'declareStrictTypes'
1012
], parent::getOptionalOptions());
1113
}
1214

1315
protected function getDefaultOptions() {
14-
return array_merge([
16+
return array_merge(
17+
parent::getDefaultOptions(),
18+
[
1519
'headerComment' => '',
1620
'headerDocblock' => null,
17-
'blankLineAtEnd' => true
18-
], parent::getDefaultOptions());
21+
'blankLineAtEnd' => true,
22+
'declareStrictTypes' => false,
23+
'generateScalarTypeHints' => function(Options $options) {
24+
return $options['declareStrictTypes'];
25+
},
26+
'generateReturnTypeHints' => function(Options $options) {
27+
return $options['declareStrictTypes'];
28+
},
29+
]);
1930
}
2031

2132
protected function getAllowedOptionTypes() {
2233
return array_merge([
2334
'headerComment' => 'string',
2435
'headerDocblock' => ['null', 'gossi\\docblock\\Docblock'],
25-
'blankLineAtEnd' => 'bool'
36+
'blankLineAtEnd' => 'bool',
37+
'declareStrictTypes' => 'bool',
2638
], parent::getAllowedOptionTypes());
2739
}
2840

@@ -42,7 +54,7 @@ public function setHeaderComment($comment) {
4254
$this->options['headerComment'] = $comment;
4355
return $this;
4456
}
45-
57+
4658
/**
4759
* @return Docblock
4860
*/
@@ -59,7 +71,7 @@ public function setHeaderDocblock(Docblock $docblock) {
5971
$this->options['headerDocblock'] = $docblock;
6072
return $this;
6173
}
62-
74+
6375
/**
6476
* @return boolean
6577
*/
@@ -76,5 +88,21 @@ public function setBlankLineAtEnd($show) {
7688
$this->options['blankLineAtEnd'] = $show;
7789
return $this;
7890
}
79-
80-
}
91+
92+
/**
93+
* @return boolean
94+
*/
95+
public function getDeclareStrictTypes() {
96+
return $this->options['declareStrictTypes'];
97+
}
98+
99+
/**
100+
*
101+
* @param boolean $strict
102+
* @return $this
103+
*/
104+
public function setDeclareStrictTypes($strict) {
105+
$this->options['declareStrictTypes'] = $strict;
106+
return $this;
107+
}
108+
}

src/config/CodeGeneratorConfig.php

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,66 +4,109 @@
44
use Symfony\Component\OptionsResolver\OptionsResolver;
55

66
class CodeGeneratorConfig {
7-
7+
88
protected $options;
9-
9+
1010
public function __construct(array $options = []) {
1111
$resolver = new OptionsResolver();
1212
$resolver->setOptional($this->getOptionalOptions());
1313
$resolver->setAllowedTypes($this->getAllowedOptionTypes());
1414
$resolver->setDefaults($this->getDefaultOptions());
1515
$this->options = $resolver->resolve($options);
1616
}
17-
17+
1818
protected function getOptionalOptions() {
19-
return ['generateDocblock', 'generateEmptyDocblock'];
19+
return [
20+
'generateDocblock',
21+
'generateEmptyDocblock',
22+
'generateScalarTypeHints',
23+
'generateReturnTypeHints',
24+
];
2025
}
21-
26+
2227
protected function getDefaultOptions() {
2328
return [
2429
'generateDocblock' => true,
25-
'generateEmptyDocblock' => true
30+
'generateEmptyDocblock' => true,
31+
'generateScalarTypeHints' => false,
32+
'generateReturnTypeHints' => false,
2633
];
2734
}
28-
35+
2936
protected function getAllowedOptionTypes() {
3037
return [
3138
'generateDocblock' => 'bool',
3239
'generateEmptyDocblock' => 'bool',
40+
'generateScalarTypeHints' => 'bool',
41+
'generateReturnTypeHints' => 'bool',
3342
];
3443
}
35-
44+
3645
/**
3746
* @return boolean
3847
*/
3948
public function getGenerateDocblock() {
4049
return $this->options['generateDocblock'];
4150
}
42-
51+
4352
/**
44-
*
53+
*
4554
* @param boolean $generate
4655
* @return $this
4756
*/
4857
public function setGenerateDocblock($generate) {
4958
$this->options['generateDocblock'] = $generate;
5059
return $this;
5160
}
52-
61+
5362
/**
5463
* @return boolean
5564
*/
5665
public function getGenerateEmptyDocblock() {
5766
return $this->options['generateEmptyDocblock'];
5867
}
59-
68+
6069
/**
61-
*
70+
*
6271
* @param boolean $generate
6372
* @return $this
6473
*/
6574
public function setGenerateEmptyDocblock($generate) {
6675
$this->options['generateEmptyDocblock'] = $generate;
6776
return $this;
6877
}
78+
79+
/**
80+
* @return boolean
81+
*/
82+
public function getGenerateScalarTypeHints() {
83+
return $this->options['generateScalarTypeHints'];
84+
}
85+
86+
/**
87+
*
88+
* @param boolean $generate
89+
* @return $this
90+
*/
91+
public function setGenerateScalarTypeHints($generate) {
92+
$this->options['generateScalarTypeHints'] = $generate;
93+
return $this;
94+
}
95+
96+
/**
97+
* @return boolean
98+
*/
99+
public function getGenerateReturnTypeHints() {
100+
return $this->options['generateReturnTypeHints'];
101+
}
102+
103+
/**
104+
*
105+
* @param boolean $generate
106+
* @return $this
107+
*/
108+
public function setGenerateReturnTypeHints($generate) {
109+
$this->options['generateReturnTypeHints'] = $generate;
110+
return $this;
111+
}
69112
}

src/generator/CodeFileGenerator.php

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use gossi\docblock\Docblock;
77

88
class CodeFileGenerator extends CodeGenerator {
9-
9+
1010
/**
1111
* @param CodeFileGeneratorConfig|array $config
1212
*/
@@ -17,38 +17,42 @@ public function __construct($config = null) {
1717
$this->config = $config;
1818
} else {
1919
$this->config = new CodeFileGeneratorConfig();
20-
}
21-
20+
}
21+
2222
$this->init();
2323
}
24-
24+
2525
/**
2626
* @return CodeFileGeneratorConfig
2727
*/
2828
public function getConfig() {
2929
return $this->config;
3030
}
31-
31+
3232
public function generate(GenerateableInterface $model) {
3333
$content = "<?php\n";
34-
34+
3535
$comment = $this->config->getHeaderComment();
3636
if (!empty($comment)) {
3737
$docblock = new Docblock();
3838
$docblock->setLongDescription($comment);
3939
$content .= str_replace('/**', '/*', $docblock->toString()) . "\n";
4040
}
41-
41+
4242
if ($this->config->getHeaderDocblock() instanceof Docblock) {
4343
$content .= $this->config->getHeaderDocblock()->toString() . "\n";
4444
}
45-
45+
46+
if ($this->config->getDeclareStrictTypes()) {
47+
$content .= "declare(strict_types=1);\n\n";
48+
}
49+
4650
$content .= parent::generate($model);
47-
51+
4852
if ($this->config->getBlankLineAtEnd()) {
4953
$content .= "\n";
5054
}
51-
55+
5256
return $content;
5357
}
5458
}

src/generator/CodeGenerator.php

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
class CodeGenerator {
1010

1111
protected $config;
12-
12+
1313
/**
1414
* @var DefaultGeneratorStrategy
1515
*/
1616
protected $strategy;
17-
17+
1818
/**
19-
*
19+
*
2020
* @param CodeGeneratorConfig|array $config
2121
*/
2222
public function __construct($config = null) {
@@ -26,20 +26,16 @@ public function __construct($config = null) {
2626
$this->config = $config;
2727
} else {
2828
$this->config = new CodeGeneratorConfig();
29-
}
29+
}
3030

3131
$this->init();
3232
}
33-
33+
3434
protected function init() {
35-
if ($this->config->getGenerateEmptyDocblock()) {
36-
$visitor = new EmptyDocblockVisitor();
37-
} else {
38-
$visitor = new DefaultVisitor();
39-
}
35+
$visitor = new DefaultVisitor($this->config);
4036
$this->strategy = new DefaultGeneratorStrategy($visitor);
4137
}
42-
38+
4339
/**
4440
* @return CodeGeneratorConfig
4541
*/
@@ -58,5 +54,5 @@ public function generate(GenerateableInterface $model) {
5854

5955
return $this->strategy->generate($model);
6056
}
61-
57+
6258
}

0 commit comments

Comments
 (0)