Skip to content

Commit 7f8259b

Browse files
committed
added PhpReflection::getUseStatements()
1 parent 9b9b32c commit 7f8259b

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

src/DI/PhpReflection.php

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@ class PhpReflection
1818
{
1919
use Nette\StaticClass;
2020

21-
/** @var array for expandClassName() */
22-
private static $cache = [];
23-
24-
2521
/**
2622
* Returns an annotation value.
2723
* @return string|NULL
@@ -127,11 +123,7 @@ public static function expandClassName($name, \ReflectionClass $rc)
127123
return ltrim($name, '\\');
128124
}
129125

130-
$uses = & self::$cache[$rc->getName()];
131-
if ($uses === NULL) {
132-
self::$cache = self::parseUseStatemenets(file_get_contents($rc->getFileName()), $rc->getName()) + self::$cache;
133-
$uses = & self::$cache[$rc->getName()];
134-
}
126+
$uses = self::getUseStatements($rc);
135127
$parts = explode('\\', $name, 2);
136128
if (isset($uses[$parts[0]])) {
137129
$parts[0] = $uses[$parts[0]];
@@ -146,10 +138,28 @@ public static function expandClassName($name, \ReflectionClass $rc)
146138
}
147139

148140

141+
/**
142+
* @return array of [alias => class]
143+
*/
144+
public static function getUseStatements(\ReflectionClass $class)
145+
{
146+
static $cache = [];
147+
if (!isset($cache[$name = $class->getName()])) {
148+
if ($class->isInternal()) {
149+
$cache[$name] = [];
150+
} else {
151+
$code = file_get_contents($class->getFileName());
152+
$cache = self::parseUseStatemenets($code, $name) + $cache;
153+
}
154+
}
155+
return $cache[$name];
156+
}
157+
158+
149159
/**
150160
* Parses PHP code.
151161
* @param string
152-
* @return array
162+
* @return array of [class => [alias => class, ...]]
153163
*/
154164
public static function parseUseStatemenets($code, $forClass = NULL)
155165
{

tests/DI/PhpReflection.expandClassName.phpt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,23 @@ foreach ($cases as $alias => $fqn) {
115115
Assert::same($fqn[0], PhpReflection::expandClassName($alias, $rcFoo));
116116
Assert::same($fqn[1], PhpReflection::expandClassName($alias, $rcBar));
117117
}
118+
119+
120+
Assert::same(
121+
['C' => 'A\B'],
122+
PhpReflection::getUseStatements(new ReflectionClass('Test'))
123+
);
124+
125+
Assert::same(
126+
[],
127+
PhpReflection::getUseStatements(new ReflectionClass('Test\Space\Foo'))
128+
);
129+
130+
Assert::same(
131+
['AAA' => 'AAA', 'B' => 'BBB', 'DDD' => 'CCC\DDD', 'F' => 'EEE\FFF', 'G' => 'GGG'],
132+
PhpReflection::getUseStatements(new ReflectionClass('Test\Space\Bar'))
133+
);
134+
Assert::same(
135+
[],
136+
PhpReflection::getUseStatements(new ReflectionClass('stdClass'))
137+
);

0 commit comments

Comments
 (0)