-
Notifications
You must be signed in to change notification settings - Fork 570
Expand file tree
/
Copy pathstatic-with-this-chained-bug-5946.php
More file actions
108 lines (92 loc) · 4.75 KB
/
static-with-this-chained-bug-5946.php
File metadata and controls
108 lines (92 loc) · 4.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
namespace StaticWithThisChained;
use function PHPStan\Testing\assertType;
class Foo
{
/** @var $this */
public $propThis;
/** @var static */
public $propStatic;
/** @var static */
public static $propStaticStatic;
/**
* @return $this
*/
public function getThis()
{
return $this;
}
/**
* @return static
*/
public function newStatic()
{
return new static();
}
/**
* @return static
*/
public static function newStaticStatic()
{
return new static();
}
public function testMethodChained(): void
{
assertType('$this(StaticWithThisChained\Foo)', $this->getThis());
assertType('static(StaticWithThisChained\Foo)', $this->newStatic());
assertType('static(StaticWithThisChained\Foo)', static::newStaticStatic());
assertType('static(StaticWithThisChained\Foo)', self::newStaticStatic());
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic());
assertType('$this(StaticWithThisChained\Foo)', $this->getThis()->getThis());
assertType('static(StaticWithThisChained\Foo)', $this->newStatic()->getThis());
assertType('static(StaticWithThisChained\Foo)', static::newStaticStatic()->getThis());
assertType('static(StaticWithThisChained\Foo)', self::newStaticStatic()->getThis());
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic()->getThis());
}
public function testPropertyChained(): void
{
assertType('$this(StaticWithThisChained\Foo)', $this->propThis);
assertType('static(StaticWithThisChained\Foo)', $this->propStatic);
assertType('static(StaticWithThisChained\Foo)', static::$propStaticStatic);
assertType('static(StaticWithThisChained\Foo)', self::$propStaticStatic);
assertType('static(StaticWithThisChained\Foo)', Foo::$propStaticStatic); // should be StaticWithThisChained\Foo
assertType('$this(StaticWithThisChained\Foo)', $this->propThis->propThis);
assertType('static(StaticWithThisChained\Foo)', $this->propStatic->propThis);
assertType('static(StaticWithThisChained\Foo)', static::$propStaticStatic->propThis);
assertType('static(StaticWithThisChained\Foo)', self::$propStaticStatic->propThis);
assertType('static(StaticWithThisChained\Foo)', Foo::$propStaticStatic->propThis); // should be StaticWithThisChained\Foo
}
}
class Bar extends Foo
{
public function testMethodChained(): void
{
assertType('$this(StaticWithThisChained\Bar)', $this->getThis());
assertType('static(StaticWithThisChained\Bar)', $this->newStatic());
assertType('static(StaticWithThisChained\Bar)', static::newStaticStatic());
assertType('static(StaticWithThisChained\Bar)', self::newStaticStatic());
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic());
assertType('StaticWithThisChained\Bar', Bar::newStaticStatic());
assertType('$this(StaticWithThisChained\Bar)', $this->getThis()->getThis());
assertType('static(StaticWithThisChained\Bar)', $this->newStatic()->getThis());
assertType('static(StaticWithThisChained\Bar)', static::newStaticStatic()->getThis());
assertType('static(StaticWithThisChained\Bar)', self::newStaticStatic()->getThis());
assertType('StaticWithThisChained\Foo', Foo::newStaticStatic()->getThis());
assertType('StaticWithThisChained\Bar', Bar::newStaticStatic()->getThis());
}
public function testPropertyChained(): void
{
assertType('$this(StaticWithThisChained\Bar)', $this->propThis);
assertType('static(StaticWithThisChained\Bar)', $this->propStatic);
assertType('static(StaticWithThisChained\Bar)', static::$propStaticStatic);
assertType('static(StaticWithThisChained\Bar)', self::$propStaticStatic);
assertType('static(StaticWithThisChained\Bar)', Foo::$propStaticStatic); // should be StaticWithThisChained\Foo (non-static and Foo, not Bar)
assertType('static(StaticWithThisChained\Bar)', Bar::$propStaticStatic); // should be StaticWithThisChained\Bar (non-static)
assertType('$this(StaticWithThisChained\Bar)', $this->propThis->propThis);
assertType('static(StaticWithThisChained\Bar)', $this->propStatic->propThis);
assertType('static(StaticWithThisChained\Bar)', static::$propStaticStatic->propThis);
assertType('static(StaticWithThisChained\Bar)', self::$propStaticStatic->propThis);
assertType('static(StaticWithThisChained\Bar)', Foo::$propStaticStatic->propThis); // should be StaticWithThisChained\Foo (non-static and Foo, not Bar)
assertType('static(StaticWithThisChained\Bar)', Bar::$propStaticStatic->propThis); // should be StaticWithThisChained\Bar (non-static)
}
}