Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit 15b578a

Browse files
committed
feat: Add TraitUsage class and integrate trait handling in Node relationships
1 parent 91f71bf commit 15b578a

File tree

4 files changed

+22
-111
lines changed

4 files changed

+22
-111
lines changed

src/ClassDiagramRenderer/Node/Node.php

Lines changed: 8 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -71,64 +71,22 @@ public function relationships(): array
7171
{
7272
$extends = $this->extends->getAll();
7373
$implements = $this->implements->getAll();
74-
$ownProperties = $this->properties->getAll();
75-
$ownDepends = $this->depends->getAll();
76-
77-
// Collect trait-derived relations (no mutation of own collections)
78-
$traitCompositions = [];
79-
$traitDependencies = [];
80-
$visitedTraits = [];
81-
foreach ($this->traits->getAll() as $traitNode) {
82-
$this->collectTraitRelations($traitNode, $visitedTraits, $traitCompositions, $traitDependencies);
83-
}
84-
85-
// Final sets (properties win over dependencies)
86-
$finalProperties = $ownProperties + $traitCompositions; // keep own over trait
87-
88-
$depsUnion = $ownDepends + $traitDependencies; // keep own over trait
89-
$finalDepends = array_filter($depsUnion, function (string $key) use ($extends, $implements, $finalProperties) {
90-
return !array_key_exists($key, $finalProperties)
74+
$properties = $this->properties->getAll();
75+
$traits = $this->traits->getAll();
76+
$depends = array_filter($this->depends->getAll(), function (string $key) use ($extends, $implements, $properties) {
77+
return !array_key_exists($key, $properties)
9178
&& !array_key_exists($key, $extends)
9279
&& !array_key_exists($key, $implements)
9380
&& $key !== $this->nodeName();
9481
}, ARRAY_FILTER_USE_KEY);
9582

9683
return [
97-
...array_values(array_map(fn(Node $extendsNode) => new Inheritance($this, $extendsNode), $extends)),
84+
...array_values(array_map(fn(Node $extendsNode) => new Inheritance($this, $extendsNode), $extends)),
9885
...array_values(array_map(fn(Node $implementsNode) => new Realization($this, $implementsNode), $implements)),
99-
...array_values(array_map(fn(Node $propertyNode) => new Composition($this, $propertyNode), $finalProperties)),
100-
...array_values(array_map(fn(Node $dependNode) => new Dependency($this, $dependNode), $finalDepends)),
86+
...array_values(array_map(fn(Node $propertyNode) => new Composition($this, $propertyNode), $properties)),
87+
...array_values(array_map(fn(Node $dependNode) => new Dependency($this, $dependNode), $depends)),
88+
...array_values(array_map(fn(Node $traitNode) => new TraitUsage($this, $traitNode), $traits)),
10189
...$this->extraRelationships,
10290
];
10391
}
104-
105-
/**
106-
* Recursively collect composition/dependency from the given trait and nested traits.
107-
*
108-
* @param Node $traitNode
109-
* @param array $visited visited trait names
110-
* @param array $compositionsOut [name => Node]
111-
* @param array $dependenciesOut [name => Node]
112-
*/
113-
private function collectTraitRelations(Node $traitNode, array &$visited, array &$compositionsOut, array &$dependenciesOut): void
114-
{
115-
$traitName = $traitNode->nodeName();
116-
if (isset($visited[$traitName])) {
117-
return;
118-
}
119-
$visited[$traitName] = true;
120-
121-
// Direct compositions and dependencies declared in the trait
122-
foreach ($traitNode->properties->getAll() as $name => $node) {
123-
$compositionsOut[$name] = $node;
124-
}
125-
foreach ($traitNode->depends->getAll() as $name => $node) {
126-
$dependenciesOut[$name] = $node;
127-
}
128-
129-
// Nested trait uses
130-
foreach ($traitNode->traits->getAll() as $nestedTrait) {
131-
$this->collectTraitRelations($nestedTrait, $visited, $compositionsOut, $dependenciesOut);
132-
}
133-
}
13492
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Tasuku43\MermaidClassDiagram\ClassDiagramRenderer\Node\Relationship;
5+
6+
class TraitUsage extends Relationship
7+
{
8+
public function render(): string
9+
{
10+
// Represent trait usage with a simple association arrow and label
11+
return sprintf(self::FORMAT, $this->from->nodeName(), '-->', $this->to->nodeName(), 'use');
12+
}
13+
}

tests/ClassDiagramRenderer/ClassDiagramBuilderTest.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,7 @@ class UserStatus {
182182
AbstractController <|-- UserController: inheritance
183183
UserController *-- UserService: composition
184184
UserRepositoryInterface <|.. UserRepository: realization
185-
UserService *-- AuditLogger: composition
186-
UserService *-- UserRepositoryInterface: composition
185+
UserService --> RepositoryAwareTrait: use
187186

188187
EOT;
189188

tests/ClassDiagramRenderer/Node/TraitAggregationTest.php

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)