Skip to content

Commit fb46dc6

Browse files
committed
ClassLike accepts FQN in constructor
1 parent 23113a7 commit fb46dc6

3 files changed

Lines changed: 64 additions & 13 deletions

File tree

src/PhpGenerator/ClassLike.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace Nette\PhpGenerator;
99

1010
use Nette;
11-
use function array_map, is_object, strtolower;
11+
use function array_map, is_object, str_contains, strtolower;
1212

1313

1414
/**
@@ -64,8 +64,13 @@ public static function fromCode(string $code): static
6464

6565
public function __construct(string $name, ?PhpNamespace $namespace = null)
6666
{
67-
$this->setName($name);
68-
$this->namespace = $namespace;
67+
if (str_contains($name, '\\')) {
68+
$this->namespace = new PhpNamespace(Helpers::extractNamespace($name));
69+
$this->setName(Helpers::extractShortName($name));
70+
} else {
71+
$this->namespace = $namespace;
72+
$this->setName($name);
73+
}
6974
}
7075

7176

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php declare(strict_types=1);
2+
3+
/**
4+
* Test: ClassLike with FQN in constructor
5+
*/
6+
7+
use Nette\PhpGenerator\ClassType;
8+
use Nette\PhpGenerator\EnumType;
9+
use Nette\PhpGenerator\InterfaceType;
10+
use Nette\PhpGenerator\PhpNamespace;
11+
use Nette\PhpGenerator\TraitType;
12+
use Tester\Assert;
13+
14+
require __DIR__ . '/../bootstrap.php';
15+
16+
17+
// ClassType with FQN
18+
$class = new ClassType('App\Model\User');
19+
Assert::same('User', $class->getName());
20+
Assert::same('App\Model', $class->getNamespace()->getName());
21+
22+
23+
// InterfaceType with FQN
24+
$interface = new InterfaceType('App\Contracts\Countable');
25+
Assert::same('Countable', $interface->getName());
26+
Assert::same('App\Contracts', $interface->getNamespace()->getName());
27+
28+
29+
// TraitType with FQN
30+
$trait = new TraitType('App\Traits\Timestampable');
31+
Assert::same('Timestampable', $trait->getName());
32+
Assert::same('App\Traits', $trait->getNamespace()->getName());
33+
34+
35+
// EnumType with FQN
36+
$enum = new EnumType('App\Enums\Status');
37+
Assert::same('Status', $enum->getName());
38+
Assert::same('App\Enums', $enum->getNamespace()->getName());
39+
40+
41+
// Single level namespace
42+
$class = new ClassType('Nette\Utils');
43+
Assert::same('Utils', $class->getName());
44+
Assert::same('Nette', $class->getNamespace()->getName());
45+
46+
47+
// No namespace
48+
$class = new ClassType('User');
49+
Assert::same('User', $class->getName());
50+
Assert::null($class->getNamespace());
51+
52+
53+
// FQN namespace has precedence over explicit namespace parameter
54+
$class = new ClassType('App\Model\User', new PhpNamespace('Explicit\Namespace'));
55+
Assert::same('User', $class->getName());
56+
Assert::same('App\Model', $class->getNamespace()->getName());

tests/PhpGenerator/invalidNames.phpt

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,6 @@ Assert::exception(
7575
Nette\InvalidArgumentException::class,
7676
);
7777

78-
Assert::exception(
79-
fn() => new Nette\PhpGenerator\ClassType('abc\abc'),
80-
Nette\InvalidArgumentException::class,
81-
);
82-
83-
Assert::exception(
84-
fn() => new Nette\PhpGenerator\ClassType('\abc'),
85-
Nette\InvalidArgumentException::class,
86-
);
87-
8878
Assert::exception(
8979
fn() => new Nette\PhpGenerator\ClassType('bool'),
9080
Nette\InvalidArgumentException::class,

0 commit comments

Comments
 (0)