@@ -120,14 +120,7 @@ public function updateReferences()
120
120
}
121
121
// update implementedBy and usedBy for traits
122
122
foreach ($ this ->classes as $ class ) {
123
- foreach ($ class ->traits as $ trait ) {
124
- if (isset ($ this ->traits [$ trait ])) {
125
- $ trait = $ this ->traits [$ trait ];
126
- $ trait ->usedBy [] = $ class ->name ;
127
- $ class ->properties = array_merge ($ trait ->properties , $ class ->properties );
128
- $ class ->methods = array_merge ($ trait ->methods , $ class ->methods );
129
- }
130
- }
123
+ $ this ->handleTraitInheritance ($ class );
131
124
}
132
125
foreach ($ this ->interfaces as $ interface ) {
133
126
foreach ($ interface ->parentInterfaces as $ pInterface ) {
@@ -140,22 +133,24 @@ public function updateReferences()
140
133
foreach ($ this ->classes as $ class ) {
141
134
$ this ->inheritDocs ($ class );
142
135
}
143
- // inherit properties, methods, constants and events from subclasses
136
+ // inherit properties, methods, constants and events from parent classes
144
137
foreach ($ this ->classes as $ class ) {
145
138
$ this ->handleClassInheritance ($ class );
146
139
}
147
140
// update implementedBy and usedBy for interfaces
148
141
foreach ($ this ->classes as $ class ) {
149
142
foreach ($ class ->interfaces as $ interface ) {
150
- if (isset ($ this ->interfaces [$ interface ])) {
151
- $ this ->interfaces [$ interface ]->implementedBy [] = $ class ->name ;
152
- if ($ class ->isAbstract ) {
153
- // add not implemented interface methods
154
- foreach ($ this ->interfaces [$ interface ]->methods as $ method ) {
155
- if (!isset ($ class ->methods [$ method ->name ])) {
156
- $ class ->methods [$ method ->name ] = $ method ;
157
- }
158
- }
143
+ if (!isset ($ this ->interfaces [$ interface ])) {
144
+ continue ;
145
+ }
146
+ $ this ->interfaces [$ interface ]->implementedBy [] = $ class ->name ;
147
+ if (!$ class ->isAbstract ) {
148
+ continue ;
149
+ }
150
+ // add not implemented interface methods
151
+ foreach ($ this ->interfaces [$ interface ]->methods as $ method ) {
152
+ if (!isset ($ class ->methods [$ method ->name ])) {
153
+ $ class ->methods [$ method ->name ] = $ method ;
159
154
}
160
155
}
161
156
}
@@ -202,6 +197,33 @@ protected function updateSubclassInheritance($class)
202
197
}
203
198
}
204
199
200
+ /**
201
+ * @param ClassDoc $class
202
+ */
203
+ protected function handleTraitInheritance ($ class )
204
+ {
205
+ foreach ($ class ->traits as $ traitName ) {
206
+ if (!isset ($ this ->traits [$ traitName ])) {
207
+ continue ;
208
+ }
209
+
210
+ $ trait = $ this ->traits [$ traitName ];
211
+ $ trait ->usedBy [] = $ class ->name ;
212
+
213
+ foreach ($ trait ->properties as $ property ) {
214
+ if (!isset ($ class ->properties [$ property ->name ])) {
215
+ $ class ->properties [$ property ->name ] = $ property ;
216
+ }
217
+ }
218
+
219
+ foreach ($ trait ->methods as $ method ) {
220
+ if (!isset ($ class ->methods [$ method ->name ])) {
221
+ $ class ->methods [$ method ->name ] = $ method ;
222
+ }
223
+ }
224
+ }
225
+ }
226
+
205
227
/**
206
228
* @param ClassDoc $class
207
229
*/
@@ -219,11 +241,14 @@ protected function handleClassInheritance($class)
219
241
220
242
foreach ($ attrNames as $ attrName ) {
221
243
foreach ($ parent ->$ attrName as $ item ) {
222
- if (isset ($ class ->$ attrName [$ item ->name ])) {
244
+ if (
245
+ isset ($ class ->$ attrName [$ item ->name ]) &&
246
+ !isset ($ this ->traits [$ class ->$ attrName [$ item ->name ]->definedBy ])
247
+ ) {
223
248
continue ;
224
249
}
225
250
226
- $ class ->$ attrName += [$ item ->name => $ item] ;
251
+ $ class ->$ attrName [$ item ->name ] = $ item ;
227
252
}
228
253
}
229
254
}
0 commit comments