From e27d8daac29a1990a671164ecaf02279712bc6fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Vo=C5=99=C3=AD=C5=A1ek?= Date: Thu, 22 Aug 2024 00:44:38 +0200 Subject: [PATCH] add test --- .../static-with-this-chained-bug-5946.php | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 tests/PHPStan/Analyser/nsrt/static-with-this-chained-bug-5946.php diff --git a/tests/PHPStan/Analyser/nsrt/static-with-this-chained-bug-5946.php b/tests/PHPStan/Analyser/nsrt/static-with-this-chained-bug-5946.php new file mode 100644 index 0000000000..32c2630146 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/static-with-this-chained-bug-5946.php @@ -0,0 +1,108 @@ +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) + } +}