Skip to content

Commit dfe9dc1

Browse files
committed
Make Reflection::package() accept instances, types and reflection
1 parent 314c8d5 commit dfe9dc1

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

src/main/php/lang/Reflection.class.php

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,28 @@ public static function type($arg) {
5959
/**
6060
* Returns a reflection package for a given argument.
6161
*
62-
* @param string
62+
* @param string|object|lang.XPClass|lang.reflection.Type|ReflectionClass $arg
6363
* @return lang.reflection.Type
6464
* @throws lang.IllegalArgumentException
6565
*/
6666
public static function package($arg) {
67-
$cl= ClassLoader::getDefault();
68-
$name= strtr($arg, '\\', '.');
69-
if ($cl->providesPackage($name)) {
70-
return new Package($name);
67+
if ($arg instanceof XPClass) {
68+
return new Package($arg->getPackage()->getName());
69+
} else if ($arg instanceof \ReflectionClass) {
70+
return new Package($arg->getNamespaceName());
71+
} else if ($arg instanceof Type) {
72+
return $arg->package();
73+
} else if (is_object($arg)) {
74+
$class= get_class($arg);
75+
return new Package(substr($class, 0, strrpos($class, '\\')));
76+
} else {
77+
$cl= ClassLoader::getDefault();
78+
$name= strtr($arg, '\\', '.');
79+
if ($cl->providesPackage($name)) {
80+
return new Package($name);
81+
}
82+
throw new IllegalArgumentException('No package named '.$name);
7183
}
72-
throw new IllegalArgumentException('No package named '.$name);
7384
}
7485

7586
/**

src/test/php/lang/reflection/unittest/ReflectionTest.class.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,13 @@ private function arguments() {
2121

2222
/** @return iterable */
2323
private function packages() {
24-
yield ['lang.reflection.unittest', 'lang.reflection.unittest'];
25-
yield [__NAMESPACE__, 'lang.reflection.unittest'];
24+
yield [__NAMESPACE__, 'namespace literal'];
25+
yield ['lang.reflection.unittest', 'namespace name'];
26+
yield [$this, 'instance'];
27+
yield [Type::forName(self::class), 'type'];
28+
yield [Reflection::of(self::class), 'reflection'];
29+
yield [new ReflectionClass($this), 'reflection class'];
30+
yield [new ReflectionObject($this), 'reflection object'];
2631
}
2732

2833
#[Test, Values(from: 'arguments')]
@@ -36,8 +41,8 @@ public function type($argument) {
3641
}
3742

3843
#[Test, Values(from: 'packages')]
39-
public function package($argument, $expected) {
40-
Assert::equals(new Package($expected), Reflection::package($argument));
44+
public function package($argument) {
45+
Assert::equals(new Package('lang.reflection.unittest'), Reflection::package($argument));
4146
}
4247

4348
#[Test]

0 commit comments

Comments
 (0)