@@ -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}
0 commit comments