/
SymbolGenerator.php
100 lines (91 loc) · 2.8 KB
/
SymbolGenerator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
/**
* Concrete5 symbol file generator.
* Inspired by Laravel IDE Helper Generator by Barry vd. Heuvel <barryvdh@gmail.com>.
*/
namespace Concrete\Core\Support\Symbol;
use Concrete\Core\Foundation\ClassAliasList;
use Concrete\Core\Support\Symbol\ClassSymbol\ClassSymbol;
class SymbolGenerator
{
/**
* The ClassSymbol objects.
*
* @var ClassSymbol[]
*/
protected $classes = [];
/**
* All the alias namespaces.
*
* @var array
*/
protected $aliasNamespaces = [''];
public function __construct()
{
$list = ClassAliasList::getInstance();
foreach ($list->getRegisteredAliases() as $alias => $class) {
if (!class_exists($class)) {
echo "Error: $class doesn't exist.\n";
continue;
}
$this->registerClass($alias, $class);
}
}
/**
* Register a class alias, and store it in the classes array.
*
* @param $alias string
* @param $class string
*/
public function registerClass($alias, $class)
{
$classSymbol = new ClassSymbol($alias, $class);
$this->classes[$alias] = $classSymbol;
$aliasNamespace = $classSymbol->getAliasNamespace();
if (!in_array($aliasNamespace, $this->aliasNamespaces, true)) {
$this->aliasNamespaces[] = $aliasNamespace;
}
}
/**
* Render the classes.
*
* @param string $eol
* @param string $padding
* @param callable|null $methodFilter
*
* @return mixed|string
*/
public function render($eol = "\n", $padding = ' ', $methodFilter = null)
{
$lines = [];
$lines[] = '<?php';
$lines[] = '';
$lines[] = '// Generated on ' . date('c');
foreach ($this->aliasNamespaces as $namespace) {
$lines[] = '';
$lines[] = rtrim("namespace {$namespace}");
$lines[] = '{';
$addNewline = false;
if ($namespace === '') {
$lines[] = "{$padding}die('Access Denied.');";
$addNewline = true;
}
foreach ($this->classes as $class) {
if ($class->getAliasNamespace() === $namespace) {
$rendered_class = $class->render($eol, $padding, $methodFilter);
if ($rendered_class !== '') {
if ($addNewline === true) {
$lines[] = '';
} else {
$addNewline = true;
}
$lines[] = $padding . str_replace($eol, $eol . $padding, rtrim($rendered_class));
}
}
}
$lines[] = '}';
}
$lines[] = '';
return implode($eol, $lines);
}
}