Skip to content

Commit 818bac3

Browse files
committed
[TASK] Make node transformers stateless
1 parent d1e6385 commit 818bac3

File tree

5 files changed

+45
-53
lines changed

5 files changed

+45
-53
lines changed

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/AbstractMenuEntryNodeTransformer.php

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,35 @@
1515
use function assert;
1616
use function count;
1717

18-
/** @implements NodeTransformer<MenuNode|MenuEntryNode> */
18+
/** @implements NodeTransformer<MenuEntryNode> */
1919
abstract class AbstractMenuEntryNodeTransformer implements NodeTransformer
2020
{
21-
private MenuNode|null $currentMenu = null;
22-
2321
public function __construct(
2422
protected readonly LoggerInterface $logger,
2523
) {
2624
}
2725

28-
final public function enterNode(Node $node, CompilerContext $compilerContext): Node
26+
final public function enterNode(Node $node, CompilerContext $compilerContext): MenuEntryNode
2927
{
30-
if ($node instanceof MenuNode) {
31-
$this->currentMenu = $node;
32-
}
33-
3428
return $node;
3529
}
3630

37-
final public function leaveNode(Node $node, CompilerContext $compilerContext): Node|null
31+
/** @param MenuEntryNode $node */
32+
final public function leaveNode(Node $node, CompilerContext $compilerContext): MenuEntryNode|null
3833
{
39-
if ($node instanceof MenuNode) {
40-
$this->currentMenu = null;
41-
42-
return $node;
34+
assert($node instanceof MenuEntryNode);
35+
$currentMenuShaddow = $compilerContext->getShadowTree()->getParent();
36+
while ($currentMenuShaddow !== null && !$currentMenuShaddow->getNode() instanceof MenuNode) {
37+
$currentMenuShaddow = $currentMenuShaddow->getParent();
4338
}
4439

45-
if ($this->currentMenu === null) {
40+
$currentMenu = $currentMenuShaddow?->getNode();
41+
42+
if (!$currentMenu instanceof MenuNode) {
4643
throw new Exception('A MenuEntryNode must be attached to a MenuNode');
4744
}
4845

49-
assert($node instanceof MenuEntryNode);
50-
51-
$menuEntries = $this->handleMenuEntry($this->currentMenu, $node, $compilerContext);
46+
$menuEntries = $this->handleMenuEntry($currentMenu, $node, $compilerContext);
5247

5348
if (count($menuEntries) === 0) {
5449
return null;
@@ -66,5 +61,5 @@ final public function leaveNode(Node $node, CompilerContext $compilerContext): N
6661
}
6762

6863
/** @return list<MenuEntryNode> */
69-
abstract protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, CompilerContext $compilerContext): array;
64+
abstract protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNode, CompilerContext $compilerContext): array;
7065
}

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/ContentsMenuEntryNodeTransformer.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,27 @@ final class ContentsMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransf
2323

2424
public function supports(Node $node): bool
2525
{
26-
return $node instanceof MenuNode || $node instanceof SectionMenuEntryNode;
26+
return $node instanceof SectionMenuEntryNode;
2727
}
2828

2929
/** @return list<MenuEntryNode> */
30-
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, CompilerContext $compilerContext): array
30+
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNode, CompilerContext $compilerContext): array
3131
{
3232
if (!$currentMenu instanceof ContentMenuNode) {
33-
return [$node];
33+
return [$entryNode];
3434
}
3535

36-
assert($node instanceof SectionMenuEntryNode);
36+
assert($entryNode instanceof SectionMenuEntryNode);
3737
$depth = (int) $currentMenu->getOption('depth', self::DEFAULT_MAX_LEVELS - 1) + 1;
3838
$documentEntry = $compilerContext->getDocumentNode()->getDocumentEntry();
39-
$menuEntry = new SectionMenuEntryNode(
39+
$newEntryNode = new SectionMenuEntryNode(
4040
$documentEntry->getFile(),
41-
$node->getValue() ?? $documentEntry->getTitle(),
41+
$entryNode->getValue() ?? $documentEntry->getTitle(),
4242
1,
4343
);
44-
$this->addSubSectionsToMenuEntries($documentEntry, $menuEntry, $depth);
44+
$this->addSubSectionsToMenuEntries($documentEntry, $newEntryNode, $depth);
4545

46-
return $menuEntry->getSections();
46+
return $newEntryNode->getSections();
4747
}
4848

4949
public function getPriority(): int

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/GlobMenuEntryNodeTransformer.php

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
1010
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
1111
use phpDocumentor\Guides\Nodes\Menu\MenuNode;
12-
use phpDocumentor\Guides\Nodes\Menu\NavMenuNode;
1312
use phpDocumentor\Guides\Nodes\Menu\TocNode;
1413
use phpDocumentor\Guides\Nodes\Node;
1514

@@ -30,17 +29,17 @@ final class GlobMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransforme
3029
private const DEFAULT_MAX_LEVELS = 10;
3130

3231
/** @return list<MenuEntryNode> */
33-
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, CompilerContext $compilerContext): array
32+
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNode, CompilerContext $compilerContext): array
3433
{
35-
assert($node instanceof GlobMenuEntryNode);
34+
assert($entryNode instanceof GlobMenuEntryNode);
3635
$maxDepth = (int) $currentMenu->getOption('maxdepth', self::DEFAULT_MAX_LEVELS);
3736
$documentEntries = $compilerContext->getProjectNode()->getAllDocumentEntries();
3837
$currentPath = $compilerContext->getDocumentNode()->getFilePath();
3938
$globExclude = explode(',', $currentMenu->getOption('globExclude') . '');
4039
$menuEntries = [];
4140
foreach ($documentEntries as $documentEntry) {
4241
if (
43-
!self::matches($documentEntry->getFile(), $node, $currentPath, $globExclude)
42+
!self::matches($documentEntry->getFile(), $entryNode, $currentPath, $globExclude)
4443
) {
4544
continue;
4645
}
@@ -50,15 +49,15 @@ protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, C
5049
continue;
5150
}
5251

53-
foreach ($currentMenu->getChildren() as $menuEntry) {
54-
if ($menuEntry instanceof InternalMenuEntryNode && $menuEntry->getUrl() === $documentEntry->getFile()) {
52+
foreach ($currentMenu->getChildren() as $currentMenuEntry) {
53+
if ($currentMenuEntry instanceof InternalMenuEntryNode && $currentMenuEntry->getUrl() === $documentEntry->getFile()) {
5554
// avoid duplicates
5655
continue 2;
5756
}
5857
}
5958

6059
$documentEntriesInTree[] = $documentEntry;
61-
$menuEntry = new InternalMenuEntryNode(
60+
$newEntryNode = new InternalMenuEntryNode(
6261
$documentEntry->getFile(),
6362
$documentEntry->getTitle(),
6463
[],
@@ -69,22 +68,22 @@ protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, C
6968
$this->isCurrent($documentEntry, $currentPath),
7069
);
7170
if (!$currentMenu->hasOption('titlesonly')) {
72-
$this->addSubSectionsToMenuEntries($documentEntry, $menuEntry, $maxDepth - 1);
71+
$this->addSubSectionsToMenuEntries($documentEntry, $newEntryNode, $maxDepth - 1);
7372
}
7473

7574
if ($currentMenu instanceof TocNode) {
7675
$this->attachDocumentEntriesToParents($documentEntriesInTree, $compilerContext, $currentPath);
7776
}
7877

79-
$menuEntries[] = $menuEntry;
78+
$menuEntries[] = $newEntryNode;
8079
}
8180

8281
return $menuEntries;
8382
}
8483

8584
public function supports(Node $node): bool
8685
{
87-
return $node instanceof TocNode || $node instanceof NavMenuNode || $node instanceof GlobMenuEntryNode;
86+
return $node instanceof GlobMenuEntryNode;
8887
}
8988

9089
public function getPriority(): int

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/InternalMenuEntryNodeTransformer.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,27 +26,27 @@ class InternalMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransformer
2626

2727
public function supports(Node $node): bool
2828
{
29-
return $node instanceof MenuNode || $node instanceof InternalMenuEntryNode;
29+
return $node instanceof InternalMenuEntryNode;
3030
}
3131

3232
/** @return list<MenuEntryNode> */
33-
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, CompilerContext $compilerContext): array
33+
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNode, CompilerContext $compilerContext): array
3434
{
35-
assert($node instanceof InternalMenuEntryNode);
35+
assert($entryNode instanceof InternalMenuEntryNode);
3636
$documentEntries = $compilerContext->getProjectNode()->getAllDocumentEntries();
3737
$currentPath = $compilerContext->getDocumentNode()->getFilePath();
3838
$maxDepth = (int) $currentMenu->getOption('maxdepth', self::DEFAULT_MAX_LEVELS);
3939
foreach ($documentEntries as $documentEntry) {
4040
if (
41-
!self::matches($documentEntry->getFile(), $node, $currentPath)
41+
!self::matches($documentEntry->getFile(), $entryNode, $currentPath)
4242
) {
4343
continue;
4444
}
4545

4646
$documentEntriesInTree[] = $documentEntry;
47-
$menuEntry = new InternalMenuEntryNode(
47+
$newEntryNode = new InternalMenuEntryNode(
4848
$documentEntry->getFile(),
49-
$node->getValue() ?? $documentEntry->getTitle(),
49+
$entryNode->getValue() ?? $documentEntry->getTitle(),
5050
[],
5151
false,
5252
1,
@@ -55,17 +55,17 @@ protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, C
5555
$this->isCurrent($documentEntry, $currentPath),
5656
);
5757
if (!$currentMenu->hasOption('titlesonly') && $maxDepth > 1) {
58-
$this->addSubSectionsToMenuEntries($documentEntry, $menuEntry, $maxDepth);
58+
$this->addSubSectionsToMenuEntries($documentEntry, $newEntryNode, $maxDepth);
5959
}
6060

6161
if ($currentMenu instanceof TocNode) {
6262
$this->attachDocumentEntriesToParents($documentEntriesInTree, $compilerContext, $currentPath);
6363
}
6464

65-
return [$menuEntry];
65+
return [$newEntryNode];
6666
}
6767

68-
return [$node];
68+
return [$entryNode];
6969
}
7070

7171
private static function matches(string $actualFile, InternalMenuEntryNode $parsedMenuEntryNode, string $currentFile): bool

packages/guides/src/Compiler/NodeTransformers/MenuNodeTransformers/SubInternalMenuEntryNodeTransformer.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
use phpDocumentor\Guides\Nodes\Menu\InternalMenuEntryNode;
1010
use phpDocumentor\Guides\Nodes\Menu\MenuEntryNode;
1111
use phpDocumentor\Guides\Nodes\Menu\MenuNode;
12-
use phpDocumentor\Guides\Nodes\Menu\NavMenuNode;
13-
use phpDocumentor\Guides\Nodes\Menu\TocNode;
1412
use phpDocumentor\Guides\Nodes\Node;
1513

1614
use function assert;
@@ -25,18 +23,18 @@ class SubInternalMenuEntryNodeTransformer extends AbstractMenuEntryNodeTransform
2523

2624
public function supports(Node $node): bool
2725
{
28-
return $node instanceof TocNode || $node instanceof NavMenuNode || $node instanceof InternalMenuEntryNode;
26+
return $node instanceof InternalMenuEntryNode;
2927
}
3028

3129
/** @return list<MenuEntryNode> */
32-
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $node, CompilerContext $compilerContext): array
30+
protected function handleMenuEntry(MenuNode $currentMenu, MenuEntryNode $entryNode, CompilerContext $compilerContext): array
3331
{
34-
assert($node instanceof InternalMenuEntryNode);
32+
assert($entryNode instanceof InternalMenuEntryNode);
3533
$maxDepth = (int) $currentMenu->getOption('maxdepth', self::DEFAULT_MAX_LEVELS);
36-
$documentEntryOfMenuEntry = $compilerContext->getProjectNode()->getDocumentEntry($node->getUrl());
37-
$this->addSubEntries($currentMenu, $compilerContext, $node, $documentEntryOfMenuEntry, $node->getLevel() + 1, $maxDepth);
34+
$documentEntryOfMenuEntry = $compilerContext->getProjectNode()->getDocumentEntry($entryNode->getUrl());
35+
$this->addSubEntries($currentMenu, $compilerContext, $entryNode, $documentEntryOfMenuEntry, $entryNode->getLevel() + 1, $maxDepth);
3836

39-
return [$node];
37+
return [$entryNode];
4038
}
4139

4240
public function getPriority(): int

0 commit comments

Comments
 (0)