Skip to content

Commit bddd248

Browse files
authored
Merge pull request #13 from shochdoerfer/fix/proxy_interfaces
Extend Proxy Autoloader to deal with interfaces
2 parents 4788be7 + 3c48251 commit bddd248

File tree

1 file changed

+66
-4
lines changed

1 file changed

+66
-4
lines changed

src/bitExpert/PHPStan/Magento/Autoload/ProxyAutoloader.php

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,63 @@ public function autoload(string $class): void
2222

2323
$namespace = explode('\\', ltrim($class, '\\'));
2424
$proxyClassname = array_pop($namespace);
25+
$proxyBaseClass = '';
2526
$originalClassname = implode('\\', $namespace);
2627
$namespace = implode('\\', $namespace);
27-
$markerInterface = '\Magento\Framework\ObjectManager\NoninterceptableInterface';
28+
$proxyInterface = ['\Magento\Framework\ObjectManager\NoninterceptableInterface'];
29+
$methods = '';
30+
31+
$reflectionClass = new \ReflectionClass($originalClassname);
32+
if ($reflectionClass->isInterface()) {
33+
$proxyInterface[] = '\\' . $originalClassname;
34+
foreach ($reflectionClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
35+
$returnType = $method->getReturnType() ?: '';
36+
if ($returnType instanceof \ReflectionType) {
37+
$returnType = ': ' . $returnType->getName();
38+
}
39+
40+
$params = [];
41+
foreach ($method->getParameters() as $parameter) {
42+
$paramType = $parameter->getType() ?: '';
43+
if ($paramType instanceof \ReflectionType) {
44+
if ($paramType->isBuiltin()) {
45+
$paramType = $paramType->getName() . ' ';
46+
} else {
47+
$paramType = '\\' . $paramType->getName() . ' ';
48+
}
49+
}
50+
51+
$defaultValue = '';
52+
if ($parameter->isDefaultValueAvailable()) {
53+
switch ($parameter->getDefaultValue()) {
54+
case null:
55+
$defaultValue = ' = NULL';
56+
break;
57+
case false:
58+
$defaultValue = ' = false';
59+
break;
60+
default:
61+
$defaultValue = ' = ' . $parameter->getDefaultValue();
62+
break;
63+
}
64+
}
65+
66+
$params[] = $paramType . '$' . $parameter->getName() . $defaultValue;
67+
}
68+
69+
$methods .= ' public function ' . $method->getName() . '(' . implode(', ', $params) . ')' .
70+
$returnType . " {}\n\n";
71+
}
72+
} else {
73+
$proxyBaseClass = ' extends ' . $originalClassname;
74+
}
2875

2976
$template = "<?php\n";
3077
$template .= "namespace {NAMESPACE};\n";
3178
$template .= "/**\n";
3279
$template .= " * Proxy class for @see {CLASSNAME}\n";
3380
$template .= " */\n";
34-
$template .= "class {PROXY_CLASSNAME} extends {CLASSNAME} implements {MARKER_INTERFACE}\n";
81+
$template .= "class {PROXY_CLASSNAME}{PROXY_BASE_CLASSNAME} implements {PROXY_INTERFACE}\n";
3582
$template .= "{\n";
3683
$template .= " /**\n";
3784
$template .= " * @return array\n";
@@ -45,11 +92,26 @@ public function autoload(string $class): void
4592
$template .= " * Clone proxied instance\n";
4693
$template .= " */\n";
4794
$template .= " public function __clone() {}\n";
95+
$template .= "{METHODS}";
4896
$template .= "}\n";
4997

5098
$template = str_replace(
51-
['{NAMESPACE}', '{CLASSNAME}', '{PROXY_CLASSNAME}', '{MARKER_INTERFACE}'],
52-
[$namespace, $originalClassname, $proxyClassname, $markerInterface],
99+
[
100+
'{NAMESPACE}',
101+
'{CLASSNAME}',
102+
'{PROXY_BASE_CLASSNAME}',
103+
'{PROXY_CLASSNAME}',
104+
'{PROXY_INTERFACE}',
105+
'{METHODS}'
106+
],
107+
[
108+
$namespace,
109+
$originalClassname,
110+
$proxyBaseClass,
111+
$proxyClassname,
112+
implode(', ', $proxyInterface),
113+
$methods
114+
],
53115
$template
54116
);
55117

0 commit comments

Comments
 (0)