Skip to content

Commit 82bb703

Browse files
committed
ClassLike accepts FQN in constructor
1 parent 46e91fe commit 82bb703

File tree

3 files changed

+66
-13
lines changed

3 files changed

+66
-13
lines changed

src/PhpGenerator/ClassLike.php

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

1212
use Nette;
13-
use function array_map, is_object, strtolower;
13+
use function array_map, is_object, str_contains, strtolower;
1414

1515

1616
/**
@@ -66,8 +66,13 @@ public static function fromCode(string $code): static
6666

6767
public function __construct(string $name, ?PhpNamespace $namespace = null)
6868
{
69-
$this->setName($name);
70-
$this->namespace = $namespace;
69+
if (str_contains($name, '\\')) {
70+
$this->namespace = new PhpNamespace(Helpers::extractNamespace($name));
71+
$this->setName(Helpers::extractShortName($name));
72+
} else {
73+
$this->namespace = $namespace;
74+
$this->setName($name);
75+
}
7176
}
7277

7378

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

80-
Assert::exception(
81-
fn() => new Nette\PhpGenerator\ClassType('abc\abc'),
82-
Nette\InvalidArgumentException::class,
83-
);
84-
85-
Assert::exception(
86-
fn() => new Nette\PhpGenerator\ClassType('\abc'),
87-
Nette\InvalidArgumentException::class,
88-
);
89-
9080
Assert::exception(
9181
fn() => new Nette\PhpGenerator\ClassType('bool'),
9282
Nette\InvalidArgumentException::class,

0 commit comments

Comments
 (0)