From ed59ce8ace4d47483621704fda2294c115b33253 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Tue, 18 Feb 2025 16:56:07 -0800 Subject: [PATCH 1/7] PHP 8.4 | Report final properties in `File::getMemberProperties()` Part of #734 --- src/Files/File.php | 6 ++ tests/Core/File/GetMemberPropertiesTest.inc | 5 ++ tests/Core/File/GetMemberPropertiesTest.php | 95 +++++++++++++++++++++ 3 files changed, 106 insertions(+) diff --git a/src/Files/File.php b/src/Files/File.php index e6c7e608ce..a40c6b1963 100644 --- a/src/Files/File.php +++ b/src/Files/File.php @@ -1845,6 +1845,7 @@ public function getMethodProperties($stackPtr) * 'scope_specified' => boolean, // TRUE if the scope was explicitly specified. * 'is_static' => boolean, // TRUE if the static keyword was found. * 'is_readonly' => boolean, // TRUE if the readonly keyword was found. + * 'is_final' => boolean, // TRUE if the final keyword was found. * 'type' => string, // The type of the var (empty if no type specified). * 'type_token' => integer|false, // The stack pointer to the start of the type * // or FALSE if there is no type. @@ -1917,6 +1918,7 @@ public function getMemberProperties($stackPtr) T_STATIC => T_STATIC, T_VAR => T_VAR, T_READONLY => T_READONLY, + T_FINAL => T_FINAL, ]; $valid += Tokens::$emptyTokens; @@ -1925,6 +1927,7 @@ public function getMemberProperties($stackPtr) $scopeSpecified = false; $isStatic = false; $isReadonly = false; + $isFinal = false; $startOfStatement = $this->findPrevious( [ @@ -1960,6 +1963,8 @@ public function getMemberProperties($stackPtr) case T_READONLY: $isReadonly = true; break; + case T_FINAL: + $isFinal = true; } }//end for @@ -2016,6 +2021,7 @@ public function getMemberProperties($stackPtr) 'scope_specified' => $scopeSpecified, 'is_static' => $isStatic, 'is_readonly' => $isReadonly, + 'is_final' => $isFinal, 'type' => $type, 'type_token' => $typeToken, 'type_end_token' => $typeEndToken, diff --git a/tests/Core/File/GetMemberPropertiesTest.inc b/tests/Core/File/GetMemberPropertiesTest.inc index 5146620815..704ffdc757 100644 --- a/tests/Core/File/GetMemberPropertiesTest.inc +++ b/tests/Core/File/GetMemberPropertiesTest.inc @@ -354,3 +354,8 @@ trait DNFTypes { // Intentional fatal error - nullable operator cannot be combined with DNF. var ?(A&\Pck\B)|bool $propD; } + +class WithFinalProperties { + /* testPHP84FinaProperty */ + final public string $val; +} diff --git a/tests/Core/File/GetMemberPropertiesTest.php b/tests/Core/File/GetMemberPropertiesTest.php index 2d5fbe6346..4cdb6abb86 100644 --- a/tests/Core/File/GetMemberPropertiesTest.php +++ b/tests/Core/File/GetMemberPropertiesTest.php @@ -70,6 +70,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -83,6 +84,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?int', 'type_token' => -2, 'type_end_token' => -2, @@ -96,6 +98,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -109,6 +112,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -122,6 +126,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -135,6 +140,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'bool', 'type_token' => -2, 'type_end_token' => -2, @@ -148,6 +154,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -161,6 +168,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'array', 'type_token' => -2, 'type_end_token' => -2, @@ -174,6 +182,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -187,6 +196,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '?string', 'type_token' => -2, 'type_end_token' => -2, @@ -200,6 +210,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -213,6 +224,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -226,6 +238,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -239,6 +252,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -252,6 +266,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -265,6 +280,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -278,6 +294,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -291,6 +308,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -304,6 +322,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -317,6 +336,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'float', 'type_token' => -6, 'type_end_token' => -6, @@ -330,6 +350,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'float', 'type_token' => -13, 'type_end_token' => -13, @@ -343,6 +364,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '?string', 'type_token' => -6, 'type_end_token' => -6, @@ -356,6 +378,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '?string', 'type_token' => -17, 'type_end_token' => -17, @@ -369,6 +392,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -382,6 +406,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -395,6 +420,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -408,6 +434,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -421,6 +448,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -434,6 +462,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -447,6 +476,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -460,6 +490,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -473,6 +504,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -486,6 +518,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -499,6 +532,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?array', 'type_token' => -2, 'type_end_token' => -2, @@ -512,6 +546,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '\MyNamespace\MyClass', 'type_token' => -5, 'type_end_token' => -2, @@ -525,6 +560,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?ClassName', 'type_token' => -2, 'type_end_token' => -2, @@ -538,6 +574,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?Folder\ClassName', 'type_token' => -4, 'type_end_token' => -2, @@ -551,6 +588,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '\MyNamespace\MyClass\Foo', 'type_token' => -18, 'type_end_token' => -2, @@ -564,6 +602,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -581,6 +620,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -594,6 +634,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -607,6 +648,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => 'miXed', 'type_token' => -2, 'type_end_token' => -2, @@ -620,6 +662,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -633,6 +676,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?namespace\Name', 'type_token' => -4, 'type_end_token' => -2, @@ -646,6 +690,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'int|float', 'type_token' => -4, 'type_end_token' => -2, @@ -659,6 +704,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'MyClassA|\Package\MyClassB', 'type_token' => -7, 'type_end_token' => -2, @@ -672,6 +718,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'array|bool|int|float|NULL|object|string', 'type_token' => -14, 'type_end_token' => -2, @@ -685,6 +732,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'false|mixed|self|parent|iterable|Resource', 'type_token' => -12, 'type_end_token' => -2, @@ -698,6 +746,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, // Missing static, but that's OK as not an allowed syntax. 'type' => 'callable|void', 'type_token' => -4, @@ -712,6 +761,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?int|float', 'type_token' => -4, 'type_end_token' => -2, @@ -725,6 +775,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'null', 'type_token' => -2, 'type_end_token' => -2, @@ -738,6 +789,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'false', 'type_token' => -2, 'type_end_token' => -2, @@ -751,6 +803,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'bool|FALSE', 'type_token' => -4, 'type_end_token' => -2, @@ -764,6 +817,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'object|ClassName', 'type_token' => -4, 'type_end_token' => -2, @@ -777,6 +831,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'iterable|array|Traversable', 'type_token' => -6, 'type_end_token' => -2, @@ -790,6 +845,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'int|string|INT', 'type_token' => -10, 'type_end_token' => -2, @@ -803,6 +859,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => 'int', 'type_token' => -2, 'type_end_token' => -2, @@ -816,6 +873,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => '?array', 'type_token' => -2, 'type_end_token' => -2, @@ -829,6 +887,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => 'string|int', 'type_token' => -4, 'type_end_token' => -2, @@ -842,6 +901,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => 'string|null', 'type_token' => -4, 'type_end_token' => -2, @@ -855,6 +915,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => 'string|int', 'type_token' => -4, 'type_end_token' => -2, @@ -868,6 +929,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => '\InterfaceA|\Sub\InterfaceB|false', 'type_token' => -11, 'type_end_token' => -3, @@ -881,6 +943,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => true, + 'is_final' => false, 'type' => '?string', 'type_token' => -2, 'type_end_token' => -2, @@ -894,6 +957,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => true, + 'is_final' => false, 'type' => '', 'type_token' => false, 'type_end_token' => false, @@ -907,6 +971,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'string', 'type_token' => -2, 'type_end_token' => -2, @@ -920,6 +985,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?int|float', 'type_token' => -4, 'type_end_token' => -2, @@ -933,6 +999,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'mixed', 'type_token' => -2, 'type_end_token' => -2, @@ -950,6 +1017,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'Foo&Bar', 'type_token' => -4, 'type_end_token' => -2, @@ -963,6 +1031,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'Foo&Bar&Baz', 'type_token' => -6, 'type_end_token' => -2, @@ -976,6 +1045,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'int&string', 'type_token' => -4, 'type_end_token' => -2, @@ -989,6 +1059,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?Foo&Bar', 'type_token' => -4, 'type_end_token' => -2, @@ -1003,6 +1074,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'int|string', 'type_token' => -8, 'type_end_token' => -2, @@ -1016,6 +1088,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '\Foo&Bar', 'type_token' => -9, 'type_end_token' => -2, @@ -1029,6 +1102,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'true', 'type_token' => -2, 'type_end_token' => -2, @@ -1042,6 +1116,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '?true', 'type_token' => -2, 'type_end_token' => -2, @@ -1055,6 +1130,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => 'int|string|true', 'type_token' => -6, 'type_end_token' => -2, @@ -1068,6 +1144,7 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => 'true|FALSE', 'type_token' => -4, 'type_end_token' => -2, @@ -1082,6 +1159,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => true, 'is_readonly' => false, + 'is_final' => false, 'type' => '(Foo&\Bar)|bool', 'type_token' => -9, 'type_end_token' => -2, @@ -1095,6 +1173,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => 'float|(Partially\Qualified&Traversable)', 'type_token' => -10, 'type_end_token' => -2, @@ -1108,6 +1187,7 @@ public static function dataGetMemberProperties() 'scope_specified' => true, 'is_static' => false, 'is_readonly' => true, + 'is_final' => false, 'type' => '(namespace\Foo&Bar)|string', 'type_token' => -10, 'type_end_token' => -2, @@ -1121,12 +1201,27 @@ public static function dataGetMemberProperties() 'scope_specified' => false, 'is_static' => false, 'is_readonly' => false, + 'is_final' => false, 'type' => '?(A&\Pck\B)|bool', 'type_token' => -11, 'type_end_token' => -2, 'nullable_type' => true, ], ], + 'php8.4-final-property' => [ + 'identifier' => '/* testPHP84FinaProperty */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], ]; }//end dataGetMemberProperties() From f50798e45a6779644e428a6d54d87a0c2d244361 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Tue, 18 Feb 2025 21:55:16 -0800 Subject: [PATCH 2/7] Add missing `break` --- src/Files/File.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Files/File.php b/src/Files/File.php index a40c6b1963..fed3cddfd9 100644 --- a/src/Files/File.php +++ b/src/Files/File.php @@ -1965,6 +1965,7 @@ public function getMemberProperties($stackPtr) break; case T_FINAL: $isFinal = true; + break; } }//end for From 43113121c04709017564aaa9e9e52bd2d66df659 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Tue, 18 Feb 2025 22:00:55 -0800 Subject: [PATCH 3/7] Add `//end switch` comment --- src/Files/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files/File.php b/src/Files/File.php index fed3cddfd9..aabafd46b5 100644 --- a/src/Files/File.php +++ b/src/Files/File.php @@ -1966,7 +1966,7 @@ public function getMemberProperties($stackPtr) case T_FINAL: $isFinal = true; break; - } + }//end switch }//end for $type = ''; From 6c7190a06df11ce10f106d068c49d8a9f2364ba3 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Tue, 18 Feb 2025 22:15:03 -0800 Subject: [PATCH 4/7] More tests --- tests/Core/File/GetMemberPropertiesTest.inc | 14 +++- tests/Core/File/GetMemberPropertiesTest.php | 74 ++++++++++++++++++++- 2 files changed, 84 insertions(+), 4 deletions(-) diff --git a/tests/Core/File/GetMemberPropertiesTest.inc b/tests/Core/File/GetMemberPropertiesTest.inc index 704ffdc757..8665a1baa2 100644 --- a/tests/Core/File/GetMemberPropertiesTest.inc +++ b/tests/Core/File/GetMemberPropertiesTest.inc @@ -356,6 +356,16 @@ trait DNFTypes { } class WithFinalProperties { - /* testPHP84FinaProperty */ - final public string $val; + /* testPHP84FinalPublicTypedProp */ + final public string $val1; + /* testPHP84FinalProtectedTypedProp */ + final protected string $val2; + /* testPHP84FinalMiddleTypedProp */ + public final string $val3; + /* testPHP84FinalLastTypedProp */ + public readonly final string $val4; + /* testPHP84FinalImplicitVisibilityTypedProp */ + final string $val5; + /* testPHP84FinalImplicitVisibilityProp */ + final $val6; } diff --git a/tests/Core/File/GetMemberPropertiesTest.php b/tests/Core/File/GetMemberPropertiesTest.php index 4cdb6abb86..889651d46a 100644 --- a/tests/Core/File/GetMemberPropertiesTest.php +++ b/tests/Core/File/GetMemberPropertiesTest.php @@ -1208,8 +1208,8 @@ public static function dataGetMemberProperties() 'nullable_type' => true, ], ], - 'php8.4-final-property' => [ - 'identifier' => '/* testPHP84FinaProperty */', + 'php8.4-final-public-property' => [ + 'identifier' => '/* testPHP84FinalPublicTypedProp */', 'expected' => [ 'scope' => 'public', 'scope_specified' => true, @@ -1222,6 +1222,76 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], + 'php8.4-final-protected-property' => [ + 'identifier' => '/* testPHP84FinalProtectedTypedProp */', + 'expected' => [ + 'scope' => 'protected', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-final-middle-keyword-property' => [ + 'identifier' => '/* testPHP84FinalMiddleTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-final-last-keyword-property' => [ + 'identifier' => '/* testPHP84FinalLastTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => true, + 'is_final' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-final-implicit-public-typed-property' => [ + 'identifier' => '/* testPHP84FinalImplicitVisibilityTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-final-implicit-public-untyped-property' => [ + 'identifier' => '/* testPHP84FinalImplicitVisibilityProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => false, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => '', + 'type_token' => false, + 'type_end_token' => false, + 'nullable_type' => false, + ], + ], ]; }//end dataGetMemberProperties() From a79034003a2d13e09c135a08648d7c7e7d8cb8b3 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Tue, 18 Feb 2025 22:28:01 -0800 Subject: [PATCH 5/7] Alignment --- tests/Core/File/GetMemberPropertiesTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/Core/File/GetMemberPropertiesTest.php b/tests/Core/File/GetMemberPropertiesTest.php index 889651d46a..3489e1d7b8 100644 --- a/tests/Core/File/GetMemberPropertiesTest.php +++ b/tests/Core/File/GetMemberPropertiesTest.php @@ -1208,7 +1208,7 @@ public static function dataGetMemberProperties() 'nullable_type' => true, ], ], - 'php8.4-final-public-property' => [ + 'php8.4-final-public-property' => [ 'identifier' => '/* testPHP84FinalPublicTypedProp */', 'expected' => [ 'scope' => 'public', @@ -1222,7 +1222,7 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], - 'php8.4-final-protected-property' => [ + 'php8.4-final-protected-property' => [ 'identifier' => '/* testPHP84FinalProtectedTypedProp */', 'expected' => [ 'scope' => 'protected', @@ -1236,7 +1236,7 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], - 'php8.4-final-middle-keyword-property' => [ + 'php8.4-final-middle-keyword-property' => [ 'identifier' => '/* testPHP84FinalMiddleTypedProp */', 'expected' => [ 'scope' => 'public', @@ -1250,7 +1250,7 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], - 'php8.4-final-last-keyword-property' => [ + 'php8.4-final-last-keyword-property' => [ 'identifier' => '/* testPHP84FinalLastTypedProp */', 'expected' => [ 'scope' => 'public', @@ -1264,7 +1264,7 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], - 'php8.4-final-implicit-public-typed-property' => [ + 'php8.4-final-implicit-public-typed-property' => [ 'identifier' => '/* testPHP84FinalImplicitVisibilityTypedProp */', 'expected' => [ 'scope' => 'public', @@ -1278,7 +1278,7 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], - 'php8.4-final-implicit-public-untyped-property' => [ + 'php8.4-final-implicit-public-untyped-property' => [ 'identifier' => '/* testPHP84FinalImplicitVisibilityProp */', 'expected' => [ 'scope' => 'public', From 8ee1db21248e8dadd5142955d7eb624ed12a9ed3 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Thu, 20 Feb 2025 19:29:40 -0800 Subject: [PATCH 6/7] Even more tests --- tests/Core/File/GetMemberPropertiesTest.inc | 12 ++++-- tests/Core/File/GetMemberPropertiesTest.php | 42 +++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/tests/Core/File/GetMemberPropertiesTest.inc b/tests/Core/File/GetMemberPropertiesTest.inc index 8665a1baa2..c858826607 100644 --- a/tests/Core/File/GetMemberPropertiesTest.inc +++ b/tests/Core/File/GetMemberPropertiesTest.inc @@ -362,10 +362,16 @@ class WithFinalProperties { final protected string $val2; /* testPHP84FinalMiddleTypedProp */ public final string $val3; + /* testPHP84FinalMiddleStaticTypedProp */ + public final static string $val4; /* testPHP84FinalLastTypedProp */ - public readonly final string $val4; + public readonly final string $val5; /* testPHP84FinalImplicitVisibilityTypedProp */ - final string $val5; + final string $val6; /* testPHP84FinalImplicitVisibilityProp */ - final $val6; + final $val7; + /* testPHP84FinalNullableTypedProp */ + final public ?string $val8; + /* testPHP84FinalComplexTypedProp */ + final public (Foo&\Bar)|bool $val9; } diff --git a/tests/Core/File/GetMemberPropertiesTest.php b/tests/Core/File/GetMemberPropertiesTest.php index 3489e1d7b8..34d835a194 100644 --- a/tests/Core/File/GetMemberPropertiesTest.php +++ b/tests/Core/File/GetMemberPropertiesTest.php @@ -1250,6 +1250,20 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], + 'php8.4-final-middle-keyword-static-property' => [ + 'identifier' => '/* testPHP84FinalMiddleStaticTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => true, + 'is_readonly' => false, + 'is_final' => true, + 'type' => 'string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], 'php8.4-final-last-keyword-property' => [ 'identifier' => '/* testPHP84FinalLastTypedProp */', 'expected' => [ @@ -1292,6 +1306,34 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], + 'php8.4-final-public-complex-type-property' => [ + 'identifier' => '/* testPHP84FinalNullableTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => '(Foo&\Bar)|bool', + 'type_token' => -9, + 'type_end_token' => -2, + 'nullable_type' => false, + ], + ], + 'php8.4-final-public-nullable-typed-property' => [ + 'identifier' => '/* testPHP84FinalComplexTypedProp */', + 'expected' => [ + 'scope' => 'public', + 'scope_specified' => true, + 'is_static' => false, + 'is_readonly' => false, + 'is_final' => true, + 'type' => '?string', + 'type_token' => -2, + 'type_end_token' => -2, + 'nullable_type' => true, + ], + ], ]; }//end dataGetMemberProperties() From 8e0a4f52c29b5681a73ea8669a3e37c6d3790fc8 Mon Sep 17 00:00:00 2001 From: Daniel Scherzer Date: Thu, 20 Feb 2025 21:22:00 -0800 Subject: [PATCH 7/7] Fix tests --- tests/Core/File/GetMemberPropertiesTest.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/Core/File/GetMemberPropertiesTest.php b/tests/Core/File/GetMemberPropertiesTest.php index 34d835a194..53cfe5f3d1 100644 --- a/tests/Core/File/GetMemberPropertiesTest.php +++ b/tests/Core/File/GetMemberPropertiesTest.php @@ -1306,7 +1306,7 @@ public static function dataGetMemberProperties() 'nullable_type' => false, ], ], - 'php8.4-final-public-complex-type-property' => [ + 'php8.4-final-public-nullable-typed-property' => [ 'identifier' => '/* testPHP84FinalNullableTypedProp */', 'expected' => [ 'scope' => 'public', @@ -1314,13 +1314,13 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, - 'type' => '(Foo&\Bar)|bool', - 'type_token' => -9, + 'type' => '?string', + 'type_token' => -2, 'type_end_token' => -2, - 'nullable_type' => false, + 'nullable_type' => true, ], ], - 'php8.4-final-public-nullable-typed-property' => [ + 'php8.4-final-public-complex-type-property' => [ 'identifier' => '/* testPHP84FinalComplexTypedProp */', 'expected' => [ 'scope' => 'public', @@ -1328,10 +1328,10 @@ public static function dataGetMemberProperties() 'is_static' => false, 'is_readonly' => false, 'is_final' => true, - 'type' => '?string', - 'type_token' => -2, + 'type' => '(Foo&\Bar)|bool', + 'type_token' => -9, 'type_end_token' => -2, - 'nullable_type' => true, + 'nullable_type' => false, ], ], ];