Skip to content

Commit ed07e4c

Browse files
authored
Fix issues with _get_list_table() (#261)
* Fix return type of _get_list_table() * Bump PHPStan version to 1.11
1 parent d661f9c commit ed07e4c

File tree

4 files changed

+29
-7
lines changed

4 files changed

+29
-7
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"nikic/php-parser": "^4.13",
1515
"php-stubs/generator": "^0.8.3",
1616
"phpdocumentor/reflection-docblock": "^5.4.1",
17-
"phpstan/phpstan": "^1.10.49",
17+
"phpstan/phpstan": "^1.11",
1818
"phpunit/phpunit": "^9.5",
1919
"szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1",
2020
"wp-coding-standards/wpcs": "3.1.0 as 2.3.0"

functionMap.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
'__return_empty_string' => ["''"],
3737
'__return_zero' => ['0'],
3838
'_wp_json_sanity_check' => ['T', '@phpstan-template' => 'T', 'value' => 'T', 'depth' => 'int<1, max>'],
39-
'_get_list_table' => ["(\$class_name is 'WP_Posts_List_Table'|'WP_Media_List_Table'|'WP_Terms_List_Table'|'WP_Users_List_Table'|'WP_Comments_List_Table'|'WP_Post_Comments_List_Table'|'WP_Links_List_Table'|'WP_Plugin_Install_List_Table'|'WP_Themes_List_Table'|'WP_Theme_Install_List_Table'|'WP_Plugins_List_Table'|'WP_Application_Passwords_List_Table'|'WP_MS_Sites_List_Table'|'WP_MS_Users_List_Table'|'WP_MS_Themes_List_Table'|'WP_Privacy_Data_Export_Requests_List_Table'|'WP_Privacy_Data_Removal_Requests_List_Table' ? T : false)", '@phpstan-template' => 'T', 'class_name' => 'class-string<T>', 'args' => 'array{screen?: string}'],
39+
'_get_list_table' => ["(\$class_name is 'WP_Posts_List_Table'|'WP_Media_List_Table'|'WP_Terms_List_Table'|'WP_Users_List_Table'|'WP_Comments_List_Table'|'WP_Post_Comments_List_Table'|'WP_Links_List_Table'|'WP_Plugin_Install_List_Table'|'WP_Themes_List_Table'|'WP_Theme_Install_List_Table'|'WP_Plugins_List_Table'|'WP_Application_Passwords_List_Table'|'WP_MS_Sites_List_Table'|'WP_MS_Users_List_Table'|'WP_MS_Themes_List_Table'|'WP_Privacy_Data_Export_Requests_List_Table'|'WP_Privacy_Data_Removal_Requests_List_Table' ? new<T> : false)", '@phpstan-template T' => 'of string', 'class_name' => 'T', 'args' => 'array{screen?: string}'],
4040
'absint' => ['($maybeint is T&int<0, max> ? T : ($maybeint is int<min, -1> ? int<1, max> : ($maybeint is empty ? 0 : ($maybeint is numeric-string ? int<0, max> : ($maybeint is string ? 0 : ($maybeint is true|non-empty-array ? 1 : ($maybeint is bool ? 0|1 : int<0, max>)))))))', '@phpstan-template T' => 'of int', 'maybeint' => 'T|scalar|array|resource|null'],
4141
'addslashes_gpc' => ['T', '@phpstan-template' => 'T', 'gpc' => 'T'],
4242
'add_submenu_page' => [null, 'callback' => "''|callable"],

tests/data/_get_list_table.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,16 @@
77
use function _get_list_table;
88
use function PHPStan\Testing\assertType;
99

10-
assertType('false', _get_list_table('Not_WP_List_Table'));
10+
// A non-class-string
11+
assertType('false', _get_list_table('string'));
1112

13+
// A class-string that is not class-string<WP_List_Table>
14+
assertType('false', _get_list_table('WP_Post'));
15+
16+
// WP_List_Table itself
17+
assertType('false', _get_list_table('WP_List_Table'));
18+
19+
// Core WP_List_Table classes
1220
assertType('WP_Posts_List_Table', _get_list_table('WP_Posts_List_Table'));
1321
assertType('WP_Media_List_Table', _get_list_table('WP_Media_List_Table'));
1422
assertType('WP_Terms_List_Table', _get_list_table('WP_Terms_List_Table'));
@@ -18,11 +26,25 @@
1826
assertType('WP_Links_List_Table', _get_list_table('WP_Links_List_Table'));
1927
assertType('WP_Plugin_Install_List_Table', _get_list_table('WP_Plugin_Install_List_Table'));
2028
assertType('WP_Themes_List_Table', _get_list_table('WP_Themes_List_Table'));
21-
assertType('WP_Theme_Install_List_Table', _get_list_table('WP_Theme_Install_List_Table'));
2229
assertType('WP_Plugins_List_Table', _get_list_table('WP_Plugins_List_Table'));
2330
assertType('WP_Application_Passwords_List_Table', _get_list_table('WP_Application_Passwords_List_Table'));
2431
assertType('WP_MS_Sites_List_Table', _get_list_table('WP_MS_Sites_List_Table'));
2532
assertType('WP_MS_Users_List_Table', _get_list_table('WP_MS_Users_List_Table'));
2633
assertType('WP_MS_Themes_List_Table', _get_list_table('WP_MS_Themes_List_Table'));
2734
assertType('WP_Privacy_Data_Export_Requests_List_Table', _get_list_table('WP_Privacy_Data_Export_Requests_List_Table'));
2835
assertType('WP_Privacy_Data_Removal_Requests_List_Table', _get_list_table('WP_Privacy_Data_Removal_Requests_List_Table'));
36+
37+
// Union of core WP_List_Table classes
38+
assertType('WP_Media_List_Table|WP_Posts_List_Table', _get_list_table(isset($_GET['foo']) ? 'WP_Posts_List_Table' : 'WP_Media_List_Table'));
39+
40+
// Union of core WP_List_Table class and class that is not a subclass of WP_List_Table
41+
assertType('WP_Posts_List_Table|false', _get_list_table(isset($_GET['foo']) ? 'WP_Posts_List_Table' : 'WP_Post'));
42+
43+
// WP_Post_Comments_List_Table is generalized WP_Comments_List_Table
44+
assertType('WP_Comments_List_Table', _get_list_table(isset($_GET['foo']) ? 'WP_Comments_List_Table' : 'WP_Post_Comments_List_Table'));
45+
46+
// WP_Theme_Install_List_Table is generalized to WP_Themes_List_Table
47+
assertType('WP_Themes_List_Table', _get_list_table(isset($_GET['foo']) ? 'WP_Themes_List_Table' : 'WP_Theme_Install_List_Table'));
48+
49+
// Unknown string
50+
assertType('WP_Application_Passwords_List_Table|WP_Comments_List_Table|WP_Links_List_Table|WP_Media_List_Table|WP_MS_Sites_List_Table|WP_MS_Themes_List_Table|WP_MS_Users_List_Table|WP_Plugin_Install_List_Table|WP_Plugins_List_Table|WP_Posts_List_Table|WP_Privacy_Data_Export_Requests_List_Table|WP_Privacy_Data_Removal_Requests_List_Table|WP_Terms_List_Table|WP_Themes_List_Table|WP_Users_List_Table|false', _get_list_table(Faker::string()));

wordpress-stubs.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82014,10 +82014,10 @@ function wp_get_popular_importers()
8201482014
* @param string $class_name The type of the list table, which is the class name.
8201582015
* @param array $args Optional. Arguments to pass to the class. Accepts 'screen'.
8201682016
* @return WP_List_Table|false List table object on success, false if the class does not exist.
82017-
* @phpstan-template T
82018-
* @phpstan-param class-string<T> $class_name
82017+
* @phpstan-template T of string
82018+
* @phpstan-param T $class_name
8201982019
* @phpstan-param array{screen?: string} $args
82020-
* @phpstan-return ($class_name is 'WP_Posts_List_Table'|'WP_Media_List_Table'|'WP_Terms_List_Table'|'WP_Users_List_Table'|'WP_Comments_List_Table'|'WP_Post_Comments_List_Table'|'WP_Links_List_Table'|'WP_Plugin_Install_List_Table'|'WP_Themes_List_Table'|'WP_Theme_Install_List_Table'|'WP_Plugins_List_Table'|'WP_Application_Passwords_List_Table'|'WP_MS_Sites_List_Table'|'WP_MS_Users_List_Table'|'WP_MS_Themes_List_Table'|'WP_Privacy_Data_Export_Requests_List_Table'|'WP_Privacy_Data_Removal_Requests_List_Table' ? T : false)
82020+
* @phpstan-return ($class_name is 'WP_Posts_List_Table'|'WP_Media_List_Table'|'WP_Terms_List_Table'|'WP_Users_List_Table'|'WP_Comments_List_Table'|'WP_Post_Comments_List_Table'|'WP_Links_List_Table'|'WP_Plugin_Install_List_Table'|'WP_Themes_List_Table'|'WP_Theme_Install_List_Table'|'WP_Plugins_List_Table'|'WP_Application_Passwords_List_Table'|'WP_MS_Sites_List_Table'|'WP_MS_Users_List_Table'|'WP_MS_Themes_List_Table'|'WP_Privacy_Data_Export_Requests_List_Table'|'WP_Privacy_Data_Removal_Requests_List_Table' ? new<T> : false)
8202182021
*/
8202282022
function _get_list_table($class_name, $args = array())
8202382023
{

0 commit comments

Comments
 (0)