diff --git a/src/Files/File.php b/src/Files/File.php index e6c7e608ce..aabafd46b5 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,7 +1963,10 @@ public function getMemberProperties($stackPtr) case T_READONLY: $isReadonly = true; break; - } + case T_FINAL: + $isFinal = true; + break; + }//end switch }//end for $type = ''; @@ -2016,6 +2022,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..c858826607 100644 --- a/tests/Core/File/GetMemberPropertiesTest.inc +++ b/tests/Core/File/GetMemberPropertiesTest.inc @@ -354,3 +354,24 @@ trait DNFTypes { // Intentional fatal error - nullable operator cannot be combined with DNF. var ?(A&\Pck\B)|bool $propD; } + +class WithFinalProperties { + /* testPHP84FinalPublicTypedProp */ + final public string $val1; + /* testPHP84FinalProtectedTypedProp */ + final protected string $val2; + /* testPHP84FinalMiddleTypedProp */ + public final string $val3; + /* testPHP84FinalMiddleStaticTypedProp */ + public final static string $val4; + /* testPHP84FinalLastTypedProp */ + public readonly final string $val5; + /* testPHP84FinalImplicitVisibilityTypedProp */ + final string $val6; + /* testPHP84FinalImplicitVisibilityProp */ + 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 2d5fbe6346..53cfe5f3d1 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,139 @@ 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-public-property' => [ + 'identifier' => '/* testPHP84FinalPublicTypedProp */', + '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-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-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' => [ + '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, + ], + ], + 'php8.4-final-public-nullable-typed-property' => [ + 'identifier' => '/* testPHP84FinalNullableTypedProp */', + '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, + ], + ], + 'php8.4-final-public-complex-type-property' => [ + 'identifier' => '/* testPHP84FinalComplexTypedProp */', + '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, + ], + ], ]; }//end dataGetMemberProperties()