@@ -176,7 +176,7 @@ private function extractFromMutator($class, $property)
176
176
if (!$ reflectionType = $ reflectionParameter ->getType ()) {
177
177
return ;
178
178
}
179
- $ type = $ this ->extractFromReflectionType ($ reflectionType );
179
+ $ type = $ this ->extractFromReflectionType ($ reflectionType, $ reflectionMethod );
180
180
181
181
// HHVM reports variadics with "array" but not builtin type hints
182
182
if (!$ reflectionType ->isBuiltin () && Type::BUILTIN_TYPE_ARRAY === $ type ->getBuiltinType ()) {
@@ -188,7 +188,7 @@ private function extractFromMutator($class, $property)
188
188
} elseif (Type::BUILTIN_TYPE_CALLABLE === $ info [1 ]) {
189
189
$ type = new Type (Type::BUILTIN_TYPE_CALLABLE , $ reflectionParameter ->allowsNull ());
190
190
} else {
191
- $ type = new Type (Type::BUILTIN_TYPE_OBJECT , $ reflectionParameter ->allowsNull (), $ info [1 ]);
191
+ $ type = new Type (Type::BUILTIN_TYPE_OBJECT , $ reflectionParameter ->allowsNull (), $ this -> resolveTypeName ( $ info [1 ], $ reflectionMethod ) );
192
192
}
193
193
} else {
194
194
return ;
@@ -217,7 +217,7 @@ private function extractFromAccessor($class, $property)
217
217
}
218
218
219
219
if ($ this ->supportsParameterType && $ reflectionType = $ reflectionMethod ->getReturnType ()) {
220
- return array ($ this ->extractFromReflectionType ($ reflectionType ));
220
+ return array ($ this ->extractFromReflectionType ($ reflectionType, $ reflectionMethod ));
221
221
}
222
222
223
223
if (\in_array ($ prefix , array ('is ' , 'can ' ))) {
@@ -228,11 +228,9 @@ private function extractFromAccessor($class, $property)
228
228
/**
229
229
* Extracts data from the PHP 7 reflection type.
230
230
*
231
- * @param \ReflectionType $reflectionType
232
- *
233
231
* @return Type
234
232
*/
235
- private function extractFromReflectionType (\ReflectionType $ reflectionType )
233
+ private function extractFromReflectionType (\ReflectionType $ reflectionType, \ ReflectionMethod $ reflectionMethod )
236
234
{
237
235
$ phpTypeOrClass = $ reflectionType instanceof \ReflectionNamedType ? $ reflectionType ->getName () : $ reflectionType ->__toString ();
238
236
$ nullable = $ reflectionType ->allowsNull ();
@@ -244,12 +242,24 @@ private function extractFromReflectionType(\ReflectionType $reflectionType)
244
242
} elseif ($ reflectionType ->isBuiltin ()) {
245
243
$ type = new Type ($ phpTypeOrClass , $ nullable );
246
244
} else {
247
- $ type = new Type (Type::BUILTIN_TYPE_OBJECT , $ nullable , $ phpTypeOrClass );
245
+ $ type = new Type (Type::BUILTIN_TYPE_OBJECT , $ nullable , $ this -> resolveTypeName ( $ phpTypeOrClass, $ reflectionMethod ) );
248
246
}
249
247
250
248
return $ type ;
251
249
}
252
250
251
+ private function resolveTypeName ($ name , \ReflectionMethod $ reflectionMethod )
252
+ {
253
+ if ('self ' === $ lcName = strtolower ($ name )) {
254
+ return $ reflectionMethod ->getDeclaringClass ()->name ;
255
+ }
256
+ if ('parent ' === $ lcName && $ parent = $ reflectionMethod ->getDeclaringClass ()->getParentClass ()) {
257
+ return $ parent ->name ;
258
+ }
259
+
260
+ return $ name ;
261
+ }
262
+
253
263
/**
254
264
* Does the class have the given public property?
255
265
*
0 commit comments