@@ -204,3 +204,115 @@ function (Bar $b): void {
204
204
assertType (Bar::class, $ this );
205
205
});
206
206
};
207
+
208
+ class ImplicitInheritance extends Foo
209
+ {
210
+
211
+ public function paramClosureClass (callable $ cb )
212
+ {
213
+
214
+ }
215
+
216
+ public function paramClosureSelf (callable $ cb )
217
+ {
218
+
219
+ }
220
+
221
+ public function paramClosureStatic (callable $ cb )
222
+ {
223
+
224
+ }
225
+
226
+ public function paramClosureConditional (int $ j , callable $ ca )
227
+ {
228
+ // renamed parameter names
229
+ }
230
+
231
+ public function doFoo (): void
232
+ {
233
+ $ this ->paramClosureClass (function () {
234
+ assertType (Some::class, $ this );
235
+ });
236
+ $ this ->paramClosureClass (static function () {
237
+ assertType ('*ERROR* ' , $ this );
238
+ });
239
+ $ this ->paramClosureSelf (function () use (&$ a ) {
240
+ assertType (Foo::class, $ this );
241
+ });
242
+ $ this ->paramClosureStatic (function () use (&$ a ) {
243
+ assertType ('static(ParamClosureThis\ImplicitInheritance) ' , $ this );
244
+ });
245
+ $ this ->paramClosureConditional (1 , function () {
246
+ assertType (Foo::class, $ this );
247
+ });
248
+ $ this ->paramClosureConditional (2 , function () {
249
+ assertType (Some::class, $ this );
250
+ });
251
+ $ this ->paramClosureGenerics (\stdClass::class, function () {
252
+ assertType (\stdClass::class, $ this );
253
+ });
254
+ }
255
+
256
+ }
257
+
258
+ class ImplicitInheritanceMoreComplicated extends Foo
259
+ {
260
+
261
+ /**
262
+ * @param callable $cb
263
+ */
264
+ public function paramClosureClass (callable $ cb )
265
+ {
266
+
267
+ }
268
+
269
+ /**
270
+ * @param callable $cb
271
+ */
272
+ public function paramClosureSelf (callable $ cb )
273
+ {
274
+
275
+ }
276
+
277
+ /**
278
+ * @param callable $cb
279
+ */
280
+ public function paramClosureStatic (callable $ cb )
281
+ {
282
+
283
+ }
284
+
285
+ /**
286
+ * @param callable $ca
287
+ */
288
+ public function paramClosureConditional (int $ j , callable $ ca )
289
+ {
290
+ // renamed parameter names
291
+ }
292
+
293
+ public function doFoo (): void
294
+ {
295
+ $ this ->paramClosureClass (function () {
296
+ assertType (Some::class, $ this );
297
+ });
298
+ $ this ->paramClosureClass (static function () {
299
+ assertType ('*ERROR* ' , $ this );
300
+ });
301
+ $ this ->paramClosureSelf (function () use (&$ a ) {
302
+ assertType (Foo::class, $ this );
303
+ });
304
+ $ this ->paramClosureStatic (function () use (&$ a ) {
305
+ assertType ('static(ParamClosureThis\ImplicitInheritanceMoreComplicated) ' , $ this );
306
+ });
307
+ $ this ->paramClosureConditional (1 , function () {
308
+ assertType (Foo::class, $ this );
309
+ });
310
+ $ this ->paramClosureConditional (2 , function () {
311
+ assertType (Some::class, $ this );
312
+ });
313
+ $ this ->paramClosureGenerics (\stdClass::class, function () {
314
+ assertType (\stdClass::class, $ this );
315
+ });
316
+ }
317
+
318
+ }
0 commit comments