Skip to content

Commit c93ab11

Browse files
committed
added support for readonly classes
1 parent 1769a2e commit c93ab11

11 files changed

+61
-3
lines changed

composer.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nette/php-generator",
3-
"description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.1 features.",
3+
"description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.2 features.",
44
"keywords": ["nette", "php", "code", "scaffolding"],
55
"homepage": "https://nette.org",
66
"license": ["BSD-3-Clause", "GPL-2.0-only", "GPL-3.0-only"],
@@ -20,7 +20,7 @@
2020
},
2121
"require-dev": {
2222
"nette/tester": "^2.4",
23-
"nikic/php-parser": "^4.13",
23+
"nikic/php-parser": "^4.14",
2424
"tracy/tracy": "^2.8",
2525
"phpstan/phpstan": "^1.0"
2626
},

readme.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public function __construct(
141141
}
142142
```
143143

144-
Readonly properties introduced by PHP 8.1 can be marked via `setReadOnly()`.
144+
Readonly properties and classes can be marked via `setReadOnly()`.
145145

146146
------
147147

src/PhpGenerator/ClassType.php

+14
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ final class ClassType extends ClassLike
3636
private bool $final = false;
3737
private bool $abstract = false;
3838
private ?string $extends = null;
39+
private bool $readOnly = false;
3940

4041
/** @var string[] */
4142
private array $implements = [];
@@ -172,6 +173,19 @@ public function isAbstract(): bool
172173
}
173174

174175

176+
public function setReadOnly(bool $state = true): static
177+
{
178+
$this->readOnly = $state;
179+
return $this;
180+
}
181+
182+
183+
public function isReadOnly(): bool
184+
{
185+
return $this->readOnly;
186+
}
187+
188+
175189
public function setExtends(?string $name): static
176190
{
177191
if ($name) {

src/PhpGenerator/Extractor.php

+1
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ private function addClassToFile(PhpFile $phpFile, Node\Stmt\Class_ $node): Class
246246

247247
$class->setFinal($node->isFinal());
248248
$class->setAbstract($node->isAbstract());
249+
$class->setReadOnly(method_exists($node, 'isReadonly') && $node->isReadonly());
249250
$this->addCommentAndAttributes($class, $node);
250251
return $class;
251252
}

src/PhpGenerator/Factory.php

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ public function fromClassReflection(
5555
$class = new ClassType($from->getShortName(), new PhpNamespace($from->getNamespaceName()));
5656
$class->setFinal($from->isFinal() && $class->isClass());
5757
$class->setAbstract($from->isAbstract() && $class->isClass());
58+
$class->setReadOnly(PHP_VERSION_ID >= 80200 && $from->isReadOnly());
5859
}
5960

6061
$ifaces = $from->getInterfaceNames();

src/PhpGenerator/Printer.php

+1
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ public function printClass(
226226
if ($class instanceof ClassType) {
227227
$line[] = $class->isAbstract() ? 'abstract' : null;
228228
$line[] = $class->isFinal() ? 'final' : null;
229+
$line[] = $class->isReadOnly() ? 'readonly' : null;
229230
}
230231

231232
$line[] = match (true) {
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
/**
4+
* @phpVersion 8.2
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Nette\PhpGenerator\ClassType;
10+
11+
12+
require __DIR__ . '/../bootstrap.php';
13+
require __DIR__ . '/fixtures/classes.82.php';
14+
15+
$res[] = ClassType::from(new Abc\Class13);
16+
17+
sameFile(__DIR__ . '/expected/ClassType.from.82.expect', implode("\n", $res));

tests/PhpGenerator/Extractor.extractAll.phpt

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ sameFile(__DIR__ . '/expected/Extractor.classes.expect', (string) $file);
1515
$file = (new Extractor(file_get_contents(__DIR__ . '/fixtures/classes.81.php')))->extractAll();
1616
sameFile(__DIR__ . '/expected/Extractor.classes.81.expect', (string) $file);
1717

18+
$file = (new Extractor(file_get_contents(__DIR__ . '/fixtures/classes.82.php')))->extractAll();
19+
sameFile(__DIR__ . '/expected/Extractor.classes.82.expect', (string) $file);
20+
1821
$file = (new Extractor(file_get_contents(__DIR__ . '/fixtures/enum.php')))->extractAll();
1922
sameFile(__DIR__ . '/expected/Extractor.enum.expect', (string) $file);
2023

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
readonly class Class13
2+
{
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Abc;
6+
7+
readonly class Class13
8+
{
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Abc;
6+
7+
readonly class Class13
8+
{
9+
}

0 commit comments

Comments
 (0)