From b538a3948beaf31a298f78586a292ec019657f0a Mon Sep 17 00:00:00 2001 From: IanDelMar <42134098+IanDelMar@users.noreply.github.com> Date: Sat, 24 Aug 2024 08:14:54 +0200 Subject: [PATCH] Add cond. return type for wp_dropdown_languages() (#198) --- functionMap.php | 1 + tests/TypeInferenceTest.php | 1 + tests/data/wp_dropdown_languages.php | 43 ++++++++++++++++++++++++++++ wordpress-stubs.php | 1 + 4 files changed, 46 insertions(+) create mode 100644 tests/data/wp_dropdown_languages.php diff --git a/functionMap.php b/functionMap.php index 813dc64..19e092f 100644 --- a/functionMap.php +++ b/functionMap.php @@ -42,6 +42,7 @@ 'stripslashes_deep' => ['T', '@phpstan-template' => 'T', 'value' => 'T'], 'urldecode_deep' => ['T', '@phpstan-template' => 'T', 'value' => 'T'], 'urlencode_deep' => ['T', '@phpstan-template' => 'T', 'value' => 'T'], + 'wp_dropdown_languages' => ["(\$args is array{id: null|''} ? void : (\$args is array{name: null|''} ? void : string))"], 'wp_clear_scheduled_hook' => ['(0|positive-int|($wp_error is false ? false : \WP_Error))', 'args' => $cronArgsType], 'wp_get_schedule' => [null, 'args' => $cronArgsType], 'wp_get_scheduled_event' => [null, 'args' => $cronArgsType], diff --git a/tests/TypeInferenceTest.php b/tests/TypeInferenceTest.php index aea652b..7c27a7f 100644 --- a/tests/TypeInferenceTest.php +++ b/tests/TypeInferenceTest.php @@ -32,6 +32,7 @@ public function dataFileAsserts(): iterable yield from $this->gatherAssertTypes(__DIR__ . '/data/mysql2date.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/term_exists.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_debug_backtrace_summary.php'); + yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_dropdown_languages.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_error_parameter.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_get_archives.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_rest_request.php'); diff --git a/tests/data/wp_dropdown_languages.php b/tests/data/wp_dropdown_languages.php new file mode 100644 index 0000000..38d452b --- /dev/null +++ b/tests/data/wp_dropdown_languages.php @@ -0,0 +1,43 @@ + ''])); + +// Void return type +assertType('null', wp_dropdown_languages(['id' => $emptyStringOrNull, 'selected' => ''])); +assertType('null', wp_dropdown_languages(['name' => $emptyStringOrNull, 'selected' => ''])); +assertType('null', wp_dropdown_languages(['id' => $emptyStringOrNull, 'name' => $emptyStringOrNull, 'selected' => ''])); + +// string return type +assertType('string', wp_dropdown_languages(['id' => 'nonEmptyString', 'selected' => ''])); +assertType('string', wp_dropdown_languages(['name' => 'nonEmptyString', 'selected' => ''])); +assertType('string', wp_dropdown_languages(['id' => 'nonEmptyString', 'name' => 'nonEmptyString', 'selected' => ''])); + +// Unknown value +assertType('string|null', wp_dropdown_languages(['id' => $stringOrNull, 'selected' => ''])); +assertType('string|null', wp_dropdown_languages(['name' => $stringOrNull, 'selected' => ''])); +assertType('string|null', wp_dropdown_languages(['id' => $stringOrNull, 'name' => $stringOrNull, 'selected' => ''])); +assertType('string|null', wp_dropdown_languages(['id' => 'nonEmptyString', 'name' => $stringOrNull, 'selected' => ''])); +assertType('string|null', wp_dropdown_languages(['id' => $stringOrNull, 'name' => 'nonEmptyString', 'selected' => ''])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index 38e8593..ea46d51 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -120777,6 +120777,7 @@ function wp_get_l10n_php_file_data($php_file) * show_option_en_us?: bool, * explicit_option_en_us?: bool, * } $args + * @phpstan-return ($args is array{id: null|''} ? void : ($args is array{name: null|''} ? void : string)) */ function wp_dropdown_languages($args = array()) {