Skip to content

Commit aec22be

Browse files
committed
road to v0.4
1 parent 55b21a5 commit aec22be

File tree

132 files changed

+4076
-3031
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+4076
-3031
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
disabled=125tests/generator/generated123tests/Visitor/generated113tests/fixture123tests/visitor/generated06vendor
1+
disabled=125tests/generator/generated123tests/Visitor/generated114tests/fixtures123tests/visitor/generated06vendor
22
eclipse.preferences.version=1

src/config/CodeFileGeneratorConfig.php

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,52 +3,51 @@
33

44
use gossi\docblock\Docblock;
55
use Symfony\Component\OptionsResolver\Options;
6+
use Symfony\Component\OptionsResolver\OptionsResolver;
67

78
/**
89
* Configuration for code file generation
910
*
1011
* @author Thomas Gossmann
1112
*/
1213
class CodeFileGeneratorConfig extends CodeGeneratorConfig {
14+
15+
protected function configureOptions(OptionsResolver $resolver) {
16+
parent::configureOptions($resolver);
1317

14-
/**
15-
* @inheritDoc
16-
*/
17-
protected function getOptionalOptions() {
18-
return array_merge([
19-
'headerComment', 'headerDocblock', 'blankLineAtEnd', 'declareStrictTypes'
20-
], parent::getOptionalOptions());
18+
$resolver->setDefaults([
19+
'headerComment' => null,
20+
'headerDocblock' => null,
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+
]);
30+
31+
$resolver->setAllowedTypes('headerComment', ['null', 'string', 'gossi\\docblock\\Docblock']);
32+
$resolver->setAllowedTypes('headerDocblock', ['null', 'string', 'gossi\\docblock\\Docblock']);
33+
$resolver->setAllowedTypes('blankLineAtEnd', 'bool');
34+
$resolver->setAllowedTypes('declareStrictTypes', 'bool');
35+
36+
37+
$resolver->setNormalizer('headerComment', function (Options $options, $value) {
38+
return $this->toDocblock($value);
39+
});
40+
$resolver->setNormalizer('headerDocblock', function (Options $options, $value) {
41+
return $this->toDocblock($value);
42+
});
2143
}
22-
23-
/**
24-
* @inheritDoc
25-
*/
26-
protected function getDefaultOptions() {
27-
return array_merge(
28-
parent::getDefaultOptions(), [
29-
'headerComment' => '',
30-
'headerDocblock' => null,
31-
'blankLineAtEnd' => true,
32-
'declareStrictTypes' => false,
33-
'generateScalarTypeHints' => function (Options $options) {
34-
return $options['declareStrictTypes'];
35-
},
36-
'generateReturnTypeHints' => function (Options $options) {
37-
return $options['declareStrictTypes'];
38-
},
39-
]);
40-
}
41-
42-
/**
43-
* @inheritDoc
44-
*/
45-
protected function getAllowedOptionTypes() {
46-
return array_merge([
47-
'headerComment' => 'string',
48-
'headerDocblock' => ['null', 'gossi\\docblock\\Docblock'],
49-
'blankLineAtEnd' => 'bool',
50-
'declareStrictTypes' => 'bool',
51-
], parent::getAllowedOptionTypes());
44+
45+
private function toDocblock($value) {
46+
if (is_string($value)) {
47+
$value = Docblock::create()->setLongDescription($value);
48+
}
49+
50+
return $value;
5251
}
5352

5453
/**

src/config/CodeGeneratorConfig.php

Lines changed: 122 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php
22
namespace gossi\codegen\config;
33

4+
use gossi\codegen\generator\CodeGenerator;
5+
use phootwork\lang\Comparator;
46
use Symfony\Component\OptionsResolver\Options;
57
use Symfony\Component\OptionsResolver\OptionsResolver;
68

@@ -21,56 +23,34 @@ class CodeGeneratorConfig {
2123
*/
2224
public function __construct(array $options = []) {
2325
$resolver = new OptionsResolver();
24-
$resolver->setDefined($this->getOptionalOptions());
25-
$resolver->setDefaults($this->getDefaultOptions());
26-
foreach ($this->getAllowedOptionTypes() as $option => $type) {
27-
$resolver->setAllowedTypes($option, $type);
28-
}
26+
$this->configureOptions($resolver);
2927
$this->options = $resolver->resolve($options);
3028
}
31-
32-
/**
33-
* Return optional config options
34-
*
35-
* @return array
36-
*/
37-
protected function getOptionalOptions() {
38-
return [
39-
'generateDocblock',
40-
'generateEmptyDocblock',
41-
'generateScalarTypeHints',
42-
'generateReturnTypeHints',
43-
];
44-
}
45-
46-
/**
47-
* Return default config options
48-
*
49-
* @return array
50-
*/
51-
protected function getDefaultOptions() {
52-
return [
29+
30+
protected function configureOptions(OptionsResolver $resolver) {
31+
$resolver->setDefaults([
5332
'generateDocblock' => true,
5433
'generateEmptyDocblock' => function (Options $options) {
5534
return $options['generateDocblock'];
5635
},
5736
'generateScalarTypeHints' => false,
5837
'generateReturnTypeHints' => false,
59-
];
60-
}
61-
62-
/**
63-
* Return allowed option types
64-
*
65-
* @return array
66-
*/
67-
protected function getAllowedOptionTypes() {
68-
return [
69-
'generateDocblock' => 'bool',
70-
'generateEmptyDocblock' => 'bool',
71-
'generateScalarTypeHints' => 'bool',
72-
'generateReturnTypeHints' => 'bool',
73-
];
38+
'enableSorting' => true,
39+
'useStatementSorting' => CodeGenerator::SORT_USESTATEMENTS_DEFAULT,
40+
'constantSorting' => CodeGenerator::SORT_CONSTANTS_DEFAULT,
41+
'propertySorting' => CodeGenerator::SORT_PROPERTIES_DEFAULT,
42+
'methodSorting' => CodeGenerator::SORT_METHODS_DEFAULT
43+
]);
44+
45+
$resolver->setAllowedTypes('generateDocblock', 'bool');
46+
$resolver->setAllowedTypes('generateEmptyDocblock', 'bool');
47+
$resolver->setAllowedTypes('generateScalarTypeHints', 'bool');
48+
$resolver->setAllowedTypes('generateReturnTypeHints', 'bool');
49+
$resolver->setAllowedTypes('enableSorting', 'bool');
50+
$resolver->setAllowedTypes('useStatementSorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']);
51+
$resolver->setAllowedTypes('constantSorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']);
52+
$resolver->setAllowedTypes('propertySorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']);
53+
$resolver->setAllowedTypes('methodSorting', ['bool', 'string', '\Closure', 'phootwork\lang\Comparator']);
7454
}
7555

7656
/**
@@ -127,6 +107,51 @@ public function setGenerateEmptyDocblock($generate) {
127107
public function getGenerateScalarTypeHints() {
128108
return $this->options['generateScalarTypeHints'];
129109
}
110+
111+
/**
112+
* Returns whether sorting is enabled
113+
*
114+
* @return bool `true` if it is enabled and `false` if not
115+
*/
116+
public function isSortingEnabled() {
117+
return $this->options['enableSorting'];
118+
}
119+
120+
/**
121+
* Returns the use statement sorting
122+
*
123+
* @return string|bool|Comparator|\Closure
124+
*/
125+
public function getUseStatementSorting() {
126+
return $this->options['useStatementSorting'];
127+
}
128+
129+
/**
130+
* Returns the constant sorting
131+
*
132+
* @return string|bool|Comparator|\Closure
133+
*/
134+
public function getConstantSorting() {
135+
return $this->options['constantSorting'];
136+
}
137+
138+
/**
139+
* Returns the property sorting
140+
*
141+
* @return string|bool|Comparator|\Closure
142+
*/
143+
public function getPropertySorting() {
144+
return $this->options['propertySorting'];
145+
}
146+
147+
/**
148+
* Returns the method sorting
149+
*
150+
* @return string|bool|Comparator|\Closure
151+
*/
152+
public function getMethodSorting() {
153+
return $this->options['methodSorting'];
154+
}
130155

131156
/**
132157
* Sets whether scalar type hints will be generated for method parameters (PHP 7)
@@ -158,4 +183,59 @@ public function setGenerateReturnTypeHints($generate) {
158183
$this->options['generateReturnTypeHints'] = $generate;
159184
return $this;
160185
}
186+
187+
/**
188+
* Returns whether sorting is enabled
189+
*
190+
* @param $enabled bool `true` if it is enabled and `false` if not
191+
* @return $this
192+
*/
193+
public function setSortingEnabled($enabled) {
194+
$this->options['enableSorting'] = $enabled;
195+
return $this;
196+
}
197+
198+
/**
199+
* Returns the use statement sorting
200+
*
201+
* @param $sorting string|bool|Comparator|\Closure
202+
* @return $this
203+
*/
204+
public function setUseStatementSorting($sorting) {
205+
$this->options['useStatementSorting'] = $sorting;
206+
return $this;
207+
}
208+
209+
/**
210+
* Returns the constant sorting
211+
*
212+
* @param $sorting string|bool|Comparator|\Closure
213+
* @return $this
214+
*/
215+
public function setConstantSorting($sorting) {
216+
$this->options['constantSorting'] = $sorting;
217+
return $this;
218+
}
219+
220+
/**
221+
* Returns the property sorting
222+
*
223+
* @param $sorting string|bool|Comparator|\Closure
224+
* @return $this
225+
*/
226+
public function setPropertySorting($sorting) {
227+
$this->options['propertySorting'] = $sorting;
228+
return $this;
229+
}
230+
231+
/**
232+
* Returns the method sorting
233+
*
234+
* @param $sorting string|bool|Comparator|\Closure
235+
* @return $this
236+
*/
237+
public function setMethodSorting($sorting) {
238+
$this->options['methodSorting'] = $sorting;
239+
return $this;
240+
}
161241
}

src/generator/BuilderFactory.php

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
namespace gossi\codegen\generator;
3+
4+
use gossi\codegen\generator\builder\AbstractBuilder;
5+
use gossi\codegen\generator\builder\ClassBuilder;
6+
use gossi\codegen\generator\builder\ConstantBuilder;
7+
use gossi\codegen\generator\builder\FunctionBuilder;
8+
use gossi\codegen\generator\builder\InterfaceBuilder;
9+
use gossi\codegen\generator\builder\MethodBuilder;
10+
use gossi\codegen\generator\builder\ParameterBuilder;
11+
use gossi\codegen\generator\builder\PropertyBuilder;
12+
use gossi\codegen\generator\builder\TraitBuilder;
13+
use gossi\codegen\model\AbstractModel;
14+
use gossi\codegen\model\PhpClass;
15+
use gossi\codegen\model\PhpConstant;
16+
use gossi\codegen\model\PhpFunction;
17+
use gossi\codegen\model\PhpInterface;
18+
use gossi\codegen\model\PhpMethod;
19+
use gossi\codegen\model\PhpParameter;
20+
use gossi\codegen\model\PhpProperty;
21+
use gossi\codegen\model\PhpTrait;
22+
23+
class BuilderFactory {
24+
25+
/** @var ModelGenerator */
26+
private $generator;
27+
28+
private $classBuilder;
29+
private $constantBuilder;
30+
private $functionBuilder;
31+
private $interfaceBuilder;
32+
private $methodBuilder;
33+
private $parameterBuilder;
34+
private $propertyBuilder;
35+
private $traitBuilder;
36+
37+
public function __construct(ModelGenerator $generator) {
38+
$this->generator = $generator;
39+
$this->classBuilder = new ClassBuilder($generator);
40+
$this->constantBuilder = new ConstantBuilder($generator);
41+
$this->functionBuilder = new FunctionBuilder($generator);
42+
$this->interfaceBuilder = new InterfaceBuilder($generator);
43+
$this->methodBuilder = new MethodBuilder($generator);
44+
$this->parameterBuilder = new ParameterBuilder($generator);
45+
$this->propertyBuilder = new PropertyBuilder($generator);
46+
$this->traitBuilder = new TraitBuilder($generator);
47+
}
48+
49+
/**
50+
* Returns the related builder for the given model
51+
*
52+
* @param AbstractModel $model
53+
* @return AbstractBuilder
54+
*/
55+
public function getBuilder(AbstractModel $model) {
56+
if ($model instanceof PhpClass) {
57+
return $this->classBuilder;
58+
}
59+
60+
if ($model instanceof PhpConstant) {
61+
return $this->constantBuilder;
62+
}
63+
64+
if ($model instanceof PhpFunction) {
65+
return $this->functionBuilder;
66+
}
67+
68+
if ($model instanceof PhpInterface) {
69+
return $this->interfaceBuilder;
70+
}
71+
72+
if ($model instanceof PhpMethod) {
73+
return $this->methodBuilder;
74+
}
75+
76+
if ($model instanceof PhpParameter) {
77+
return $this->parameterBuilder;
78+
}
79+
80+
if ($model instanceof PhpProperty) {
81+
return $this->propertyBuilder;
82+
}
83+
84+
if ($model instanceof PhpTrait) {
85+
return $this->traitBuilder;
86+
}
87+
88+
return null;
89+
}
90+
91+
}

0 commit comments

Comments
 (0)