diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml new file mode 100644 index 0000000..44ac9a9 --- /dev/null +++ b/.github/workflows/generate.yml @@ -0,0 +1,37 @@ +name: Generate stubs + +on: workflow_dispatch + +env: + php-version: '7.4' + +jobs: + generate-stubs: + name: Generate stubs + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install PHP + uses: shivammathur/setup-php@v2 + with: + coverage: none + ini-file: development + php-version: ${{ env.php-version }} + + - name: Install dependencies + run: composer install --no-interaction --no-progress --prefer-dist + + - name: Generate stubs + run: | + ./generate.sh # Generate stubs + + - name: Commit file + run: | + git config --local user.name "GitHub Actions" + git config --local user.email "no-reply@github.com" + git add wordpress-stubs.php + git commit -m "Update WordPress stubs" || exit 0 + git push origin ${{ github.ref_name }} diff --git a/functionMap.php b/functionMap.php index 384a6fa..9fa6e10 100644 --- a/functionMap.php +++ b/functionMap.php @@ -51,6 +51,7 @@ 'WP_Http::head' => [$httpReturnType], 'WP_Http::post' => [$httpReturnType], 'WP_Http::request' => [$httpReturnType], + 'wp_list_bookmarks' => ['($args is array{echo: false|0} ? string : void)'], 'wp_list_pages' => ['($args is array{echo: false} ? string : void)'], 'WP_List_Table::set_pagination_args' => ['void', 'args' => 'array{total_items?: int, total_pages?: int, per_page?: int}'], 'wp_next_scheduled' => [null, 'args' => $cronArgsType], diff --git a/tests/TypeInferenceTest.php b/tests/TypeInferenceTest.php index 68c9e2f..34c271f 100644 --- a/tests/TypeInferenceTest.php +++ b/tests/TypeInferenceTest.php @@ -35,6 +35,7 @@ public function dataFileAsserts(): iterable 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_list_bookmarks.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_list_pages.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_rest_request.php'); yield from $this->gatherAssertTypes(__DIR__ . '/data/wp_theme.php'); diff --git a/tests/data/wp_list_bookmarks.php b/tests/data/wp_list_bookmarks.php new file mode 100644 index 0000000..ba51576 --- /dev/null +++ b/tests/data/wp_list_bookmarks.php @@ -0,0 +1,31 @@ + true, 'key' => 'value'])); +assertType('null', wp_list_bookmarks(['echo' => 1, 'key' => 'value'])); + +// Explicit value of false|0 +assertType('string', wp_list_bookmarks(['echo' => false, 'key' => 'value'])); +assertType('string', wp_list_bookmarks(['echo' => 0, 'key' => 'value'])); + +// Unknown value +assertType('string|null', wp_list_bookmarks(['echo' => (bool)$GET['echo'], 'key' => 'value'])); +assertType('string|null', wp_list_bookmarks(['echo' => (int)$GET['echo'], 'key' => 'value'])); diff --git a/wordpress-stubs.php b/wordpress-stubs.php index ae00d8d..e4b594e 100644 --- a/wordpress-stubs.php +++ b/wordpress-stubs.php @@ -100931,6 +100931,7 @@ function _walk_bookmarks($bookmarks, $args = '') * category_orderby?: string, * category_order?: string, * } $args + * @phpstan-return ($args is array{echo: false|0} ? string : void) */ function wp_list_bookmarks($args = '') {