Skip to content

Commit 673ccd1

Browse files
committed
ClassType: checks whether names are valid
1 parent 81a5a06 commit 673ccd1

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/PhpGenerator/ClassType.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,9 +218,10 @@ public function isAbstract(): bool
218218
*/
219219
public function setExtends($names): self
220220
{
221-
if (!is_string($names) && !(is_array($names) && Nette\Utils\Arrays::every($names, 'is_string'))) {
221+
if (!is_string($names) && !is_array($names)) {
222222
throw new Nette\InvalidArgumentException('Argument must be string or string[].');
223223
}
224+
$this->validate((array) $names);
224225
$this->extends = $names;
225226
return $this;
226227
}
@@ -240,6 +241,7 @@ public function getExtends()
240241
*/
241242
public function addExtend(string $name): self
242243
{
244+
$this->validate([$name]);
243245
$this->extends = (array) $this->extends;
244246
$this->extends[] = $name;
245247
return $this;
@@ -252,6 +254,7 @@ public function addExtend(string $name): self
252254
*/
253255
public function setImplements(array $names): self
254256
{
257+
$this->validate($names);
255258
$this->implements = $names;
256259
return $this;
257260
}
@@ -271,6 +274,7 @@ public function getImplements(): array
271274
*/
272275
public function addImplement(string $name): self
273276
{
277+
$this->validate([$name]);
274278
$this->implements[] = $name;
275279
return $this;
276280
}
@@ -282,6 +286,7 @@ public function addImplement(string $name): self
282286
*/
283287
public function setTraits(array $names): self
284288
{
289+
$this->validate($names);
285290
$this->traits = array_fill_keys($names, []);
286291
return $this;
287292
}
@@ -301,6 +306,7 @@ public function getTraits(): array
301306
*/
302307
public function addTrait(string $name, array $resolutions = []): self
303308
{
309+
$this->validate([$name]);
304310
$this->traits[$name] = $resolutions;
305311
return $this;
306312
}
@@ -459,4 +465,14 @@ public function addMethod(string $name): Method
459465
return $this->methods[$name] = $method;
460466
}
461467

468+
469+
private function validate(array $names)
470+
{
471+
foreach ($names as $name) {
472+
if (!Helpers::isNamespaceIdentifier($name, TRUE)) {
473+
throw new Nette\InvalidArgumentException("Value '$name' is not valid class name.");
474+
}
475+
}
476+
}
477+
462478
}

tests/PhpGenerator/invalidNames.phpt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,36 @@ Assert::exception(function () {
6363
}, Nette\InvalidArgumentException::class);
6464

6565

66+
$class = new Nette\PhpGenerator\ClassType('Abc');
67+
Assert::exception(function () use ($class) {
68+
$class->setExtends('*');
69+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
70+
71+
Assert::exception(function () use ($class) {
72+
$class->setExtends(['A', '*']);
73+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
74+
75+
Assert::exception(function () use ($class) {
76+
$class->addExtend('*');
77+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
78+
79+
Assert::exception(function () use ($class) {
80+
$class->setImplements(['A', '*']);
81+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
82+
83+
Assert::exception(function () use ($class) {
84+
$class->addImplement('*');
85+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
86+
87+
Assert::exception(function () use ($class) {
88+
$class->setTraits(['A', '*']);
89+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
90+
91+
Assert::exception(function () use ($class) {
92+
$class->addTrait('*');
93+
}, Nette\InvalidArgumentException::class, "Value '*' is not valid class name.");
94+
95+
6696
Assert::noError(function () {
6797
new Nette\PhpGenerator\Property('Iñtërnâtiônàlizætiøn');
6898
});

0 commit comments

Comments
 (0)