Skip to content

Commit ce7daa3

Browse files
committed
added ability to add sort functions
1 parent 1563ac5 commit ce7daa3

File tree

6 files changed

+128
-14
lines changed

6 files changed

+128
-14
lines changed

src/CG/Core/DefaultGeneratorStrategy.php

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,42 @@
22

33
namespace CG\Core;
44

5+
use CG\Generator\DefaultVisitorInterface;
56
use CG\Generator\PhpClass;
67
use CG\Generator\DefaultVisitor;
78
use CG\Generator\DefaultNavigator;
89

910
class DefaultGeneratorStrategy implements GeneratorStrategyInterface
1011
{
11-
public function generate(PhpClass $class)
12+
private $navigator;
13+
private $visitor;
14+
15+
public function __construct(DefaultVisitorInterface $visitor = null)
1216
{
13-
static $navigator;
17+
$this->navigator = new DefaultNavigator();
18+
$this->visitor = $visitor ?: new DefaultVisitor();
19+
}
1420

15-
if (empty($navigator)) {
16-
$navigator = new DefaultNavigator();
17-
}
21+
public function setConstantSortFunc(\Closure $func = null)
22+
{
23+
$this->navigator->setConstantSortFunc($func);
24+
}
1825

19-
$visitor = new DefaultVisitor();
20-
$navigator->accept($visitor, $class);
26+
public function setMethodSortFunc(\Closure $func = null)
27+
{
28+
$this->navigator->setMethodSortFunc($func);
29+
}
30+
31+
public function setPropertySortFunc(\Closure $func = null)
32+
{
33+
$this->navigator->setPropertySortFunc($func);
34+
}
35+
36+
public function generate(PhpClass $class)
37+
{
38+
$this->visitor->reset();
39+
$this->navigator->accept($this->visitor, $class);
2140

22-
return $visitor->getContent();
41+
return $this->visitor->getContent();
2342
}
2443
}

src/CG/Generator/DefaultNavigator.php

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,33 @@
44

55
class DefaultNavigator
66
{
7+
private $constantSortFunc;
8+
private $propertySortFunc;
9+
private $methodSortFunc;
10+
11+
public function setConstantSortFunc(\Closure $func = null)
12+
{
13+
$this->constantSortFunc = $func;
14+
}
15+
16+
public function setPropertySortFunc(\Closure $func = null)
17+
{
18+
$this->propertySortFunc = $func;
19+
}
20+
21+
public function setMethodSortFunc(\Closure $func = null)
22+
{
23+
$this->methodSortFunc = $func;
24+
}
25+
726
public function accept(DefaultVisitorInterface $visitor, PhpClass $class)
827
{
928
$visitor->startVisitingClass($class);
1029

1130
$constants = $class->getConstants();
1231
if (!empty($constants)) {
32+
uksort($constants, $this->getConstantSortFunc());
33+
1334
$visitor->startVisitingConstants();
1435
foreach ($constants as $name => $value) {
1536
$visitor->visitConstant($name, $value);
@@ -19,6 +40,8 @@ public function accept(DefaultVisitorInterface $visitor, PhpClass $class)
1940

2041
$properties = $class->getProperties();
2142
if (!empty($properties)) {
43+
usort($properties, $this->getPropertySortFunc());
44+
2245
$visitor->startVisitingProperties();
2346
foreach ($properties as $property) {
2447
$visitor->visitProperty($property);
@@ -28,6 +51,8 @@ public function accept(DefaultVisitorInterface $visitor, PhpClass $class)
2851

2952
$methods = $class->getMethods();
3053
if (!empty($methods)) {
54+
usort($methods, $this->getMethodSortFunc());
55+
3156
$visitor->startVisitingMethods();
3257
foreach ($methods as $method) {
3358
$visitor->visitMethod($method);
@@ -37,4 +62,69 @@ public function accept(DefaultVisitorInterface $visitor, PhpClass $class)
3762

3863
$visitor->endVisitingClass($class);
3964
}
65+
66+
private function getConstantSortFunc()
67+
{
68+
return $this->constantSortFunc ?: 'strcasecmp';
69+
}
70+
71+
private function getMethodSortFunc()
72+
{
73+
if (null !== $this->methodSortFunc) {
74+
return $this->methodSortFunc;
75+
}
76+
77+
static $defaultSortFunc;
78+
if (empty($defaultSortFunc)) {
79+
$defaultSortFunc = function($a, $b) {
80+
if ($a->isStatic() !== $isStatic = $b->isStatic()) {
81+
return $isStatic ? 1 : -1;
82+
}
83+
84+
if (($aV = $a->getVisibility()) !== $bV = $b->getVisibility()) {
85+
$aV = 'public' === $aV ? 3 : ('protected' === $aV ? 2 : 1);
86+
$bV = 'public' === $bV ? 3 : ('protected' === $bV ? 2 : 1);
87+
88+
return $aV > $bV ? -1 : 1;
89+
}
90+
91+
$rs = strcasecmp($a->getName(), $b->getName());
92+
if (0 === $rs) {
93+
return 0;
94+
}
95+
96+
return $rs > 0 ? -1 : 1;
97+
};
98+
}
99+
100+
return $defaultSortFunc;
101+
}
102+
103+
private function getPropertySortFunc()
104+
{
105+
if (null !== $this->propertySortFunc) {
106+
return $this->propertySortFunc;
107+
}
108+
109+
static $defaultSortFunc;
110+
if (empty($defaultSortFunc)) {
111+
$defaultSortFunc = function($a, $b) {
112+
if (($aV = $a->getVisibility()) !== $bV = $b->getVisibility()) {
113+
$aV = 'public' === $aV ? 3 : ('protected' === $aV ? 2 : 1);
114+
$bV = 'public' === $bV ? 3 : ('protected' === $bV ? 2 : 1);
115+
116+
return $aV > $bV ? -1 : 1;
117+
}
118+
119+
$rs = strcasecmp($a->getName(), $b->getName());
120+
if (0 === $rs) {
121+
return 0;
122+
}
123+
124+
return $rs > 0 ? -1 : 1;
125+
};
126+
}
127+
128+
return $defaultSortFunc;
129+
}
40130
}

src/CG/Generator/DefaultVisitor.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ public function __construct()
1111
$this->writer = new Writer();
1212
}
1313

14+
public function reset()
15+
{
16+
$this->writer->reset();
17+
}
18+
1419
public function startVisitingClass(PhpClass $class)
1520
{
1621
if ($namespace = $class->getNamespace()) {

src/CG/Generator/DefaultVisitorInterface.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
interface DefaultVisitorInterface
66
{
7+
function reset();
78
function startVisitingClass(PhpClass $class);
89
function startVisitingConstants();
910
function visitConstant($name, $value);

src/CG/Generator/NavigatorInterface.php

Lines changed: 0 additions & 1 deletion
This file was deleted.

tests/CG/Tests/Proxy/Fixture/generated/LazyInitializingEntity.php.gen

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ class LazyInitializingEntity extends \CG\Tests\Proxy\Fixture\Entity
1111
private $__CG__lazyInitializer;
1212
private $__CG__initialized = false;
1313

14-
public function __CG__setLazyInitializer(\CG\Proxy\LazyInitializerInterface $initializer)
15-
{
16-
$this->__CG__lazyInitializer = $initializer;
17-
}
18-
1914
public function getName()
2015
{
2116
if (false === $this->__CG__initialized) {
@@ -25,6 +20,11 @@ class LazyInitializingEntity extends \CG\Tests\Proxy\Fixture\Entity
2520
return \CG\Tests\Proxy\Fixture\Entity::getName();
2621
}
2722

23+
public function __CG__setLazyInitializer(\CG\Proxy\LazyInitializerInterface $initializer)
24+
{
25+
$this->__CG__lazyInitializer = $initializer;
26+
}
27+
2828
private function __CG__initialize()
2929
{
3030
if (null === $this->__CG__lazyInitializer) {

0 commit comments

Comments
 (0)