-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathCodeGenerator.php
More file actions
78 lines (69 loc) · 2.15 KB
/
CodeGenerator.php
File metadata and controls
78 lines (69 loc) · 2.15 KB
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
<?php
namespace PHPUnit\Extension\FunctionMocker;
use function sprintf;
use function strtr;
use function var_export;
class CodeGenerator
{
public static function generateFunction(string $namespace, string $function): string
{
$template = <<<'EOS'
namespace {namespace}
{
function {function}(...$args)
{
if (!isset($GLOBALS['__PHPUNIT_EXTENSION_FUNCTIONMOCKER'][__NAMESPACE__])) {
return \{function}(...$args);
}
return $GLOBALS['__PHPUNIT_EXTENSION_FUNCTIONMOCKER'][__NAMESPACE__]->{function}(...$args);
}
}
EOS;
return self::renderTemplate($template, ['namespace' => $namespace, 'function' => $function]);
}
public static function defineFunction(string $namespace, string $function): void
{
$code = static::generateFunction($namespace, $function);
eval($code);
}
public static function generateConstant($namespace, $constant, $value)
{
$template = <<<'EOS'
namespace {namespace}
{
if (!defined(__NAMESPACE__ . '\\{constant}')) {
define(__NAMESPACE__ . '\\{constant}', {value});
} elseif ({constant} !== {value}) {
throw new \RuntimeException(sprintf('Cannot redeclare constant "{constant}" in namespace "%s". Already defined as "%s"', __NAMESPACE__, {value}));
}
}
EOS;
return self::renderTemplate(
$template,
[
'namespace' => $namespace,
'constant' => $constant,
'value' => var_export($value, true),
]
);
}
public static function defineConstant(string $namespace, string $name, string $value): void
{
eval(self::generateConstant($namespace, $name, $value));
}
private static function renderTemplate(string $template, array $parameters): string
{
return strtr(
$template,
array_combine(
array_map(
function (string $key): string {
return '{' . $key . '}';
},
array_keys($parameters)
),
array_values($parameters)
)
);
}
}