Skip to content

Commit 0956ca3

Browse files
committed
Handle more Reflector class
1 parent 6d5ac03 commit 0956ca3

File tree

1 file changed

+57
-23
lines changed

1 file changed

+57
-23
lines changed

src/Types/ContextFactory.php

+57-23
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,40 @@
1414
namespace phpDocumentor\Reflection\Types;
1515

1616
use ArrayIterator;
17-
use InvalidArgumentException;
17+
use RuntimeException;
18+
use Reflector;
1819
use ReflectionClass;
19-
use ReflectionClassConstant;
2020
use ReflectionMethod;
21-
use ReflectionParameter;
21+
use ReflectionFunction;
2222
use ReflectionProperty;
23-
use Reflector;
24-
use RuntimeException;
23+
use ReflectionParameter;
24+
use ReflectionAttribute;
25+
use ReflectionClassConstant;
26+
use InvalidArgumentException;
2527
use UnexpectedValueException;
2628

29+
use const T_AS;
30+
use const T_USE;
31+
use const T_TRAIT;
32+
use const T_CLASS;
33+
use const T_STRING;
34+
use const T_NAMESPACE;
35+
use const T_CURLY_OPEN;
36+
use const T_NS_SEPARATOR;
37+
use const T_NAME_QUALIFIED;
38+
use const T_NAME_FULLY_QUALIFIED;
39+
use const T_DOLLAR_OPEN_CURLY_BRACES;
40+
use function trim;
2741
use function define;
42+
use function substr;
2843
use function defined;
29-
use function file_exists;
30-
use function file_get_contents;
31-
use function get_class;
44+
use function strrpos;
3245
use function in_array;
46+
use function get_class;
3347
use function is_string;
34-
use function strrpos;
35-
use function substr;
48+
use function file_exists;
3649
use function token_get_all;
37-
use function trim;
38-
39-
use const T_AS;
40-
use const T_CLASS;
41-
use const T_CURLY_OPEN;
42-
use const T_DOLLAR_OPEN_CURLY_BRACES;
43-
use const T_NAME_FULLY_QUALIFIED;
44-
use const T_NAME_QUALIFIED;
45-
use const T_NAMESPACE;
46-
use const T_NS_SEPARATOR;
47-
use const T_STRING;
48-
use const T_TRAIT;
49-
use const T_USE;
50+
use function file_get_contents;
5051

5152
if (!defined('T_NAME_QUALIFIED')) {
5253
define('T_NAME_QUALIFIED', 10001);
@@ -103,6 +104,14 @@ public function createFromReflector(Reflector $reflector): Context
103104
return $this->createFromReflectionClassConstant($reflector);
104105
}
105106

107+
if ($reflector instanceof ReflectionFunction) {
108+
return $this->createFromReflectionFunction($reflector);
109+
}
110+
111+
if ($reflector instanceof ReflectionAttribute) {
112+
return $this->createFromReflectionAttribute($reflector);
113+
}
114+
106115
throw new UnexpectedValueException('Unhandled \Reflector instance given: ' . get_class($reflector));
107116
}
108117

@@ -159,6 +168,31 @@ private function createFromReflectionClass(ReflectionClass $class): Context
159168
return new Context($namespace, []);
160169
}
161170

171+
private function createFromReflectionFunction(ReflectionFunction $function): Context
172+
{
173+
$fileName = $function->getFileName();
174+
$namespace = $function->getNamespaceName();
175+
176+
if (is_string($fileName) && file_exists($fileName)) {
177+
$contents = file_get_contents($fileName);
178+
if ($contents === false) {
179+
throw new RuntimeException('Unable to read file "' . $fileName . '"');
180+
}
181+
182+
return $this->createForNamespace($namespace, $contents);
183+
}
184+
185+
return new Context($namespace, []);
186+
}
187+
188+
private function createFromReflectionAttribute(ReflectionAttribute $attribute): Context
189+
{
190+
$name = $attribute->getName();
191+
$class = new ReflectionClass($name);
192+
193+
return $this->createFromReflectionClass($class);
194+
}
195+
162196
/**
163197
* Build a Context for a namespace in the provided file contents.
164198
*

0 commit comments

Comments
 (0)