diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 0000000000..2f6f88d0df
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,13 @@
+FROM mcr.microsoft.com/vscode/devcontainers/php:8.1
+
+# [Optional] Uncomment this section to install additional OS packages.
+# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+# && apt-get -y install --no-install-recommends
+
+# [Optional] Uncomment this line to install global node packages.
+# RUN su vscode -c "source /usr/local/share/nvm/nvm.sh && npm install -g " 2>&1
+
+# PHP memory limit
+RUN echo "memory_limit=768M" > /usr/local/etc/php/php.ini
+
+COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 0000000000..ff13dd64a3
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,27 @@
+{
+ "name": "PHP",
+ "build": {
+ "dockerfile": "Dockerfile"
+ },
+
+ // Set *default* container specific settings.json values on container create.
+ "settings": {
+ "terminal.integrated.shell.linux": "/bin/bash"
+ },
+
+ // Add the IDs of extensions you want installed when the container is created.
+ "extensions": [
+ "felixfbecker.php-debug",
+ "felixfbecker.php-intellisense",
+ "mrmlnc.vscode-apache"
+ ],
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ "forwardPorts": [8080],
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ "postCreateCommand": "composer install"
+
+ // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root.
+ // "remoteUser": "vscode"
+}
diff --git a/.devcontainer/library-scripts/README.md b/.devcontainer/library-scripts/README.md
new file mode 100644
index 0000000000..d06dfd1a95
--- /dev/null
+++ b/.devcontainer/library-scripts/README.md
@@ -0,0 +1,5 @@
+# Warning: Folder contents may be replaced
+
+The contents of this folder will be automatically replaced with a file of the same name in the [vscode-dev-containers](https://github.com/microsoft/vscode-dev-containers) repository's [script-library folder](https://github.com/microsoft/vscode-dev-containers/tree/master/script-library) whenever the repository is packaged.
+
+To retain your edits, move the file to a different location. You may also delete the files if they are not needed.
\ No newline at end of file
diff --git a/.devcontainer/library-scripts/common-debian.sh b/.devcontainer/library-scripts/common-debian.sh
new file mode 100755
index 0000000000..20a9216af7
--- /dev/null
+++ b/.devcontainer/library-scripts/common-debian.sh
@@ -0,0 +1,195 @@
+#!/usr/bin/env bash
+#-------------------------------------------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
+#-------------------------------------------------------------------------------------------------------------
+
+# Syntax: ./common-debian.sh [install zsh flag] [username] [user UID] [user GID] [upgrade packages flag]
+
+INSTALL_ZSH=${1:-"true"}
+USERNAME=${2:-"vscode"}
+USER_UID=${3:-1000}
+USER_GID=${4:-1000}
+UPGRADE_PACKAGES=${5:-"true"}
+
+set -e
+
+if [ "$(id -u)" -ne 0 ]; then
+ echo -e 'Script must be run a root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
+ exit 1
+fi
+
+# Treat a user name of "none" as root
+if [ "${USERNAME}" = "none" ] || [ "${USERNAME}" = "root" ]; then
+ USERNAME=root
+ USER_UID=0
+ USER_GID=0
+fi
+
+# Load markers to see which steps have already run
+MARKER_FILE="/usr/local/etc/vscode-dev-containers/common"
+if [ -f "${MARKER_FILE}" ]; then
+ echo "Marker file found:"
+ cat "${MARKER_FILE}"
+ source "${MARKER_FILE}"
+fi
+
+# Ensure apt is in non-interactive to avoid prompts
+export DEBIAN_FRONTEND=noninteractive
+
+# Function to call apt-get if needed
+apt-get-update-if-needed()
+{
+ if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then
+ echo "Running apt-get update..."
+ apt-get update
+ else
+ echo "Skipping apt-get update."
+ fi
+}
+
+# Run install apt-utils to avoid debconf warning then verify presence of other common developer tools and dependencies
+if [ "${PACKAGES_ALREADY_INSTALLED}" != "true" ]; then
+ apt-get-update-if-needed
+
+ PACKAGE_LIST="apt-utils \
+ git \
+ openssh-client \
+ gnupg2 \
+ iproute2 \
+ procps \
+ lsof \
+ htop \
+ net-tools \
+ psmisc \
+ curl \
+ wget \
+ rsync \
+ ca-certificates \
+ unzip \
+ zip \
+ nano \
+ vim-tiny \
+ less \
+ jq \
+ lsb-release \
+ apt-transport-https \
+ dialog \
+ libc6 \
+ libgcc1 \
+ libgssapi-krb5-2 \
+ libicu[0-9][0-9] \
+ liblttng-ust0 \
+ libstdc++6 \
+ zlib1g \
+ locales \
+ sudo \
+ ncdu \
+ man-db"
+
+ # Install libssl1.1 if available
+ if [[ ! -z $(apt-cache --names-only search ^libssl1.1$) ]]; then
+ PACKAGE_LIST="${PACKAGE_LIST} libssl1.1"
+ fi
+
+ # Install appropriate version of libssl1.0.x if available
+ LIBSSL=$(dpkg-query -f '${db:Status-Abbrev}\t${binary:Package}\n' -W 'libssl1\.0\.?' 2>&1 || echo '')
+ if [ "$(echo "$LIBSSL" | grep -o 'libssl1\.0\.[0-9]:' | uniq | sort | wc -l)" -eq 0 ]; then
+ if [[ ! -z $(apt-cache --names-only search ^libssl1.0.2$) ]]; then
+ # Debian 9
+ PACKAGE_LIST="${PACKAGE_LIST} libssl1.0.2"
+ elif [[ ! -z $(apt-cache --names-only search ^libssl1.0.0$) ]]; then
+ # Ubuntu 18.04, 16.04, earlier
+ PACKAGE_LIST="${PACKAGE_LIST} libssl1.0.0"
+ fi
+ fi
+
+ echo "Packages to verify are installed: ${PACKAGE_LIST}"
+ apt-get -y install --no-install-recommends ${PACKAGE_LIST} 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 )
+
+ PACKAGES_ALREADY_INSTALLED="true"
+fi
+
+# Get to latest versions of all packages
+if [ "${UPGRADE_PACKAGES}" = "true" ]; then
+ apt-get-update-if-needed
+ apt-get -y upgrade --no-install-recommends
+ apt-get autoremove -y
+fi
+
+# Ensure at least the en_US.UTF-8 UTF-8 locale is available.
+# Common need for both applications and things like the agnoster ZSH theme.
+if [ "${LOCALE_ALREADY_SET}" != "true" ]; then
+ echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
+ locale-gen
+ LOCALE_ALREADY_SET="true"
+fi
+
+# Create or update a non-root user to match UID/GID - see https://aka.ms/vscode-remote/containers/non-root-user.
+if id -u $USERNAME > /dev/null 2>&1; then
+ # User exists, update if needed
+ if [ "$USER_GID" != "$(id -G $USERNAME)" ]; then
+ groupmod --gid $USER_GID $USERNAME
+ usermod --gid $USER_GID $USERNAME
+ fi
+ if [ "$USER_UID" != "$(id -u $USERNAME)" ]; then
+ usermod --uid $USER_UID $USERNAME
+ fi
+else
+ # Create user
+ groupadd --gid $USER_GID $USERNAME
+ useradd -s /bin/bash --uid $USER_UID --gid $USER_GID -m $USERNAME
+fi
+
+# Add add sudo support for non-root user
+if [ "${USERNAME}" != "root" ] && [ "${EXISTING_NON_ROOT_USER}" != "${USERNAME}" ]; then
+ echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME
+ chmod 0440 /etc/sudoers.d/$USERNAME
+ EXISTING_NON_ROOT_USER="${USERNAME}"
+fi
+
+# .bashrc/.zshrc snippet
+RC_SNIPPET="$(cat << EOF
+export USER=\$(whoami)
+
+export PATH=\$PATH:\$HOME/.local/bin
+
+if type code-insiders > /dev/null 2>&1 && ! type code > /dev/null 2>&1; then
+ alias code=code-insiders
+fi
+EOF
+)"
+
+# Ensure ~/.local/bin is in the PATH for root and non-root users for bash. (zsh is later)
+if [ "${RC_SNIPPET_ALREADY_ADDED}" != "true" ]; then
+ echo "${RC_SNIPPET}" >> /etc/bash.bashrc
+ RC_SNIPPET_ALREADY_ADDED="true"
+fi
+
+# Optionally install and configure zsh
+if [ "${INSTALL_ZSH}" = "true" ] && [ ! -d "/root/.oh-my-zsh" ] && [ "${ZSH_ALREADY_INSTALLED}" != "true" ]; then
+ apt-get-update-if-needed
+ apt-get install -y zsh
+ curl -fsSLo- https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh | bash 2>&1
+ echo "${RC_SNIPPET}" >> /etc/zsh/zshrc
+ echo -e "DEFAULT_USER=\$USER\nprompt_context(){}" >> /root/.zshrc
+ cp -fR /root/.oh-my-zsh /etc/skel
+ cp -f /root/.zshrc /etc/skel
+ sed -i -e "s/\/root\/.oh-my-zsh/\/home\/\$(whoami)\/.oh-my-zsh/g" /etc/skel/.zshrc
+ if [ "${USERNAME}" != "root" ]; then
+ cp -fR /etc/skel/.oh-my-zsh /etc/skel/.zshrc /home/$USERNAME
+ chown -R $USER_UID:$USER_GID /home/$USERNAME/.oh-my-zsh /home/$USERNAME/.zshrc
+ fi
+ ZSH_ALREADY_INSTALLED="true"
+fi
+
+# Write marker file
+mkdir -p "$(dirname "${MARKER_FILE}")"
+echo -e "\
+ PACKAGES_ALREADY_INSTALLED=${PACKAGES_ALREADY_INSTALLED}\n\
+ LOCALE_ALREADY_SET=${LOCALE_ALREADY_SET}\n\
+ EXISTING_NON_ROOT_USER=${EXISTING_NON_ROOT_USER}\n\
+ RC_SNIPPET_ALREADY_ADDED=${RC_SNIPPET_ALREADY_ADDED}\n\
+ ZSH_ALREADY_INSTALLED=${ZSH_ALREADY_INSTALLED}" > "${MARKER_FILE}"
+
+echo "Done!"
\ No newline at end of file
diff --git a/.devcontainer/library-scripts/node-debian.sh b/.devcontainer/library-scripts/node-debian.sh
new file mode 100644
index 0000000000..d230a14e82
--- /dev/null
+++ b/.devcontainer/library-scripts/node-debian.sh
@@ -0,0 +1,105 @@
+#!/bin/bash
+#-------------------------------------------------------------------------------------------------------------
+# Copyright (c) Microsoft Corporation. All rights reserved.
+# Licensed under the MIT License. See https://go.microsoft.com/fwlink/?linkid=2090316 for license information.
+#-------------------------------------------------------------------------------------------------------------
+
+# Syntax: ./node-debian.sh [directory to install nvm] [node version to install (use "none" to skip)] [non-root user]
+
+export NVM_DIR=${1:-"/usr/local/share/nvm"}
+export NODE_VERSION=${2:-"lts/*"}
+USERNAME=${3:-"vscode"}
+UPDATE_RC=${4:-"true"}
+
+set -e
+
+if [ "$(id -u)" -ne 0 ]; then
+ echo -e 'Script must be run a root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
+ exit 1
+fi
+
+# Treat a user name of "none" or non-existent user as root
+if [ "${USERNAME}" = "none" ] || ! id -u ${USERNAME} > /dev/null 2>&1; then
+ USERNAME=root
+fi
+
+if [ "${NODE_VERSION}" = "none" ]; then
+ export NODE_VERSION=
+fi
+
+# Ensure apt is in non-interactive to avoid prompts
+export DEBIAN_FRONTEND=noninteractive
+
+# Install curl, apt-transport-https, tar, or gpg if missing
+if ! dpkg -s apt-transport-https curl ca-certificates tar > /dev/null 2>&1 || ! type gpg > /dev/null 2>&1; then
+ if [ ! -d "/var/lib/apt/lists" ] || [ "$(ls /var/lib/apt/lists/ | wc -l)" = "0" ]; then
+ apt-get update
+ fi
+ apt-get -y install --no-install-recommends apt-transport-https curl ca-certificates tar gnupg2
+fi
+
+# Install yarn
+if type yarn > /dev/null 2>&1; then
+ echo "Yarn already installed."
+else
+ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | (OUT=$(apt-key add - 2>&1) || echo $OUT)
+ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
+ apt-get update
+ apt-get -y install --no-install-recommends yarn
+fi
+
+# Install the specified node version if NVM directory already exists, then exit
+if [ -d "${NVM_DIR}" ]; then
+ echo "NVM already installed."
+ if [ "${NODE_VERSION}" != "" ]; then
+ su ${USERNAME} -c "source $NVM_DIR/nvm.sh && nvm install ${NODE_VERSION} && nvm clear-cache"
+ fi
+ exit 0
+fi
+
+
+# Run NVM installer as non-root if needed
+mkdir -p ${NVM_DIR}
+chown ${USERNAME} ${NVM_DIR}
+su ${USERNAME} -c "$(cat << EOF
+ set -e
+
+ # Do not update profile - we'll do this manually
+ export PROFILE=/dev/null
+
+ curl -so- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
+ source ${NVM_DIR}/nvm.sh
+ if [ "${NODE_VERSION}" != "" ]; then
+ nvm alias default ${NODE_VERSION}
+ fi
+ nvm clear-cache
+EOF
+)" 2>&1
+
+if [ "${UPDATE_RC}" = "true" ]; then
+ echo "Updating /etc/bash.bashrc and /etc/zsh/zshrc with NVM scripts..."
+(cat < /dev/null 2>&1; then
+ echo "Fixing permissions of \"\$NVM_DIR\"..."
+ sudoIf chown -R ${USERNAME}:root \$NVM_DIR
+ else
+ echo "Warning: NVM directory is not owned by ${USERNAME} and sudo is not installed. Unable to correct permissions."
+ fi
+fi
+[ -s "\$NVM_DIR/nvm.sh" ] && . "\$NVM_DIR/nvm.sh"
+[ -s "\$NVM_DIR/bash_completion" ] && . "\$NVM_DIR/bash_completion"
+EOF
+) | tee -a /etc/bash.bashrc >> /etc/zsh/zshrc
+fi
+
+echo "Done!"
\ No newline at end of file
diff --git a/.editorconfig b/.editorconfig
index 5d66bc427b..0dc4814a91 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -6,7 +6,11 @@ insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
-[*.{php,phpt}]
+[*.{php,phpt,stub}]
+indent_style = tab
+indent_size = 4
+
+[bin/phpstan]
indent_style = tab
indent_size = 4
diff --git a/.gitattributes b/.gitattributes
index 38d1f155b8..ed98b8a4c8 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,5 +1,4 @@
*.php text eol=lf
*.stub linguist-language=PHP
-*.neon linguist-language=YAML
tests/PHPStan/Command/ErrorFormatter/data/WindowsNewlines.php eol=crlf
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index 3f6be2dabb..0000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-version: 2
-updates:
-- package-ecosystem: composer
- directory: "/build-cs"
- schedule:
- interval: daily
- open-pull-requests-limit: 10
-- package-ecosystem: github-actions
- directory: "/"
- schedule:
- interval: daily
- open-pull-requests-limit: 10
diff --git a/.github/renovate.json b/.github/renovate.json
new file mode 100644
index 0000000000..59522a2dbc
--- /dev/null
+++ b/.github/renovate.json
@@ -0,0 +1,51 @@
+{
+ "extends": [
+ "config:base",
+ "schedule:weekly"
+ ],
+ "dependencyDashboard": true,
+ "rangeStrategy": "update-lockfile",
+ "rebaseWhen": "conflicted",
+ "baseBranches": ["2.1.x"],
+ "packageRules": [
+ {
+ "matchPackagePatterns": ["*"],
+ "enabled": false
+ },
+ {
+ "matchPaths": ["+(composer.json)"],
+ "enabled": true,
+ "matchBaseBranches": ["2.1.x"]
+ },
+ {
+ "matchPaths": ["build-cs/**"],
+ "enabled": true,
+ "groupName": "build-cs"
+ },
+ {
+ "matchPaths": ["apigen/**"],
+ "enabled": true,
+ "groupName": "apigen"
+ },
+ {
+ "matchPaths": ["issue-bot/**"],
+ "enabled": true,
+ "groupName": "issue-bot"
+ },
+ {
+ "matchPaths": ["changelog-generator/**"],
+ "enabled": true,
+ "groupName": "changelog-generator"
+ },
+ {
+ "matchPaths": ["compiler/**"],
+ "enabled": true,
+ "groupName": "compiler"
+ },
+ {
+ "matchPaths": [".github/**"],
+ "enabled": true,
+ "groupName": "github-actions"
+ }
+ ]
+}
diff --git a/.github/workflows/apiref.yml b/.github/workflows/apiref.yml
new file mode 100644
index 0000000000..24ba44284b
--- /dev/null
+++ b/.github/workflows/apiref.yml
@@ -0,0 +1,108 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "API Reference"
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'src/**'
+ - 'composer.lock'
+ - 'apigen/**'
+ - '.github/workflows/apiref.yml'
+
+env:
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+concurrency:
+ group: apigen-${{ github.ref }} # will be canceled on subsequent pushes in branch
+ cancel-in-progress: true
+
+jobs:
+ apigen:
+ name: "Run ApiGen"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Install ApiGen dependencies"
+ working-directory: "apigen"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Run ApiGen"
+ run: "apigen/vendor/bin/apigen -c apigen/apigen.neon --output docs -- src vendor/nikic/php-parser vendor/ondrejmirtes/better-reflection vendor/phpstan/phpdoc-parser"
+
+ - name: "Upload docs"
+ uses: actions/upload-artifact@v4
+ with:
+ name: docs
+ path: docs
+
+ deploy:
+ name: "Deploy"
+ needs:
+ - apigen
+ if: github.repository_owner == 'phpstan'
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: "Install Node"
+ uses: actions/setup-node@v4
+ with:
+ node-version: "16"
+
+ - name: "Download docs"
+ uses: actions/download-artifact@v4
+ with:
+ name: docs
+ path: docs
+
+ - name: "Sync with S3"
+ uses: jakejarvis/s3-sync-action@v0.5.1
+ with:
+ args: --exclude '.git*/*' --follow-symlinks
+ env:
+ SOURCE_DIR: './docs'
+ DEST_DIR: ${{ github.ref_name }}
+ AWS_REGION: 'eu-west-1'
+ AWS_S3_BUCKET: "web-apiref.phpstan.org"
+ AWS_ACCESS_KEY_ID: ${{ secrets.APIREF_AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.APIREF_AWS_SECRET_ACCESS_KEY }}
+
+ - name: "Invalidate CloudFront"
+ uses: chetan/invalidate-cloudfront-action@v2
+ env:
+ DISTRIBUTION: "E37G1C2KWNAPBD"
+ PATHS: '/${{ github.ref_name }}/*'
+ AWS_REGION: 'eu-west-1'
+ AWS_ACCESS_KEY_ID: ${{ secrets.APIREF_AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.APIREF_AWS_SECRET_ACCESS_KEY }}
+
+ - uses: peter-evans/repository-dispatch@v3
+ with:
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ repository: "phpstan/phpstan"
+ event-type: check_website_links
+
+ - name: "Check for broken links"
+ uses: ScholliYT/Broken-Links-Crawler-Action@v3
+ with:
+ website_url: 'https://apiref.phpstan.org/$%7B%7B%20github.ref_name%20%7D%7D/index.html'
+ resolve_before_filtering: 'true'
+ verbose: 'warning'
+ max_retry_time: 30
+ max_retries: 5
diff --git a/.github/workflows/backward-compatibility.yml b/.github/workflows/backward-compatibility.yml
new file mode 100644
index 0000000000..541d15addc
--- /dev/null
+++ b/.github/workflows/backward-compatibility.yml
@@ -0,0 +1,47 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Backward Compatibility"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'src/**'
+ - '.github/workflows/backward-compatibility.yml'
+
+concurrency:
+ group: bc-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ backward-compatibility:
+ name: "Backward Compatibility"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+
+ - name: "Install dependencies"
+ run: "composer install --no-dev --no-interaction --no-progress"
+
+ - name: "Install BackwardCompatibilityCheck"
+ run: |
+ composer global config minimum-stability dev
+ composer global config prefer-stable true
+ composer global require --dev ondrejmirtes/backward-compatibility-check:^7.3.0.1
+
+ - name: "Check"
+ run: "$(composer global config bin-dir --absolute)/roave-backward-compatibility-check"
diff --git a/.github/workflows/block-merge-commits.yml b/.github/workflows/block-merge-commits.yml
new file mode 100644
index 0000000000..2399d07570
--- /dev/null
+++ b/.github/workflows/block-merge-commits.yml
@@ -0,0 +1,15 @@
+on: pull_request
+
+name: Block merge commits
+
+jobs:
+ message-check:
+ name: Block Merge Commits
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Block Merge Commits
+ uses: Morishiri/block-merge-commits-action@v1.0.1
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/build-issue-bot.yml b/.github/workflows/build-issue-bot.yml
new file mode 100644
index 0000000000..0c6904033b
--- /dev/null
+++ b/.github/workflows/build-issue-bot.yml
@@ -0,0 +1,54 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Build Issue Bot"
+
+on:
+ pull_request:
+ paths:
+ - 'issue-bot/**'
+ - '.github/workflows/build-issue-bot.yml'
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'issue-bot/**'
+ - '.github/workflows/build-issue-bot.yml'
+
+concurrency:
+ group: build-issue-bot-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ build-issue-bot:
+ name: "Build Issue Bot"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ script:
+ - "../bin/phpstan"
+ - "vendor/bin/phpunit"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Install Issue Bot dependencies"
+ working-directory: "issue-bot"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Tests"
+ working-directory: "issue-bot"
+ run: ${{ matrix.script }}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 69f8591abc..0000000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,482 +0,0 @@
-# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
-
-name: "Build"
-
-on:
- pull_request:
- push:
- branches:
- - "master"
-
-env:
- COMPOSER_ROOT_VERSION: "0.12.x-dev"
-
-jobs:
- lint:
- name: "Lint"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- - "7.4"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Validate Composer"
- run: "composer validate"
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- if: matrix.php-version != '7.4'
- run: php bin/transform-source.php
-
- - name: "Lint"
- run: "vendor/bin/phing lint"
-
- coding-standards:
- name: "Coding Standard"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.4"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Validate Composer"
- run: "composer validate"
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- if: matrix.php-version != '7.4'
- run: php bin/transform-source.php
-
- - name: "Composer Normalize"
- run: "vendor/bin/phing composer-normalize-check"
-
- - name: "Lint"
- run: "vendor/bin/phing lint"
-
- - name: "Coding Standard"
- run: "vendor/bin/phing cs"
-
- dependency-analysis:
- name: "Dependency Analysis"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.4"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Composer Require Checker"
- run: "vendor/bin/phing composer-require-checker"
-
- tests:
- name: "Tests"
-
- runs-on: ${{ matrix.operating-system }}
-
- strategy:
- fail-fast: false
- matrix:
- php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- - "7.4"
- operating-system: [ubuntu-latest, windows-latest]
- script:
- - "vendor/bin/phing tests"
- - "vendor/bin/phing tests-fast-static-reflection"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
- tools: pecl
- extensions: ds,mbstring
- ini-values: memory_limit=512M
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- if: matrix.php-version != '7.4'
- run: php bin/transform-source.php
-
- - name: "Tests"
- run: "${{ matrix.script }}"
-
- tests-code-coverage:
- name: "Tests with code coverage"
-
- runs-on: "ubuntu-latest"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "pcov"
- php-version: "7.4"
- tools: pecl
- extensions: ds
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-7.4-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-7.4-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Tests"
- run: |
- composer require pcov/clobber --dev && \
- vendor/bin/pcov clobber && \
- php -dpcov.enabled=1 -dpcov.directory=. -dpcov.exclude="~vendor~" vendor/bin/phpunit -c tests/phpunit.xml tests/PHPStan
-
- - name: "Codecov.io"
- env:
- CODECOV_TOKEN: "${{ secrets.CODECOV_TOKEN }}"
- run: "bash <(curl -s https://codecov.io/bash) -f tests/tmp/clover.xml"
-
- static-analysis:
- name: "PHPStan"
-
- runs-on: ${{ matrix.operating-system }}
-
- strategy:
- fail-fast: false
- matrix:
- php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- - "7.4"
- operating-system: [ubuntu-latest, windows-latest]
- script:
- - "vendor/bin/phing phpstan"
- - "vendor/bin/phing phpstan-runtime-reflection"
- - "vendor/bin/phing phpstan-static-reflection"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
- extensions: mbstring
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- if: matrix.php-version != '7.4'
- run: php bin/transform-source.php
-
- - name: "PHPStan"
- run: ${{ matrix.script }}
-
- static-analysis-with-result-cache:
- name: "PHPStan with result cache"
-
- runs-on: ${{ matrix.operating-system }}
-
- strategy:
- matrix:
- php-version:
- - "7.4"
- operating-system: [ubuntu-latest, windows-latest]
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
- extensions: mbstring
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Cache Result cache"
- uses: actions/cache@v1
- with:
- path: ./tmp
- key: "result-cache-v4"
-
- - name: "PHPStan with result cache"
- if: matrix.operating-system == 'ubuntu-latest'
- run: |
- vendor/bin/phing phpstan-result-cache
- bin/phpstan clear-result-cache -c build/phpstan.neon
- vendor/bin/phing phpstan-result-cache
- echo -e "\n\n" >> src/TrinaryLogic.php
- vendor/bin/phing phpstan-result-cache
- vendor/bin/phing phpstan-result-cache
-
- - name: "PHPStan with result cache"
- if: matrix.operating-system == 'windows-latest'
- shell: cmd
- run: vendor\bin\phing phpstan-result-cache && php bin\phpstan clear-result-cache -c build/phpstan.neon && vendor\bin\phing phpstan-result-cache && echo. >> src\TrinaryLogic.php && vendor\bin\phing phpstan-result-cache && vendor\bin\phing phpstan-result-cache
-
- - name: "Upload result cache artifact"
- uses: actions/upload-artifact@v2.0.1
- with:
- name: resultCache-${{ matrix.operating-system }}.php
- path: tmp/resultCache.php
-
- result-cache-e2e-tests:
- name: "Result cache E2E tests"
-
- runs-on: ${{ matrix.operating-system }}
-
- strategy:
- matrix:
- php-version:
- - "7.4"
- operating-system: [ubuntu-latest, windows-latest]
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
- extensions: mbstring
- ini-values: memory_limit=256M
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Tests"
- run: |
- git clone https://github.com/nikic/PHP-Parser.git tests/e2e/PHP-Parser && git -C tests/e2e/PHP-Parser checkout v3.1.5 && composer install --working-dir tests/e2e/PHP-Parser && vendor/bin/phpunit -c tests/phpunit.xml tests/e2e/ResultCacheEndToEndTest.php
-
- compiler-tests:
- name: "Compiler Tests"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.3"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-dev --no-interaction --no-progress --no-suggest"
-
- - name: "Transform source code"
- run: php bin/transform-source.php
-
- - name: "Tests"
- run: |
- cd compiler && \
- composer install --no-interaction && \
- vendor/bin/phpunit -c tests/phpunit.xml tests && \
- ../bin/phpstan analyse -l 8 src tests && \
- php bin/compile && \
- ../tmp/phpstan.phar
-
- generate-baseline:
- name: "Generate baseline"
-
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- php-version:
- - "7.4"
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "${{ matrix.php-version }}"
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Generate baseline"
- run: |
- cp phpstan-baseline.neon phpstan-baseline-orig.neon && \
- vendor/bin/phing phpstan-generate-baseline && \
- diff phpstan-baseline.neon phpstan-baseline-orig.neon
-
- e2e-tests:
- name: "E2E tests"
- runs-on: "ubuntu-latest"
-
- strategy:
- matrix:
- include:
- - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/timecop.php tests/e2e/data/timecop.php"
- tools: "pecl"
- extensions: "timecop-beta"
- - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php tests/e2e/data/soap.php"
- extensions: "soap"
- - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php tests/e2e/data/soap.php"
- extensions: ""
-
- steps:
- - name: "Checkout"
- uses: "actions/checkout@v2.2.0"
-
- - name: "Install PHP"
- uses: "shivammathur/setup-php@2.3.0"
- with:
- coverage: "none"
- php-version: "7.4"
- tools: ${{ matrix.tools }}
- extensions: ${{ matrix.extensions }}
-
- - name: "Cache dependencies"
- uses: "actions/cache@v1.1.2"
- with:
- path: "~/.composer/cache"
- key: "php-${{ matrix.php-version }}-composer-${{ hashFiles('**/composer.json') }}"
- restore-keys: "php-${{ matrix.php-version }}-composer-"
-
- - name: "Install dependencies"
- run: "composer update --no-interaction --no-progress --no-suggest"
-
- - name: "Test"
- run: ${{ matrix.script }}
diff --git a/.github/workflows/changelog-generator.yml b/.github/workflows/changelog-generator.yml
new file mode 100644
index 0000000000..aaa121a682
--- /dev/null
+++ b/.github/workflows/changelog-generator.yml
@@ -0,0 +1,47 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Build Changelog Generator"
+
+on:
+ pull_request:
+ paths:
+ - 'changelog-generator/**'
+ - '.github/workflows/changelog-generator.yml'
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'changelog-generator/**'
+ - '.github/workflows/changelog-generator.yml'
+
+concurrency:
+ group: changelog-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ changelog-generator:
+ name: "Build Changelog Generator"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Install Changelog Generator dependencies"
+ working-directory: "changelog-generator"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "PHPStan"
+ working-directory: "changelog-generator"
+ run: "../bin/phpstan"
diff --git a/.github/workflows/checksum-phar.yml b/.github/workflows/checksum-phar.yml
new file mode 100644
index 0000000000..185fc779b4
--- /dev/null
+++ b/.github/workflows/checksum-phar.yml
@@ -0,0 +1,124 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+# This workflow checks that PHAR checksum changes only when it's supposed to
+# It should stay the same when the PHAR contents do not change
+
+name: "Check PHAR checksum"
+
+on:
+ pull_request:
+ paths:
+ - 'compiler/**'
+ - '.github/workflows/checksum-phar.yml'
+ push:
+ branches:
+ - "2.1.x"
+ paths:
+ - 'compiler/**'
+ - '.github/workflows/checksum-phar.yml'
+
+concurrency:
+ group: checksum-phar-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ check-phar-checksum:
+ name: "Check PHAR checksum"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout phpstan-dist"
+ uses: actions/checkout@v4
+ with:
+ repository: phpstan/phpstan
+ path: phpstan-dist
+ ref: 2.1.x
+
+ - name: "Get info"
+ id: info
+ working-directory: phpstan-dist
+ run: |
+ echo "checksum=$(head -n 1 .phar-checksum)" >> $GITHUB_OUTPUT
+ echo "commit=$(tail -n 1 .phar-checksum)" >> $GITHUB_OUTPUT
+
+ - name: "Delete phpstan-dist"
+ run: "rm -r phpstan-dist"
+
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ steps.info.outputs.commit }}
+
+ - name: "Checkout latest PHAR compiler"
+ uses: actions/checkout@v4
+ with:
+ path: phpstan-src
+ ref: ${{ github.sha }}
+
+ - name: "Delete old compiler"
+ run: "rm -r compiler"
+
+ - name: "Move new compiler"
+ run: "mv phpstan-src/compiler/ ."
+
+ - name: "Delete phpstan-src"
+ run: "rm -r phpstan-src"
+
+ - name: "Change and commit README.md"
+ run: |
+ echo Testing > README.md
+ git config --global user.name "phpstan-bot"
+ git config --global user.email "ondrej+phpstanbot@mirtes.cz"
+ git commit -a -m 'Changed README'
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ extensions: mbstring, intl
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Install compiler dependencies"
+ run: "composer install --no-interaction --no-progress --working-dir=compiler"
+
+ # same steps as in phar.yml
+
+ - name: "Prepare for PHAR compilation"
+ working-directory: "compiler"
+ run: "php bin/prepare"
+
+ - name: "Set autoloader suffix"
+ run: "composer config autoloader-suffix PHPStanChecksum"
+
+ - name: "Composer dump"
+ run: "composer install --no-interaction --no-progress"
+ env:
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+ - name: "Compile PHAR for checksum"
+ working-directory: "compiler/build"
+ run: "php box.phar compile --no-parallel"
+ env:
+ PHAR_CHECKSUM: "1"
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+ - name: "Re-sign PHAR"
+ run: "php compiler/build/resign.php tmp/phpstan.phar"
+
+ - name: "Unset autoloader suffix"
+ run: "composer config autoloader-suffix --unset"
+
+ - name: "Save checksum"
+ id: "new_checksum"
+ run: echo "md5=$(md5sum tmp/phpstan.phar | cut -d' ' -f1)" >> $GITHUB_OUTPUT
+
+ - name: "Assert checksum"
+ run: |
+ checksum=${{ steps.info.outputs.checksum }}
+ new_checksum=${{ steps.new_checksum.outputs.md5 }}
+ [[ "$checksum" == "$new_checksum" ]];
diff --git a/.github/workflows/create-tag.yml b/.github/workflows/create-tag.yml
new file mode 100644
index 0000000000..a853501487
--- /dev/null
+++ b/.github/workflows/create-tag.yml
@@ -0,0 +1,53 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Create tag"
+
+on:
+ # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Next version'
+ required: true
+ default: 'patch'
+ type: choice
+ options:
+ - patch
+ - minor
+
+jobs:
+ create-tag:
+ name: "Create tag"
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+
+ - name: 'Get Previous tag'
+ id: previoustag
+ uses: "WyriHaximus/github-action-get-previous-tag@v1"
+ env:
+ GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+
+ - name: 'Get next versions'
+ id: semvers
+ uses: "WyriHaximus/github-action-next-semvers@v1"
+ with:
+ version: ${{ steps.previoustag.outputs.tag }}
+
+ - name: "Create new minor tag"
+ uses: rickstaa/action-create-tag@v1
+ if: inputs.version == 'minor'
+ with:
+ tag: ${{ steps.semvers.outputs.minor }}
+ message: ${{ steps.semvers.outputs.minor }}
+
+ - name: "Create new patch tag"
+ uses: rickstaa/action-create-tag@v1
+ if: inputs.version == 'patch'
+ with:
+ tag: ${{ steps.semvers.outputs.patch }}
+ message: ${{ steps.semvers.outputs.patch }}
diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml
new file mode 100644
index 0000000000..e02de443a5
--- /dev/null
+++ b/.github/workflows/e2e-tests.yml
@@ -0,0 +1,383 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "E2E Tests"
+
+on:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+
+concurrency:
+ group: e2e-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ result-cache-e2e-tests:
+ name: "Result cache E2E tests"
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - script: |
+ cd e2e/result-cache-1
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-2
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-3
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Baz.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Baz.php.orig src/Baz.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-4
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-5
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Baz.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Baz.php.orig src/Baz.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-6
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Baz.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Baz.php.orig src/Baz.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/result-cache-7
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Bar.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Bar.php.orig src/Bar.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/bug10449
+ ../../bin/phpstan analyze
+ git apply patch.diff
+ rm phpstan-baseline.neon
+ mv after-phpstan-baseline.neon phpstan-baseline.neon
+ ../../bin/phpstan analyze -vvv
+ - script: |
+ cd e2e/bug10449b
+ ../../bin/phpstan analyze
+ git apply patch.diff
+ rm phpstan-baseline.neon
+ mv after-phpstan-baseline.neon phpstan-baseline.neon
+ ../../bin/phpstan analyze -vvv
+ - script: |
+ cd e2e/bug-9622
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Foo.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Foo.php.orig src/Foo.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/bug-9622-trait
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ patch -b src/Foo.php < patch-1.patch
+ cat baseline-1.neon > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ mv src/Foo.php.orig src/Foo.php
+ echo -n > phpstan-baseline.neon
+ ../../bin/phpstan -vvv
+ - script: |
+ cd e2e/env-parameter
+ export PHPSTAN_RESULT_CACHE_PATH=/some/path
+ ACTUAL=$(../../bin/phpstan dump-parameters -c phpstan.neon --json -l 9 | jq --raw-output '.resultCachePath')
+ [[ "$ACTUAL" == "/some/path" ]];
+ - script: |
+ cd e2e/result-cache-8
+ composer install
+ ../../bin/phpstan
+ echo -en '\n' >> build/CustomRule.php
+ OUTPUT=$(../../bin/phpstan analyze 2>&1 || true)
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Result cache might not behave correctly' "$OUTPUT"
+ ../bashunit -a contains 'ResultCache8E2E\CustomRule' "$OUTPUT"
+ - script: |
+ cd e2e/env-int-key
+ env 1=1 ../../bin/phpstan analyse test.php
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ patch -b data/TraitOne.php < TraitOne.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/")
+ echo "$OUTPUT"
+ ../bashunit -a line_count 2 "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Method TraitsCachingIssue\TestClassUsingTrait::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ patch -b data/TraitTwo.php < TraitTwo.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/")
+ echo "$OUTPUT"
+ ../bashunit -a line_count 2 "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Method class@anonymous/TestClassUsingTrait.php:20::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ - script: |
+ cd e2e/trait-caching
+ ../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/
+ patch -b data/TraitOne.php < TraitOne.patch
+ patch -b data/TraitTwo.php < TraitTwo.patch
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyze --no-progress --level 8 --error-format raw data/")
+ echo "$OUTPUT"
+ ../bashunit -a line_count 3 "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Method TraitsCachingIssue\TestClassUsingTrait::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ ../bashunit -a contains 'Method class@anonymous/TestClassUsingTrait.php:20::doBar() should return stdClass but returns Exception.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c ignore.neon")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in ignoreErrors' "$OUTPUT"
+ ../bashunit -a contains 'tests" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c phpneon.php")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in ignoreErrors' "$OUTPUT"
+ ../bashunit -a contains '"src/test.php" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c excludePaths.neon")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in excludePaths' "$OUTPUT"
+ ../bashunit -a contains 'tests" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan analyse -c phpneon2.php")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid entry in excludePaths' "$OUTPUT"
+ ../bashunit -a contains '"src/test.php" is neither a directory, nor a file path, nor a fnmatch pattern.' "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../../bin/phpstan analyse -c ignoreNonexistentExcludePath.neon)
+ echo "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ cp -r tmp-node-modules node_modules
+ OUTPUT=$(../../bin/phpstan analyse -c ignoreNonexistentExcludePath.neon)
+ echo "$OUTPUT"
+ - script: |
+ cd e2e/bad-exclude-paths
+ OUTPUT=$(../../bin/phpstan analyse -c ignoreReportUnmatchedFalse.neon)
+ echo "$OUTPUT"
+ - script: |
+ cd e2e/bug-11826
+ composer install
+ OUTPUT=$(../bashunit -a exit_code "1" "../../bin/phpstan")
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Child process error (exit code 255): PHP Fatal error' "$OUTPUT"
+ ../bashunit -a contains 'Result is incomplete because of severe errors.' "$OUTPUT"
+ - script: |
+ cd e2e/bug-11857
+ composer install
+ ../../bin/phpstan
+ - script: |
+ cd e2e/result-cache-meta-extension
+ composer install
+ ../../bin/phpstan -vvv
+ ../../bin/phpstan -vvv --fail-without-result-cache
+ echo 'modified-hash' > hash.txt
+ OUTPUT=$(../bashunit -a exit_code "2" "../../bin/phpstan -vvv --fail-without-result-cache")
+ echo "$OUTPUT"
+ ../bashunit -a matches "Note: Using configuration file .+phpstan.neon." "$OUTPUT"
+ ../bashunit -a contains 'Result cache not used because the metadata do not match: metaExtensions' "$OUTPUT"
+ - script: |
+ cd e2e/bug-12606
+ export CONFIGTEST=test
+ ../../bin/phpstan
+ - script: |
+ cd e2e/ignore-error-extension
+ composer install
+ ../../bin/phpstan
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ extensions: mbstring
+ ini-values: memory_limit=256M
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Patch PHPStan"
+ run: "patch src/Analyser/Error.php < e2e/PHPStanErrorPatch.patch"
+
+ - name: "Install bashunit"
+ run: "curl -s https://bashunit.typeddevs.com/install.sh | bash -s e2e/ 0.18.0"
+
+ - name: "Test"
+ run: "${{ matrix.script }}"
+
+ e2e-tests:
+ name: "E2E tests"
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ matrix:
+ include:
+ - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/timecop.php -c tests/e2e/data/empty.neon tests/e2e/data/timecop.php"
+ tools: "pecl"
+ extensions: "timecop-beta"
+ - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php -c tests/e2e/data/empty.neon tests/e2e/data/soap.php"
+ extensions: "soap"
+ - script: "bin/phpstan analyse -l 8 -a tests/e2e/data/soap.php -c tests/e2e/data/empty.neon tests/e2e/data/soap.php"
+ extensions: ""
+ - script: "bin/phpstan analyse -l 8 tests/e2e/anon-class/Granularity.php"
+ extensions: ""
+ - script: "bin/phpstan analyse -l 8 e2e/phpstan-phpunit-190/test.php -c e2e/phpstan-phpunit-190/test.neon"
+ extensions: ""
+ - script: "bin/phpstan analyse e2e/only-files-not-analysed-trait/src -c e2e/only-files-not-analysed-trait/ignore.neon"
+ extensions: ""
+ - script: "bin/phpstan analyse e2e/only-files-not-analysed-trait/src/Foo.php e2e/only-files-not-analysed-trait/src/BarTrait.php -c e2e/only-files-not-analysed-trait/no-ignore.neon"
+ extensions: ""
+ - script: |
+ cd e2e/baseline-uninit-prop-trait
+ ../../bin/phpstan analyse --debug --configuration test-no-baseline.neon --generate-baseline test-baseline.neon
+ ../../bin/phpstan analyse --debug --configuration test.neon
+ - script: |
+ cd e2e/baseline-uninit-prop-trait
+ ../../bin/phpstan analyse --configuration test-no-baseline.neon --generate-baseline test-baseline.neon
+ ../../bin/phpstan analyse --configuration test.neon
+ - script: |
+ cd e2e/discussion-11362
+ composer install
+ ../../bin/phpstan
+ - script: |
+ cd e2e/bug-11819
+ ../../bin/phpstan
+ - script: |
+ cd e2e/composer-and-phpstan-version-config
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-max-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-max-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-open-end-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-version-v5
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-version-v7
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-min-version
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-no-versions
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-version-config-invalid
+ OUTPUT=$(../bashunit -a exit_code "1" ../../bin/phpstan)
+ echo "$OUTPUT"
+ ../bashunit -a contains 'Invalid configuration' "$OUTPUT"
+ ../bashunit -a contains 'Invalid PHP version range: phpVersion.max should be greater or equal to phpVersion.min.' "$OUTPUT"
+ - script: |
+ cd e2e/composer-version-config-patch
+ composer install --ignore-platform-reqs
+ ../../bin/phpstan analyze test.php --level=0
+ - script: |
+ cd e2e/composer-version-config
+ composer install
+ ../../bin/phpstan analyze test.php --level=0
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ tools: ${{ matrix.tools }}
+ extensions: ${{ matrix.extensions }}
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Install bashunit"
+ run: "curl -s https://bashunit.typeddevs.com/install.sh | bash -s e2e/ 0.18.0"
+
+ - name: "Test"
+ run: ${{ matrix.script }}
diff --git a/.github/workflows/issue-bot.yml b/.github/workflows/issue-bot.yml
new file mode 100644
index 0000000000..2366222087
--- /dev/null
+++ b/.github/workflows/issue-bot.yml
@@ -0,0 +1,172 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Issue bot"
+
+on:
+ workflow_dispatch:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+
+concurrency:
+ group: run-issue-bot-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ download:
+ name: "Download data"
+
+ runs-on: "ubuntu-latest"
+
+ outputs:
+ matrix: ${{ steps.download-data.outputs.matrix }}
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - name: "Install Issue Bot dependencies"
+ working-directory: "issue-bot"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Cache downloads"
+ uses: actions/cache@v4
+ with:
+ path: ./issue-bot/tmp
+ key: "issue-bot-download-v7-${{ github.run_id }}"
+ restore-keys: |
+ issue-bot-download-v7-
+
+ - name: "Download data"
+ working-directory: "issue-bot"
+ id: download-data
+ env:
+ GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
+ run: echo "matrix=$(./console.php download)" >> $GITHUB_OUTPUT
+
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: playground-cache
+ path: issue-bot/tmp/playgroundCache.tmp
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: issue-cache
+ path: issue-bot/tmp/issueCache.tmp
+
+ analyse:
+ name: "Analyse"
+ needs: download
+
+ runs-on: "ubuntu-latest"
+
+ strategy:
+ fail-fast: false
+ matrix: ${{ fromJSON(needs.download.outputs.matrix) }}
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress --no-dev"
+
+ - name: "Install Issue Bot dependencies"
+ working-directory: "issue-bot"
+ run: "composer install --no-interaction --no-progress"
+
+ - uses: Wandalen/wretry.action@v3.8.0
+ with:
+ action: actions/download-artifact@v4
+ with: |
+ name: playground-cache
+ path: issue-bot/tmp
+ attempt_limit: 5
+ attempt_delay: 1000
+
+ - name: "Run PHPStan"
+ working-directory: "issue-bot"
+ timeout-minutes: 5
+ run: ./console.php run ${{ matrix.phpVersion }} ${{ matrix.playgroundExamples }}
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: results-${{ matrix.phpVersion }}-${{ matrix.chunkNumber }}
+ path: issue-bot/tmp/results-${{ matrix.phpVersion }}-*.tmp
+
+ evaluate:
+ name: "Evaluate results"
+ needs: analyse
+
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+
+ - name: "Install Issue Bot dependencies"
+ working-directory: "issue-bot"
+ run: "composer install --no-interaction --no-progress"
+
+ - uses: actions/download-artifact@v4
+ with:
+ name: playground-cache
+ path: issue-bot/tmp
+
+ - uses: actions/download-artifact@v4
+ with:
+ name: issue-cache
+ path: issue-bot/tmp
+
+ - uses: actions/download-artifact@v4
+ with:
+ pattern: results-*
+ merge-multiple: true
+ path: issue-bot/tmp
+
+ - name: "List tmp"
+ run: "ls -lA issue-bot/tmp"
+
+ - name: "Evaluate results - pull request"
+ working-directory: "issue-bot"
+ if: github.event_name == 'pull_request'
+ env:
+ GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
+ run: ./console.php evaluate >> $GITHUB_STEP_SUMMARY
+
+ - name: "Evaluate results - push"
+ working-directory: "issue-bot"
+ if: "github.repository_owner == 'phpstan' && github.ref == 'refs/heads/2.1.x'"
+ env:
+ GITHUB_PAT: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ PHPSTAN_SRC_COMMIT_BEFORE: ${{ github.event.before }}
+ PHPSTAN_SRC_COMMIT_AFTER: ${{ github.event.after }}
+ run: ./console.php evaluate --post-comments >> $GITHUB_STEP_SUMMARY
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 0000000000..d93e59843f
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,125 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Lint"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "2.1.x"
+
+concurrency:
+ group: lint-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ lint:
+ name: "Lint"
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+
+ - name: "Validate Composer"
+ run: "composer validate"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Transform source code"
+ if: matrix.php-version != '8.1' && matrix.php-version != '8.2' && matrix.php-version != '8.3' && matrix.php-version != '8.4'
+ run: "vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}"
+
+ - name: "Lint"
+ run: "make lint"
+
+ coding-standards:
+ name: "Coding Standard"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+
+ - name: "Validate Composer"
+ run: "composer validate"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Lint"
+ run: "make lint"
+
+ - name: "Coding Standard"
+ run: "make cs"
+
+ dependency-analysis:
+ name: "Dependency Analysis"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Composer Dependency Analyser"
+ run: "make composer-dependency-analyser"
+
+ name-collision:
+ name: "Name Collision Detector"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.4"
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Name Collision Detector"
+ run: "make name-collision"
diff --git a/.github/workflows/merge-bot-pr.yml b/.github/workflows/merge-bot-pr.yml
new file mode 100644
index 0000000000..6d34bb3d80
--- /dev/null
+++ b/.github/workflows/merge-bot-pr.yml
@@ -0,0 +1,29 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+# https://github.com/WyriHaximus/github-action-wait-for-status
+
+name: Merge bot PR
+on:
+ pull_request:
+ types:
+ - opened
+jobs:
+ automerge:
+ name: Automerge PRs
+ runs-on: ubuntu-latest
+ steps:
+ - name: 'Wait for status checks'
+ if: github.event.pull_request.user.login == 'phpstan-bot'
+ id: waitforstatuschecks
+ uses: "WyriHaximus/github-action-wait-for-status@v1"
+ with:
+ ignoreActions: "automerge,Automerge PRs"
+ checkInterval: 13
+ env:
+ GITHUB_TOKEN: "${{ secrets.PHPSTAN_BOT_TOKEN }}"
+ - name: Merge Pull Request
+ uses: juliangruber/merge-pull-request-action@v1
+ if: steps.waitforstatuschecks.outputs.status == 'success'
+ with:
+ github-token: "${{ secrets.PHPSTAN_BOT_TOKEN }}"
+ number: "${{ github.event.number }}"
+ method: rebase
diff --git a/.github/workflows/merge-maintained-branch.yml b/.github/workflows/merge-maintained-branch.yml
new file mode 100644
index 0000000000..0ac13c5f68
--- /dev/null
+++ b/.github/workflows/merge-maintained-branch.yml
@@ -0,0 +1,24 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: Merge maintained branch
+
+on:
+ push:
+ branches:
+ - "1.12.x"
+
+jobs:
+ merge:
+ name: Merge branch
+ if: github.repository_owner == 'phpstan'
+ runs-on: ubuntu-latest
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ - name: "Merge branch"
+ uses: everlytic/branch-merge@1.1.5
+ with:
+ github_token: "${{ secrets.PHPSTAN_BOT_TOKEN }}"
+ source_ref: ${{ github.ref }}
+ target_branch: '2.1.x'
+ commit_message_template: 'Merge branch {source_ref} into {target_branch}'
diff --git a/.github/workflows/phar.yml b/.github/workflows/phar.yml
new file mode 100644
index 0000000000..0cf91034a3
--- /dev/null
+++ b/.github/workflows/phar.yml
@@ -0,0 +1,247 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Compile PHAR"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "2.1.x"
+ tags:
+ - '2.1.*'
+
+concurrency:
+ group: phar-${{ github.ref }} # will be canceled on subsequent pushes in both branches and pull requests
+ cancel-in-progress: true
+
+jobs:
+ compiler-tests:
+ name: "Compiler Tests"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ outputs:
+ checksum: ${{ steps.checksum.outputs.md5 }}
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ extensions: mbstring, intl
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Install compiler dependencies"
+ run: "composer install --no-interaction --no-progress --working-dir=compiler"
+
+ - name: "Compiler tests"
+ working-directory: "compiler"
+ run: "vendor/bin/phpunit -c tests/phpunit.xml tests"
+
+ - name: "Compiler PHPStan"
+ working-directory: "compiler"
+ run: "../bin/phpstan analyse -l 8 src tests"
+
+ - name: "Prepare for PHAR compilation"
+ working-directory: "compiler"
+ run: "php bin/prepare"
+
+ - name: "Compile PHAR"
+ working-directory: "compiler/build"
+ run: "php box.phar compile --no-parallel"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: phar-file
+ path: tmp/phpstan.phar
+
+ - name: "Run PHAR"
+ working-directory: "compiler"
+ run: "../tmp/phpstan.phar list"
+
+ - name: "Delete PHAR"
+ run: "rm tmp/phpstan.phar"
+
+ - name: "Set autoloader suffix"
+ run: "composer config autoloader-suffix PHPStanChecksum"
+
+ - name: "Composer dump"
+ run: "composer install --no-interaction --no-progress"
+ env:
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+ - name: "Compile PHAR for checksum"
+ working-directory: "compiler/build"
+ run: "php box.phar compile --no-parallel"
+ env:
+ PHAR_CHECKSUM: "1"
+ COMPOSER_ROOT_VERSION: "2.1.x-dev"
+
+ - name: "Re-sign PHAR"
+ run: "php compiler/build/resign.php tmp/phpstan.phar"
+
+ - name: "Unset autoloader suffix"
+ run: "composer config autoloader-suffix --unset"
+
+ - name: "Save checksum"
+ id: "checksum"
+ run: echo "md5=$(md5sum tmp/phpstan.phar | cut -d' ' -f1)" >> $GITHUB_OUTPUT
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: phar-file-checksum
+ path: tmp/phpstan.phar
+
+ - name: "Delete checksum PHAR"
+ run: "rm tmp/phpstan.phar"
+
+ integration-tests:
+ if: github.event_name == 'pull_request'
+ needs: compiler-tests
+ uses: phpstan/phpstan/.github/workflows/integration-tests.yml@2.1.x
+ with:
+ ref: 2.1.x
+ phar-checksum: ${{needs.compiler-tests.outputs.checksum}}
+
+ extension-tests:
+ if: github.event_name == 'pull_request'
+ needs: compiler-tests
+ uses: phpstan/phpstan/.github/workflows/extension-tests.yml@2.1.x
+ with:
+ ref: 2.1.x
+ phar-checksum: ${{needs.compiler-tests.outputs.checksum}}
+
+ other-tests:
+ if: github.event_name == 'pull_request'
+ needs: compiler-tests
+ uses: phpstan/phpstan/.github/workflows/other-tests.yml@2.1.x
+ with:
+ ref: 2.1.x
+ phar-checksum: ${{needs.compiler-tests.outputs.checksum}}
+
+ commit:
+ name: "Commit PHAR"
+ if: "github.repository_owner == 'phpstan' && (github.ref == 'refs/heads/2.1.x' || startsWith(github.ref, 'refs/tags/'))"
+ needs: compiler-tests
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+ steps:
+ -
+ name: Import GPG key
+ id: import-gpg
+ uses: crazy-max/ghaction-import-gpg@v6
+ with:
+ gpg_private_key: ${{ secrets.GPG_PHPSTANBOT_PRIVATE_KEY }}
+ passphrase: ${{ secrets.GPG_PHPSTANBOT_KEY_PASSPHRASE }}
+ git_config_global: true
+ git_user_signingkey: true
+ git_commit_gpgsign: true
+
+ - name: "Checkout phpstan-dist"
+ uses: actions/checkout@v4
+ with:
+ repository: phpstan/phpstan
+ path: phpstan-dist
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ ref: 2.1.x
+
+ - name: "Get previous pushed dist commit"
+ id: previous-commit
+ working-directory: phpstan-dist
+ run: echo "sha=$(sed -n '2p' .phar-checksum)" >> $GITHUB_OUTPUT
+
+ - name: "Checkout phpstan-src"
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ path: phpstan-src
+
+ - name: "Get Git log"
+ id: git-log
+ working-directory: phpstan-src
+ run: |
+ echo "log<> $GITHUB_OUTPUT
+ echo "$(git log ${{ steps.previous-commit.outputs.sha }}..${{ github.event.after }} --reverse --pretty='https://github.com/phpstan/phpstan-src/commit/%H%20%s')" >> $GITHUB_OUTPUT
+ echo 'MESSAGE' >> $GITHUB_OUTPUT
+
+ - name: "Get short phpstan-src SHA"
+ id: short-src-sha
+ working-directory: phpstan-src
+ run: echo "sha=$(git rev-parse --short=7 HEAD)" >> $GITHUB_OUTPUT
+
+ - name: "Check PHAR checksum"
+ id: checksum-difference
+ working-directory: phpstan-dist
+ run: |
+ checksum=${{needs.compiler-tests.outputs.checksum}}
+ if [[ $(head -n 1 .phar-checksum) != "$checksum" ]]; then
+ echo "result=different" >> $GITHUB_OUTPUT
+ else
+ echo "result=same" >> $GITHUB_OUTPUT
+ fi
+
+ - name: "Download phpstan.phar"
+ uses: actions/download-artifact@v4
+ with:
+ name: phar-file
+
+ - name: "mv PHAR"
+ run: mv phpstan.phar phpstan-dist/phpstan.phar
+
+ - name: "chmod PHAR"
+ run: chmod 755 phpstan-dist/phpstan.phar
+
+ - name: "Update checksum"
+ run: |
+ echo ${{needs.compiler-tests.outputs.checksum}} > phpstan-dist/.phar-checksum
+ echo ${{ github.event.head_commit.id }} >> phpstan-dist/.phar-checksum
+
+ - name: "Sign PHAR"
+ working-directory: phpstan-dist
+ run: rm phpstan.phar.asc && gpg --command-fd 0 --pinentry-mode loopback -u "$GPG_ID" --batch --detach-sign --armor --output phpstan.phar.asc phpstan.phar
+ env:
+ GPG_ID: ${{ steps.import-gpg.outputs.fingerprint }}
+
+ - name: "Verify PHAR"
+ working-directory: phpstan-dist
+ run: "gpg --verify phpstan.phar.asc"
+
+ - name: "Install lucky_commit"
+ uses: baptiste0928/cargo-install@v3
+ with:
+ crate: lucky_commit
+ args: --no-default-features
+
+ - name: "Commit PHAR - development"
+ if: "!startsWith(github.ref, 'refs/tags/') && steps.checksum-difference.outputs.result == 'different'"
+ working-directory: phpstan-dist
+ env:
+ INPUT_LOG: ${{ steps.git-log.outputs.log }}
+ run: |
+ git config --global user.name "phpstan-bot"
+ git config --global user.email "ondrej+phpstanbot@mirtes.cz"
+ git add .
+ git commit --gpg-sign -m "Updated PHPStan to commit ${{ github.event.after }}" -m "$INPUT_LOG" --author "phpstan-bot "
+ lucky_commit ${{ steps.short-src-sha.outputs.sha }}
+ git push
+
+ - name: "Commit PHAR - tag"
+ if: "startsWith(github.ref, 'refs/tags/')"
+ uses: stefanzweifel/git-auto-commit-action@v5
+ with:
+ commit_user_name: "phpstan-bot"
+ commit_user_email: "ondrej+phpstanbot@mirtes.cz"
+ commit_author: "phpstan-bot "
+ commit_options: "--gpg-sign"
+ repository: phpstan-dist
+ commit_message: "PHPStan ${{github.ref_name}}"
+ tagging_message: ${{github.ref_name}}
diff --git a/.github/workflows/pr-base-on-previous-branch.yml b/.github/workflows/pr-base-on-previous-branch.yml
new file mode 100644
index 0000000000..34ef71bb83
--- /dev/null
+++ b/.github/workflows/pr-base-on-previous-branch.yml
@@ -0,0 +1,24 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Base PR on previous branch"
+
+on:
+ pull_request_target:
+ types:
+ - opened
+ branches:
+ - '2.2.x'
+
+
+jobs:
+ comment:
+ name: "Comment on pull request"
+ runs-on: 'ubuntu-latest'
+
+ steps:
+ - name: Comment PR
+ uses: peter-evans/create-or-update-comment@v4
+ with:
+ body: "You've opened the pull request against the latest branch 2.2.x. PHPStan 2.2 is not going to be released for months. If your code is relevant on 2.1.x and you want it to be released sooner, please rebase your pull request and change its target to 2.1.x."
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ issue-number: ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/pr-marked-as-ready.yml b/.github/workflows/pr-marked-as-ready.yml
new file mode 100644
index 0000000000..b9785a2a3c
--- /dev/null
+++ b/.github/workflows/pr-marked-as-ready.yml
@@ -0,0 +1,21 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Pull request ready for review"
+
+on:
+ pull_request_target:
+ types:
+ - ready_for_review
+
+jobs:
+ comment:
+ name: "Comment on pull request"
+ runs-on: 'ubuntu-latest'
+
+ steps:
+ - name: Comment PR
+ uses: peter-evans/create-or-update-comment@v4
+ with:
+ body: "This pull request has been marked as ready for review."
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ issue-number: ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/reflection-golden-test.yml b/.github/workflows/reflection-golden-test.yml
new file mode 100644
index 0000000000..8d0050cfd3
--- /dev/null
+++ b/.github/workflows/reflection-golden-test.yml
@@ -0,0 +1,127 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Reflection golden test"
+
+on:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+
+env:
+ REFLECTION_GOLDEN_TEST_FILE: "/tmp/reflection-golden.test"
+ REFLECTION_GOLDEN_SYMBOLS_FILE: "/tmp/reflection-golden-symbols.txt"
+
+concurrency:
+ group: reflection-golden-test-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ dump-php-symbols:
+ name: "Dump PHP symbols"
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ # Include exotic extensions to discover more symbols
+ extensions: ds,mbstring,runkit7,scoutapm,seaslog,simdjson,var_representation,yac
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Dump phpSymbols.txt"
+ run: "php tests/dump-reflection-test-symbols.php"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: phpSymbols
+ path: ${{ env.REFLECTION_GOLDEN_SYMBOLS_FILE }}
+
+ reflection-golden-test:
+ name: "Reflection golden test"
+ needs: dump-php-symbols
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+
+ steps:
+ - uses: Wandalen/wretry.action@v3.8.0
+ with:
+ action: actions/download-artifact@v4
+ with: |
+ name: phpSymbols
+ path: /tmp
+ attempt_limit: 5
+ attempt_delay: 1000
+
+ - name: "Checkout base commit"
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.base.sha || github.event.before }}
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=2G
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Transform source code"
+ if: matrix.php-version != '8.1' && matrix.php-version != '8.2' && matrix.php-version != '8.3' && matrix.php-version != '8.4'
+ shell: bash
+ run: "vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}"
+
+ - name: "Dump previous reflection data"
+ run: "php tests/generate-reflection-test.php"
+
+ - uses: actions/upload-artifact@v4
+ with:
+ name: reflection-${{ matrix.php-version }}.test
+ path: ${{ env.REFLECTION_GOLDEN_TEST_FILE }}
+
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Transform source code"
+ if: matrix.php-version != '8.1' && matrix.php-version != '8.2' && matrix.php-version != '8.3' && matrix.php-version != '8.4'
+ shell: bash
+ run: "vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}"
+
+ - name: "Reflection golden test"
+ run: "make tests-golden-reflection || true"
diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml
new file mode 100644
index 0000000000..b2f810732c
--- /dev/null
+++ b/.github/workflows/spelling.yml
@@ -0,0 +1,23 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Spelling"
+
+on:
+ pull_request:
+ push:
+ branches:
+ - "2.1.x"
+
+jobs:
+ typos:
+ name: "Check for typos"
+ runs-on: "ubuntu-latest"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Check for typos"
+ uses: "crate-ci/typos@v1"
+ with:
+ files: "README.md src/"
diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml
new file mode 100644
index 0000000000..602152e12f
--- /dev/null
+++ b/.github/workflows/static-analysis.yml
@@ -0,0 +1,159 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Static Analysis"
+
+on:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+
+concurrency:
+ group: sa-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ static-analysis:
+ name: "PHPStan"
+ runs-on: ${{ matrix.operating-system }}
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ operating-system: [ubuntu-latest, windows-latest]
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ ini-file: development
+ extensions: mbstring
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Transform source code"
+ if: matrix.php-version != '8.1' && matrix.php-version != '8.2' && matrix.php-version != '8.3' && matrix.php-version != '8.4'
+ shell: bash
+ run: "vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}"
+
+ - name: "PHPStan"
+ run: "make phpstan"
+
+ static-analysis-with-result-cache:
+ name: "PHPStan with result cache"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ ini-file: development
+ extensions: mbstring
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Cache Result cache"
+ uses: actions/cache@v4
+ with:
+ path: ./tmp
+ key: "result-cache-v14-${{ matrix.php-version }}-${{ github.run_id }}"
+ restore-keys: |
+ result-cache-v14-${{ matrix.php-version }}-
+
+ - name: "PHPStan with result cache"
+ run: |
+ make phpstan-result-cache
+ bin/phpstan clear-result-cache -c build/phpstan.neon
+ make phpstan-result-cache
+ echo -e "\n\n" >> src/TrinaryLogic.php
+ make phpstan-result-cache
+ make phpstan-result-cache
+
+ generate-baseline:
+ name: "Generate baseline"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ ini-file: development
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Generate baseline"
+ run: |
+ cp phpstan-baseline.neon phpstan-baseline-orig.neon && \
+ make phpstan-generate-baseline && \
+ diff phpstan-baseline.neon phpstan-baseline-orig.neon
+
+ generate-baseline-php:
+ name: "Generate PHP baseline"
+
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ ini-file: development
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Generate baseline"
+ run: |
+ > phpstan-baseline.neon && \
+ make phpstan-generate-baseline-php && \
+ make phpstan-result-cache
diff --git a/.github/workflows/tests-levels-matrix.php b/.github/workflows/tests-levels-matrix.php
new file mode 100644
index 0000000000..1344e8e81e
--- /dev/null
+++ b/.github/workflows/tests-levels-matrix.php
@@ -0,0 +1,40 @@
+testCaseClass as $testCaseClass) {
+ foreach($testCaseClass->testCaseMethod as $testCaseMethod) {
+ if ((string) $testCaseMethod['groups'] !== 'levels') {
+ continue;
+ }
+
+ $testCaseName = (string) $testCaseMethod['id'];
+
+ [$className, $testName] = explode('::', $testCaseName, 2);
+ $fileName = 'tests/'. str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
+
+ $filter = str_replace('\\', '\\\\', $testCaseName);
+
+ $testFilters[] = sprintf("%s --filter %s", escapeshellarg($fileName), escapeshellarg($filter));
+ }
+}
+
+if ($testFilters === []) {
+ throw new RuntimeException('No tests found');
+}
+
+$chunkSize = (int) ceil(count($testFilters) / 10);
+$chunks = array_chunk($testFilters, $chunkSize);
+
+$commands = [];
+foreach ($chunks as $chunk) {
+ $commands[] = implode("\n", array_map(fn (string $ch) => sprintf('php vendor/bin/phpunit %s --group levels', $ch), $chunk));
+}
+
+echo json_encode($commands);
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000000..d7c4673b40
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,156 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Tests"
+
+on:
+ pull_request:
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+ push:
+ branches:
+ - "2.1.x"
+ paths-ignore:
+ - 'compiler/**'
+ - 'apigen/**'
+ - 'changelog-generator/**'
+ - 'issue-bot/**'
+
+concurrency:
+ group: tests-${{ github.head_ref || github.run_id }} # will be canceled on subsequent pushes in pull requests but not branches
+ cancel-in-progress: true
+
+jobs:
+ tests:
+ name: "Tests"
+ runs-on: ${{ matrix.operating-system }}
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ php-version:
+ - "7.4"
+ - "8.0"
+ - "8.1"
+ - "8.2"
+ - "8.3"
+ - "8.4"
+ operating-system: [ ubuntu-latest, windows-latest ]
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "${{ matrix.php-version }}"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=2G
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Transform source code"
+ if: matrix.php-version != '8.1' && matrix.php-version != '8.2' && matrix.php-version != '8.3' && matrix.php-version != '8.4'
+ shell: bash
+ run: "vendor/bin/simple-downgrade downgrade -c build/downgrade.php ${{ matrix.php-version }}"
+
+ - name: "Tests"
+ run: "make tests"
+
+ tests-integration:
+ name: "Integration tests"
+ runs-on: ${{ matrix.operating-system }}
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ operating-system: [ ubuntu-latest, windows-latest ]
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=1G
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Tests"
+ run: "make tests-integration"
+
+ tests-levels-matrix:
+ name: "Determine levels tests matrix"
+ runs-on: ubuntu-latest
+ timeout-minutes: 60
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=1G
+
+ - name: "Install PHPUnit 10.x"
+ run: "composer remove --dev brianium/paratest && composer require --dev --with-all-dependencies phpunit/phpunit:^10"
+
+ - id: set-matrix
+ run: echo "matrix=$(php .github/workflows/tests-levels-matrix.php)" >> $GITHUB_OUTPUT
+
+ outputs:
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
+
+ tests-levels:
+ needs: tests-levels-matrix
+
+ name: "Levels tests"
+ runs-on: ubuntu-latest
+ timeout-minutes: 60
+
+ strategy:
+ fail-fast: false
+ matrix:
+ script: "${{fromJson(needs.tests-levels-matrix.outputs.matrix)}}"
+
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.3"
+ tools: pecl
+ extensions: ds,mbstring
+ ini-file: development
+ ini-values: memory_limit=1G
+
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+
+ - name: "Tests"
+ run: "${{ matrix.script }}"
diff --git a/.github/workflows/update-phpstorm-stubs.yml b/.github/workflows/update-phpstorm-stubs.yml
new file mode 100644
index 0000000000..396be1c0be
--- /dev/null
+++ b/.github/workflows/update-phpstorm-stubs.yml
@@ -0,0 +1,50 @@
+# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
+
+name: "Update PhpStorm stubs"
+on:
+ workflow_dispatch:
+ schedule:
+ # * is a special character in YAML so you have to quote this string
+ - cron: '0 0 * * 2'
+
+jobs:
+ update-phpstorm-stubs:
+ name: "Update PhpStorm stubs"
+ if: ${{ github.repository == 'phpstan/phpstan-src' }}
+ runs-on: "ubuntu-latest"
+ steps:
+ - name: "Checkout"
+ uses: actions/checkout@v4
+ with:
+ ref: 2.1.x
+ fetch-depth: '0'
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ - name: "Install PHP"
+ uses: "shivammathur/setup-php@v2"
+ with:
+ coverage: "none"
+ php-version: "8.1"
+ - name: "Install dependencies"
+ run: "composer install --no-interaction --no-progress"
+ - name: "Checkout stubs"
+ uses: actions/checkout@v4
+ with:
+ path: "phpstorm-stubs"
+ repository: "jetbrains/phpstorm-stubs"
+ - name: "Update stubs"
+ run: "composer require jetbrains/phpstorm-stubs:dev-master#$(git -C phpstorm-stubs rev-parse HEAD)"
+ - name: "Remove stubs repo"
+ run: "rm -r phpstorm-stubs"
+ - name: "Update function metadata"
+ run: "./bin/generate-function-metadata.php"
+ - name: "Create Pull Request"
+ id: create-pr
+ uses: peter-evans/create-pull-request@v6
+ with:
+ token: ${{ secrets.PHPSTAN_BOT_TOKEN }}
+ branch-suffix: random
+ delete-branch: true
+ title: "Update PhpStorm stubs"
+ body: "Update PhpStorm stubs"
+ committer: "phpstan-bot "
+ commit-message: "Update PhpStorm stubs"
diff --git a/.gitignore b/.gitignore
index 0e259031a0..47f19ba656 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,10 +1,12 @@
-/build/phpstan-generated.neon
-/compiler/composer.lock
+/phpstan.neon
/compiler/tmp
/compiler/vendor
-/composer.lock
/conf/config.local.yml
/vendor
-/.idea
+/.idea/*
+!.idea/icon.png
/tests/tmp
/tests/.phpunit.result.cache
+/tests/PHPStan/Reflection/data/golden/
+tmp/.memory_limit
+e2e/bashunit
diff --git a/.idea/icon.png b/.idea/icon.png
new file mode 100644
index 0000000000..5f346e71c1
Binary files /dev/null and b/.idea/icon.png differ
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 8bf65b9d59..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-language: php
-
-stages:
- - test
- - name: phar
- if: (branch = master OR tag IS present) && type = push
-
-env:
- global:
- secure: "EpvZZ1v6JvefnfhgYm3Y2WprJxjgr6zDw2FJs+WISEtd1PHJToFJOE59vW7DRTcr5ycR4jrHyANqqIJWbH1k3A3wuyavmkissNKHbFK6vmLtAC9TuI/x5zBd+/T5yQ6i6uBe43nDzbkrQDYtGyNMdn1FXhWV9Z/hNCZ6uD0aiO5+d49NFJoexUOt3+LCxrZAGCCsm49KYRff/62QxO2Wajlfdhx+PLO0igY/i9N3oUQoVfbBEbP1ZSAPLv7ZkZGL4XdMMYEGYqnOeMWk39MYID34RmCYteWRfED4oqYbi4rzOpW8YeA/YkuHGThIykSLBrjdAfwUpekVEAI9r1gdrh91Gkpm/W/trFygdfI2gqev5GVjbYgmKQMm50l1W8wiD+Tb+AMUIttEXGjgwd+K2rn1RBHjM+CjPEWWdppg/7OOYVIJg0gIr94TN2LCQWDfFN5SxIIf0BpQmWteGEPCDpxCc3jsjpaVFXQ2jrui69Pdjr8/u7XCisQD9zpn4sQ43GZkdHC4rGOoBrjXQDWMB/LZyYNymJ6fkkuceqSgn6vDyBEkp9UBR1CIv4P8Ray86qEPodDFbPZMVX2JqDwUHMH3HVl4FINPYtVW3/VNUK7VihKd33+AjoX7anRTeq0T8jXUT4IF6tAxbO4DaDBB4XjQ3vCBDH15WxwIxy81KKA="
-
-before_script:
- - if php --ri xdebug >/dev/null; then phpenv config-rm xdebug.ini; fi
- - composer update --no-interaction
-
-jobs:
- include:
- - stage: phar
- php: 7.3
- os: linux
- dist: xenial
- before_install:
- - |
- openssl aes-256-cbc -K $encrypted_bd816b4f73f9_key -iv $encrypted_bd816b4f73f9_iv -in build/key.gpg.enc -out build/key.gpg -d && \
- gpg --batch --import build/key.gpg && \
- rm build/key.gpg
- script:
- - |
- composer install --working-dir=compiler && \
- php compiler/bin/compile && \
- GIT_LOG=$(git log ${TRAVIS_COMMIT_RANGE} --reverse --pretty='%H %s' | sed -e 's/^/https:\/\/github.com\/phpstan\/phpstan-src\/commit\//') && \
- git clone https://${GITHUB_TOKEN}@github.com/phpstan/phpstan.git phpstan-dist > /dev/null 2>&1 && \
- cp tmp/phpstan.phar phpstan-dist/phpstan.phar && \
- cp tmp/phpstan.phar phpstan-dist/phpstan && \
- cd phpstan-dist && \
- git config user.email "ondrej@mirtes.cz" && \
- git config user.name "Ondrej Mirtes" && \
- git config --global user.signingkey CF1A108D0E7AE720 && \
- rm phpstan.phar.asc && \
- gpg --batch -ab phpstan.phar && \
- gpg --verify phpstan.phar.asc && \
- git add phpstan phpstan.phar phpstan.phar.asc
-
- if [ "${TRAVIS_TAG}" != "" ]; then
- COMMIT_MSG="PHPStan ${TRAVIS_TAG}"
- else
- COMMIT_MSG="Updated PHPStan to commit ${TRAVIS_COMMIT}"
- fi
-
- git commit -S -m "${COMMIT_MSG}" -m "${GIT_LOG}" && \
- git push --quiet origin master
-
- if [ "${TRAVIS_TAG}" != "" ]; then
- git tag -s ${TRAVIS_TAG} -m "${TRAVIS_TAG}" && \
- git push --quiet origin ${TRAVIS_TAG}
- fi
-
-cache:
- directories:
- - $HOME/.composer/cache
- - tmp
diff --git a/.typos.toml b/.typos.toml
new file mode 100644
index 0000000000..78c99b1d76
--- /dev/null
+++ b/.typos.toml
@@ -0,0 +1,14 @@
+[files]
+extend-exclude = [
+ ".git/",
+]
+ignore-hidden = false
+
+[default.extend-identifiers]
+# Known typos
+NonRemoveableTypeTrait = "NonRemoveableTypeTrait"
+supportsLessOverridenParametersWithVariadic = "supportsLessOverridenParametersWithVariadic"
+
+[default.extend-words]
+# override false-positives
+Excluder = "Excluder"
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 162e250c6d..7ab0db920a 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -1,74 +1,134 @@
-# Contributor Code of Conduct
+
+# Contributor Covenant Code of Conduct
## Our Pledge
-In the interest of fostering an open and welcoming environment, we as
-contributors and maintainers pledge to making participation in our project and
-our community a harassment-free experience for everyone, regardless of age, body
-size, disability, ethnicity, gender identity and expression, level of experience,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual
+identity and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
## Our Standards
-Examples of behavior that contributes to creating a positive environment
-include:
+Examples of behavior that contributes to a positive environment for our
+community include:
-* Using welcoming and inclusive language
-* Being respectful of differing viewpoints and experiences
-* Gracefully accepting constructive criticism
-* Focusing on what is best for the community
-* Showing empathy towards other community members
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the overall
+ community
-Examples of unacceptable behavior by participants include:
+Examples of unacceptable behavior include:
-* The use of sexualized language or imagery and unwelcome sexual attention or
-advances
-* Trolling, insulting/derogatory comments, and personal or political attacks
+* The use of sexualized language or imagery, and sexual attention or advances of
+ any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
-* Publishing others' private information, such as a physical or electronic
- address, without explicit permission
+* Publishing others' private information, such as a physical or email address,
+ without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
-## Our Responsibilities
+## Enforcement Responsibilities
-Project maintainers are responsible for clarifying the standards of acceptable
-behavior and are expected to take appropriate and fair corrective action in
-response to any instances of unacceptable behavior.
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
-Project maintainers have the right and responsibility to remove, edit, or
-reject comments, commits, code, wiki edits, issues, and other contributions
-that are not aligned to this Code of Conduct, or to ban temporarily or
-permanently any contributor for other behaviors that they deem inappropriate,
-threatening, offensive, or harmful.
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
## Scope
-This Code of Conduct applies both within project spaces and in public spaces
-when an individual is representing the project or its community. Examples of
-representing a project or community include using an official project e-mail
-address, posting via an official social media account, or acting as an appointed
-representative at an online or offline event. Representation of a project may be
-further defined and clarified by project maintainers.
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported by contacting the project maintainer at . All
-complaints will be reviewed and investigated and will result in a response that
-is deemed necessary and appropriate to the circumstances. The project team is
-obligated to maintain confidentiality with regard to the reporter of an incident.
-Further details of specific enforcement policies may be posted separately.
+reported to the community leaders responsible for enforcement at
+ondrej@mirtes.cz.
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series of
+actions.
-Project maintainers who do not follow or enforce the Code of Conduct in good
-faith may face temporary or permanent repercussions as determined by other
-members of the project's leadership.
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or permanent
+ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within the
+community.
## Attribution
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
-available at [http://contributor-covenant.org/version/1/4][version]
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.1, available at
+[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
+[https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/4/
diff --git a/LICENSE b/LICENSE
index 7c0f2b7b69..e5f34e607a 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,7 @@
MIT License
Copyright (c) 2016 Ondřej Mirtes
+Copyright (c) 2025 PHPStan s.r.o.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000..9e007ae2cc
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,140 @@
+.PHONY: tests
+
+build: cs tests phpstan
+
+tests:
+ XDEBUG_MODE=off php vendor/bin/paratest --runner WrapperRunner --no-coverage
+
+tests-integration:
+ php vendor/bin/paratest --runner WrapperRunner --no-coverage --group exec
+
+tests-levels:
+ php vendor/bin/paratest --runner WrapperRunner --no-coverage --group levels
+
+tests-coverage:
+ php vendor/bin/paratest --runner WrapperRunner
+
+tests-golden-reflection:
+ php vendor/bin/paratest --runner WrapperRunner --no-coverage tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+lint:
+ XDEBUG_MODE=off php vendor/bin/parallel-lint --colors \
+ --exclude tests/PHPStan/Analyser/data \
+ --exclude tests/PHPStan/Analyser/nsrt \
+ --exclude tests/PHPStan/Rules/Methods/data \
+ --exclude tests/PHPStan/Rules/Functions/data \
+ --exclude tests/PHPStan/Rules/Names/data \
+ --exclude tests/PHPStan/Rules/Operators/data/invalid-inc-dec.php \
+ --exclude tests/PHPStan/Rules/Arrays/data/offset-access-without-dim-for-reading.php \
+ --exclude tests/PHPStan/Rules/Classes/data/duplicate-declarations.php \
+ --exclude tests/PHPStan/Rules/Classes/data/duplicate-enum-cases.php \
+ --exclude tests/PHPStan/Rules/Classes/data/enum-sanity.php \
+ --exclude tests/PHPStan/Rules/Classes/data/extends-error.php \
+ --exclude tests/PHPStan/Rules/Classes/data/implements-error.php \
+ --exclude tests/PHPStan/Rules/Classes/data/interface-extends-error.php \
+ --exclude tests/PHPStan/Rules/Classes/data/trait-use-error.php \
+ --exclude tests/PHPStan/Rules/Methods/data/method-in-enum-without-body.php \
+ --exclude tests/PHPStan/Rules/Properties/data/default-value-for-native-property-type.php \
+ --exclude tests/PHPStan/Rules/Arrays/data/empty-array-item.php \
+ --exclude tests/PHPStan/Rules/Classes/data/invalid-promoted-properties.php \
+ --exclude tests/PHPStan/Rules/Classes/data/duplicate-promoted-property.php \
+ --exclude tests/PHPStan/Rules/Properties/data/default-value-for-promoted-property.php \
+ --exclude tests/PHPStan/Rules/Operators/data/invalid-assign-var.php \
+ --exclude tests/PHPStan/Rules/Functions/data/arrow-function-nullsafe-by-ref.php \
+ --exclude tests/PHPStan/Levels/data/namedArguments.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/continue-break.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/continue-break-property-hook.php \
+ --exclude tests/PHPStan/Rules/Properties/data/invalid-callable-property-type.php \
+ --exclude tests/PHPStan/Rules/Properties/data/properties-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/read-only-property.php \
+ --exclude tests/PHPStan/Rules/Properties/data/read-only-property-phpdoc-and-native.php \
+ --exclude tests/PHPStan/Rules/Properties/data/read-only-property-readonly-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/overriding-property.php \
+ --exclude tests/PHPStan/Rules/Constants/data/overriding-final-constant.php \
+ --exclude tests/PHPStan/Rules/Properties/data/intersection-types.php \
+ --exclude tests/PHPStan/Rules/Classes/data/first-class-instantiation-callable.php \
+ --exclude tests/PHPStan/Rules/Classes/data/instantiation-callable.php \
+ --exclude tests/PHPStan/Rules/Classes/data/bug-9402.php \
+ --exclude tests/PHPStan/Rules/Constants/data/class-as-class-constant.php \
+ --exclude tests/PHPStan/Rules/Constants/data/value-assigned-to-class-constant-native-type.php \
+ --exclude tests/PHPStan/Rules/Constants/data/overriding-constant-native-types.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-10043.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-7859.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-8081.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-9014.php \
+ --exclude tests/PHPStan/Rules/Methods/data/bug-10101.php \
+ --exclude tests/PHPStan/Rules/Methods/data/final-method-by-phpdoc.php \
+ --exclude tests/PHPStan/Rules/Traits/data/conflicting-trait-constants-types.php \
+ --exclude tests/PHPStan/Rules/Types/data/invalid-union-with-mixed.php \
+ --exclude tests/PHPStan/Rules/Types/data/invalid-union-with-never.php \
+ --exclude tests/PHPStan/Rules/Types/data/invalid-union-with-void.php \
+ --exclude tests/PHPStan/Rules/Constants/data/dynamic-class-constant-fetch.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-position.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-position2.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-position-nested.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-strict-nonsense.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-strict-nonsense-bool.php \
+ --exclude tests/PHPStan/Rules/Keywords/data/declare-inline-html.php \
+ --exclude tests/PHPStan/Rules/Classes/data/extends-readonly-class.php \
+ --exclude tests/PHPStan/Rules/Classes/data/instantiation-promoted-properties.php \
+ --exclude tests/PHPStan/Rules/Classes/data/bug-11592.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hooks-bodies-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hooks-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-hooks-visibility-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-hooked-properties-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-hooked-properties-with-bodies.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-non-hooked-properties-in-abstract-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/non-abstract-hooked-properties-in-abstract-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/non-abstract-hooked-properties-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/hooked-properties-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/hooked-properties-without-bodies-in-class.php \
+ --exclude tests/PHPStan/Rules/Properties/data/readonly-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/readonly-property-hooks-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/static-hooked-properties.php \
+ --exclude tests/PHPStan/Rules/Properties/data/static-hooked-property-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/virtual-hooked-properties.php \
+ --exclude tests/PHPStan/Rules/Classes/data/bug-12281.php \
+ --exclude tests/PHPStan/Rules/Traits/data/bug-12281.php \
+ --exclude tests/PHPStan/Rules/Classes/data/invalid-hooked-properties.php \
+ --exclude tests/PHPStan/Parser/data/cleaning-property-hooks-before.php \
+ --exclude tests/PHPStan/Parser/data/cleaning-property-hooks-after.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-private-property-hook.php \
+ --exclude tests/PHPStan/Rules/Properties/data/existing-classes-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/set-property-hook-parameter.php \
+ --exclude tests/PHPStan/Rules/Properties/data/overriding-final-property.php \
+ --exclude tests/PHPStan/Rules/Properties/data/private-final-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-final-property-hook.php \
+ --exclude tests/PHPStan/Rules/Properties/data/final-property-hooks-in-interface.php \
+ --exclude tests/PHPStan/Rules/Properties/data/final-property-hooks.php \
+ --exclude tests/PHPStan/Rules/Properties/data/final-properties.php \
+ --exclude tests/PHPStan/Rules/Properties/data/property-in-interface-explicit-abstract.php \
+ --exclude tests/PHPStan/Rules/Constants/data/final-private-const.php \
+ --exclude tests/PHPStan/Rules/Properties/data/abstract-final-property-hook-parse-error.php \
+ src tests
+
+cs:
+ composer install --working-dir build-cs && XDEBUG_MODE=off php build-cs/vendor/bin/phpcs
+
+cs-fix:
+ XDEBUG_MODE=off php build-cs/vendor/bin/phpcbf
+
+phpstan:
+ php bin/phpstan clear-result-cache -q && php -d memory_limit=448M bin/phpstan
+
+phpstan-result-cache:
+ php -d memory_limit=448M bin/phpstan
+
+phpstan-generate-baseline:
+ php -d memory_limit=448M bin/phpstan --generate-baseline
+
+phpstan-generate-baseline-php:
+ php -d memory_limit=448M bin/phpstan analyse --generate-baseline phpstan-baseline.php
+
+phpstan-pro:
+ php -d memory_limit=448M bin/phpstan --pro
+
+name-collision:
+ php vendor/bin/detect-collisions --configuration build/collision-detector.json
+
+composer-dependency-analyser:
+ php vendor/bin/composer-dependency-analyser --config build/composer-dependency-analyser.php
diff --git a/README.md b/README.md
index 492c01788e..e817604542 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,6 @@
# PHPStan - PHP Static Analysis Tool
-[](https://travis-ci.com/phpstan/phpstan-src)
-[](https://github.com/phpstan/phpstan-src/actions)
+[](https://github.com/phpstan/phpstan-src/actions)
[](https://github.com/phpstan/phpstan)
---
@@ -12,16 +11,24 @@ This repository (`phpstan/phpstan-src`) is for PHPStan's development only. Head
Any contributions are welcome.
+### Installation
+
+```bash
+composer install
+```
+
+If you are using macOS and are using an older version of `patch`, you may have problems with patch application failure during `composer install`. Try using `brew install gpatch` to install a newer and supported `patch` version.
+
### Building
-PHPStan's source code is developed on PHP 7.4. For distribution in `phpstan/phpstan` package and as a PHAR file, the source code is transformed to run on PHP 7.1 and higher.
+PHPStan's source code is developed on PHP 8.1. For distribution in `phpstan/phpstan` package and as a PHAR file, the source code is transformed to run on PHP 7.2 and higher.
-Initially you need to run `composer install`, or `composer update` in case you aren't working in a directory which was built before.
+Initially you need to run `composer install` in case you aren't working in a directory which was built before.
Afterwards you can either run the whole build including linting and coding standards using
```bash
-vendor/bin/phing
+make
```
### Running development version
@@ -29,7 +36,7 @@ vendor/bin/phing
You can also choose to run only part of the build. To analyse PHPStan by PHPStan itself, run:
```bash
-vendor/bin/phing phpstan
+make phpstan
```
### Fixing code style
@@ -37,27 +44,25 @@ vendor/bin/phing phpstan
To detect code style issues, run:
```bash
-vendor/bin/phing cs
+make cs
```
-This requires PHP 7.4. On older versions the build target will be skipped and succeed silently.
-
And then to fix code style, run:
```bash
-vendor/bin/phing cs-fix
+make cs-fix
```
### Running tests
Run:
```bash
-vendor/bin/phing tests
+make tests
```
### Debugging
-1. Make sure XDebug is installed and configured.
+1. Make sure Xdebug is installed and configured.
2. Add `--xdebug` option when running PHPStan. Without it PHPStan turns the debugger off at runtime.
3. If you're not debugging the [result cache](https://phpstan.org/user-guide/result-cache), also add the `--debug` option.
diff --git a/UPGRADING.md b/UPGRADING.md
new file mode 100644
index 0000000000..1b76768ec4
--- /dev/null
+++ b/UPGRADING.md
@@ -0,0 +1,338 @@
+Upgrading from PHPStan 1.x to 2.0
+=================================
+
+## PHP version requirements
+
+PHPStan now requires PHP 7.4 or newer to run.
+
+## Upgrading guide for end users
+
+The best way to get ready for upgrade to PHPStan 2.0 is to update to the **latest PHPStan 1.12 release**
+and enable [**Bleeding Edge**](https://phpstan.org/blog/what-is-bleeding-edge). This will enable the new rules and behaviours that 2.0 turns on for all users.
+
+Also make sure to install and enable [`phpstan/phpstan-deprecation-rules`](https://github.com/phpstan/phpstan-deprecation-rules).
+
+Once you get to a green build with no deprecations showed on latest PHPStan 1.12.x with Bleeding Edge enabled, you can update all your related PHPStan dependencies to 2.0 in `composer.json`:
+
+```json
+"require-dev": {
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-doctrine": "^2.0",
+ "phpstan/phpstan-nette": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpstan/phpstan-symfony": "^2.0",
+ "phpstan/phpstan-webmozart-assert": "^2.0",
+ ...
+}
+```
+
+Don't forget to update [3rd party PHPStan extensions](https://phpstan.org/user-guide/extension-library) as well.
+
+After changing your `composer.json`, run `composer update 'phpstan/*' -W`.
+
+It's up to you whether you go through the new reported errors or if you just put them all to the [baseline](https://phpstan.org/user-guide/baseline) ;) Everyone who's on PHPStan 1.12 should be able to upgrade to PHPStan 2.0.
+
+### Noteworthy changes to code analysis
+
+* [**Enhancements in handling parameters passed by reference**](https://phpstan.org/blog/enhancements-in-handling-parameters-passed-by-reference)
+* [**Validate inline PHPDoc `@var` tag type**](https://phpstan.org/blog/phpstan-1-10-comes-with-lie-detector#validate-inline-phpdoc-%40var-tag-type)
+* [**List type enforced**](https://phpstan.org/blog/phpstan-1-9-0-with-phpdoc-asserts-list-type#list-type)
+* **Always `true` conditions always reported**: previously reported only with phpstan-strict-rules, this is now always reported.
+
+### Removed option `checkMissingIterableValueType`
+
+It's strongly recommended to add the missing array typehints.
+
+If you want to continue ignoring missing typehints from arrays, add `missingType.iterableValue` error identifier to your `ignoreErrors`:
+
+```neon
+parameters:
+ ignoreErrors:
+ -
+ identifier: missingType.iterableValue
+```
+
+### Removed option `checkGenericClassInNonGenericObjectType`
+
+It's strongly recommended to add the missing generic typehints.
+
+If you want to continue ignoring missing typehints from generics, add `missingType.generics` error identifier to your `ignoreErrors`:
+
+```neon
+parameters:
+ ignoreErrors:
+ -
+ identifier: missingType.generics
+```
+
+### Removed `checkAlwaysTrue*` options
+
+These options have been removed because PHPStan now always behaves as if these were set to `true`:
+
+* `checkAlwaysTrueCheckTypeFunctionCall`
+* `checkAlwaysTrueInstanceof`
+* `checkAlwaysTrueStrictComparison`
+* `checkAlwaysTrueLooseComparison`
+
+### Removed option `excludes_analyse`
+
+It has been replaced with [`excludePaths`](https://phpstan.org/user-guide/ignoring-errors#excluding-whole-files).
+
+### Paths in `excludePaths` and `ignoreErrors` have to be a valid file path or a fnmatch pattern
+
+If you are excluding a file path that might not exist but you still want to have it in `excludePaths`, append `(?)`:
+
+```neon
+parameters:
+ excludePaths:
+ - tests/*/data/*
+ - src/broken
+ - node_modules (?) # optional path, might not exist
+```
+
+If you have the same situation in `ignoreErrors` (ignoring an error in a path that might not exist), use `reportUnmatchedIgnoredErrors: false`.
+
+```neon
+parameters:
+ reportUnmatchedIgnoredErrors: false
+```
+
+Appending `(?)` in `ignoreErrors` is not supported.
+
+### Changes in 1st party PHPStan extensions
+
+* [phpstan-doctrine](https://github.com/phpstan/phpstan-doctrine)
+ * Removed config parameter `searchOtherMethodsForQueryBuilderBeginning` (extension now behaves as when this was set to `true`)
+ * Removed config parameter `queryBuilderFastAlgorithm` (extension now behaves as when this was set to `false`)
+* [phpstan-symfony](https://github.com/phpstan/phpstan-symfony)
+ * Removed legacy options with `_` in the name
+ * `container_xml_path` -> use `containerXmlPath`
+ * `constant_hassers` -> use `constantHassers`
+ * `console_application_loader` -> use `consoleApplicationLoader`
+
+### Minor backward compatibility breaks
+
+* Removed unused config parameter `cache.nodesByFileCountMax`
+* Removed unused config parameter `memoryLimitFile`
+* Removed unused feature toggle `disableRuntimeReflectionProvider`
+* Removed unused config parameter `staticReflectionClassNamePatterns`
+* Remove `fixerTmpDir` config parameter, use `pro.tmpDir` instead
+* Remove `tempResultCachePath` config parameter, use `resultCachePath` instead
+* `additionalConfigFiles` config parameter must be a list
+
+## Upgrading guide for extension developers
+
+> [!NOTE]
+> Please switch to PHPStan 2.0 in a new major version of your extension. It's not feasible to try to support both PHPStan 1.x and PHPStan 2.x with the same extension code.
+>
+> You can definitely get closer to supporting PHPStan 2.0 without increasing major version by solving reported deprecations and other issues by analysing your extension code with PHPStan & phpstan-deprecation-rules & Bleeding Edge, but the final leap and solving backward incompatibilities should be done by requiring `"phpstan/phpstan": "^2.0"` in your `composer.json`, and releasing a new major version.
+
+### PHPStan now uses nikic/php-parser v5
+
+See [UPGRADING](https://github.com/nikic/PHP-Parser/blob/master/UPGRADE-5.0.md) guide for PHP-Parser.
+
+The most notable change is how `throw` statement is represented. Previously, `throw` statements like `throw $e;` were represented using the `Stmt\Throw_` class, while uses inside other expressions (such as `$x ?? throw $e`) used the `Expr\Throw_` class.
+
+Now, `throw $e;` is represented as a `Stmt\Expression` that contains an `Expr\Throw_`. The
+`Stmt\Throw_` class has been removed.
+
+### PHPStan now uses phpstan/phpdoc-parser v2
+
+See [UPGRADING](https://github.com/phpstan/phpdoc-parser/blob/2.0.x/UPGRADING.md) guide for phpstan/phpdoc-parser.
+
+### Returning plain strings as errors no longer supported, use RuleErrorBuilder
+
+Identifiers are also required in custom rules.
+
+Learn more: [Using RuleErrorBuilder to enrich reported errors in custom rules](https://phpstan.org/blog/using-rule-error-builder)
+
+**Before**:
+
+```php
+return ['My error'];
+```
+
+**After**:
+
+```php
+return [
+ RuleErrorBuilder::message('My error')
+ ->identifier('my.error')
+ ->build(),
+];
+```
+
+### Deprecate various `instanceof *Type` in favour of new methods on `Type` interface
+
+Learn more: [Why Is instanceof *Type Wrong and Getting Deprecated?](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated)
+
+### Removed deprecated `ParametersAcceptorSelector::selectSingle()`
+
+Use [`ParametersAcceptorSelector::selectFromArgs()`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ParametersAcceptorSelector.html#_selectFromArgs) instead. It should be used in most places where `selectSingle()` was previously used, like dynamic return type extensions.
+
+**Before**:
+
+```php
+$defaultReturnType = ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
+```
+
+**After**:
+
+```php
+$defaultReturnType = ParametersAcceptorSelector::selectFromArgs(
+ $scope,
+ $functionCall->getArgs(),
+ $functionReflection->getVariants()
+)->getReturnType();
+```
+
+If you're analysing function or method body itself and you're using one of the following methods, ask for `getParameters()` and `getReturnType()` directly on the reflection object:
+
+* [InClassMethodNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InClassMethodNode.html)
+* [InFunctionNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InFunctionNode.html)
+* [FunctionReturnStatementsNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.FunctionReturnStatementsNode.html)
+* [MethodReturnStatementsNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.MethodReturnStatementsNode.html)
+* [Scope::getFunction()](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.Scope.html#_getFunction)
+
+**Before**:
+
+```php
+$function = $node->getFunctionReflection();
+$returnType = ParametersAcceptorSelector::selectSingle($function->getVariants())->getReturnType();
+```
+
+**After**:
+
+```php
+$returnType = $node->getFunctionReflection()->getReturnType();
+```
+
+### Changed `TypeSpecifier::create()` and `SpecifiedTypes` constructor parameters
+
+[`PHPStan\Analyser\TypeSpecifier::create()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.TypeSpecifier.html#_create) now accepts (all parameters are required):
+
+* `Expr $expr`
+* `Type $type`
+* `TypeSpecifierContext $context`
+* `Scope $scope`
+
+If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by this method), call `setAlwaysOverwriteTypes()` and `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::create()`). These methods return a new object (SpecifiedTypes is immutable).
+
+[`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) constructor now accepts:
+
+* `array $sureTypes`
+* `array $sureNotTypes`
+
+If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by the constructor), call `setAlwaysOverwriteTypes()` and `setRootExpr()`. These methods return a new object (SpecifiedTypes is immutable).
+
+### `ConstantArrayType` no longer extends `ArrayType`
+
+`Type::getArrays()` now returns `list`.
+
+Using `$type instanceof ArrayType` is [being deprecated anyway](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated) so the impact of this change should be minimal.
+
+### Changed `TypeSpecifier::specifyTypesInCondition()`
+
+This method now longer accepts `Expr $rootExpr`. If you want to change it, call `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::specifyTypesInCondition()`). `setRootExpr()` method returns a new object (SpecifiedTypes is immutable).
+
+### Node attributes `parent`, `previous`, `next` are no longer available
+
+Learn more: https://phpstan.org/blog/preprocessing-ast-for-custom-rules
+
+### Removed config parameter `scopeClass`
+
+As a replacement you can implement [`PHPStan\Type\ExpressionTypeResolverExtension`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.ExpressionTypeResolverExtension.html) interface instead and register it as a service.
+
+### Removed `PHPStan\Broker\Broker`
+
+Use [`PHPStan\Reflection\ReflectionProvider`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ReflectionProvider.html) instead.
+
+`BrokerAwareExtension` was also removed. Ask for `ReflectionProvider` in the extension constructor instead.
+
+Instead of `PHPStanTestCase::createBroker()`, call `PHPStanTestCase::createReflectionProvider()`.
+
+### List type is enabled for everyone
+
+Removed static methods from `AccessoryArrayListType` class:
+
+* `isListTypeEnabled()`
+* `setListTypeEnabled()`
+* `intersectWith()`
+
+Instead of `AccessoryArrayListType::intersectWith($type)`, do `TypeCombinator::intersect($type, new AccessoryArrayListType())`.
+
+### Minor backward compatibility breaks
+
+* Classes that were previously `@final` were made `final`
+* Parameter `$callableParameters` of [`MutatingScope::enterAnonymousFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterAnonymousFunction) and [`enterArrowFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterArrowFunction) made required
+* Parameter `StatementContext $context` of [`NodeScopeResolver::processStmtNodes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.NodeScopeResolver.html#_processStmtNodes) made required
+* ClassPropertiesNode - remove `$extensions` parameter from [`getUninitializedProperties()`](https://apiref.phpstan.org/2.0.x/PHPStan.Node.ClassPropertiesNode.html#_getUninitializedProperties)
+* `Type::getSmallerType()`, `Type::getSmallerOrEqualType()`, `Type::getGreaterType()`, `Type::getGreaterOrEqualType()`, `Type::isSmallerThan()`, `Type::isSmallerThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument.
+* `CompoundType::isGreaterThan()`, `CompoundType::isGreaterThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument.
+* Removed `ReflectionProvider::supportsAnonymousClasses()` (all reflection providers support anonymous classes)
+* Remove `ArrayType::generalizeKeys()`
+* Remove `ArrayType::count()`, use `Type::getArraySize()` instead
+* Remove `ArrayType::castToArrayKeyType()`, `Type::toArrayKey()` instead
+* Remove `UnionType::pickTypes()`, use `pickFromTypes()` instead
+* Remove `RegexArrayShapeMatcher::matchType()`, use `matchExpr()` instead
+* Remove unused `PHPStanTestCase::$useStaticReflectionProvider`
+* Remove `PHPStanTestCase::getReflectors()`, use `getReflector()` instead
+* Remove `ClassReflection::getFileNameWithPhpDocs()`, use `getFileName()` instead
+* Remove `AnalysisResult::getInternalErrors()`, use `getInternalErrorObjects()` instead
+* Remove `ConstantReflection::getValue()`, use `getValueExpr()` instead. To get `Type` from `Expr`, use `Scope::getType()` or `InitializerExprTypeResolver::getType()`
+* Remove `PropertyTag::getType()`, use `getReadableType()` / `getWritableType()` instead
+* Remove `GenericTypeVariableResolver`, use [`Type::getTemplateType()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getTemplateType) instead
+* Rename `Type::isClassStringType()` to `Type::isClassString()`
+* Remove `Scope::isSpecified()`, use `hasExpressionType()` instead
+* Remove `ConstantArrayType::isEmpty()`, use `isIterableAtLeastOnce()->no()` instead
+* Remove `ConstantArrayType::getNextAutoIndex()`
+* Removed methods from `ConstantArrayType` - `getFirst*Type` and `getLast*Type`
+ * Use `getFirstIterable*Type` and `getLastIterable*Type` instead
+* Remove `ConstantArrayType::generalizeToArray()`
+* Remove `ConstantArrayType::findTypeAndMethodName()`, use `findTypeAndMethodNames()` instead
+* Remove `ConstantArrayType::removeLast()`, use [`Type::popArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_popArray) instead
+* Remove `ConstantArrayType::removeFirst()`, use [`Type::shiftArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_shiftArray) instead
+* Remove `ConstantArrayType::reverse()`, use [`Type::reverseArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_reverseArray) instead
+* Remove `ConstantArrayType::chunk()`, use [`Type::chunkArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_chunkArray) instead
+* Remove `ConstantArrayType::slice()`, use [`Type::sliceArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_sliceArray) instead
+* Made `TypeUtils` thinner by removing methods:
+ * Remove `TypeUtils::getArrays()` and `getAnyArrays()`, use [`Type::getArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getArrays) instead
+ * Remove `TypeUtils::getConstantArrays()` and `getOldConstantArrays()`, use [`Type::getConstantArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantArrays) instead
+ * Remove `TypeUtils::getConstantStrings()`, use [`Type::getConstantStrings()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantStrings) instead
+ * Remove `TypeUtils::getConstantTypes()` and `getAnyConstantTypes()`, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) or [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize)
+ * Remove `TypeUtils::generalizeType()`, use [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize) instead
+ * Remove `TypeUtils::getDirectClassNames()`, use [`Type::getObjectClassNames()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getObjectClassNames) instead
+ * Remove `TypeUtils::getConstantScalars()`, use [`Type::isConstantScalarValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantScalarValue) or [`Type::getConstantScalarTypes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantScalarTypes) instead
+ * Remove `TypeUtils::getEnumCaseObjects()`, use [`Type::getEnumCases()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getEnumCases) instead
+ * Remove `TypeUtils::containsCallable()`, use [`Type::isCallable()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isCallable) instead
+* Removed `Scope::doNotTreatPhpDocTypesAsCertain()`, use `getNativeType()` instead
+* Parameter `$isList` in `ConstantArrayType` constructor can only be `TrinaryLogic`, no longer `bool`
+* Parameter `$nextAutoIndexes` in `ConstantArrayType` constructor can only be `non-empty-list`, no longer `int`
+* Remove `ConstantType` interface, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) instead
+* `acceptsNamedArguments()` in `FunctionReflection`, `ExtendedMethodReflection` and `CallableParametersAcceptor` interfaces returns `TrinaryLogic` instead of `bool`
+* Remove `FunctionReflection::isFinal()`
+* [`Type::getProperty()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getProperty) now returns [`ExtendedPropertyReflection`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ExtendedPropertyReflection.html)
+* Remove `__set_state()` on objects that should not be serialized in cache
+* Parameter `$selfClass` of [`TypehintHelper::decideTypeFromReflection()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.TypehintHelper.html#_decideTypeFromReflection) no longer accepts `string`
+* `LevelsTestCase::dataTopics()` data provider made static
+* `PHPStan\Node\Printer\Printer` no longer autowired as `PhpParser\PrettyPrinter\Standard`, use `PHPStan\Node\Printer\Printer` in the typehint
+* Remove `Type::acceptsWithReason()`, `Type:accepts()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+* Remove `CompoundType::isAcceptedWithReasonBy()`, `CompoundType::isAcceptedBy()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+Remove `Type::isSuperTypeOfWithReason()`, `Type:isSuperTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* Remove `CompoundType::isSubTypeOfWithReasonBy()`, `CompoundType::isSubTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* Remove `TemplateType::isValidVarianceWithReason()`, changed `TemplateType::isValidVariance()` return type to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* `RuleLevelHelper::accepts()` return type changed from `bool` to [`RuleLevelHelperAcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+* Changes around `ClassConstantReflection`
+ * Class `ClassConstantReflection` removed from BC promise, renamed to `RealClassConstantReflection`
+ * Interface `ConstantReflection` renamed to `ClassConstantReflection`
+ * Added more methods around PHPDoc types and native types to the (new) `ClassConstantReflection`
+ * Interface `GlobalConstantReflection` renamed to `ConstantReflection`
+* Renamed interfaces and classes from `*WithPhpDocs` to `Extended*`
+ * `ParametersAcceptorWithPhpDocs` -> `ExtendedParametersAcceptor`
+ * `ParameterReflectionWithPhpDocs` -> `ExtendedParameterReflection`
+ * `FunctionVariantWithPhpDocs` -> `ExtendedFunctionVariant`
+* `ClassPropertyNode::getNativeType()` return type changed from AST node to `Type|null`
+* Class `PHPStan\Node\ClassMethod` (accessible from `ClassMethodsNode`) is no longer an AST node
+ * Call `PHPStan\Node\ClassMethod::getNode()` to access the original AST node
diff --git a/apigen/.gitignore b/apigen/.gitignore
new file mode 100644
index 0000000000..61ead86667
--- /dev/null
+++ b/apigen/.gitignore
@@ -0,0 +1 @@
+/vendor
diff --git a/apigen/apigen.neon b/apigen/apigen.neon
new file mode 100644
index 0000000000..16d87b17a4
--- /dev/null
+++ b/apigen/apigen.neon
@@ -0,0 +1,10 @@
+parameters:
+ title: PHPStan
+ themeDir: theme
+
+services:
+ analyzer.filter:
+ factory: PHPStan\ApiGen\Filter(excludeProtected: %excludeProtected%, excludePrivate: %excludePrivate%, excludeTagged: %excludeTagged%)
+
+ renderer.filter:
+ factory: PHPStan\ApiGen\RendererFilter
diff --git a/apigen/composer.json b/apigen/composer.json
new file mode 100644
index 0000000000..cac161def9
--- /dev/null
+++ b/apigen/composer.json
@@ -0,0 +1,13 @@
+{
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "apigen/apigen": "dev-master#52f74870943620f96c669d730596fc1091117441"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\ApiGen\\": "src"
+ }
+ }
+}
diff --git a/apigen/composer.lock b/apigen/composer.lock
new file mode 100644
index 0000000000..5f296fa17b
--- /dev/null
+++ b/apigen/composer.lock
@@ -0,0 +1,1970 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "cca72dc10f8d1df2104049e381d62fcb",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "apigen/apigen",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ApiGen/ApiGen.git",
+ "reference": "52f74870943620f96c669d730596fc1091117441"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ApiGen/ApiGen/zipball/52f74870943620f96c669d730596fc1091117441",
+ "reference": "52f74870943620f96c669d730596fc1091117441",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-tokenizer": "*",
+ "jetbrains/phpstorm-stubs": "^2022.1",
+ "latte/latte": "^3.0",
+ "league/commonmark": "^2.3",
+ "nette/di": "^3.0",
+ "nette/finder": "^2.5",
+ "nette/schema": "^1.2",
+ "nette/utils": "^3.2",
+ "nikic/php-parser": "^4.14",
+ "php": "^8.1",
+ "phpstan/php-8-stubs": "^0.3.9",
+ "phpstan/phpdoc-parser": "^1.5",
+ "symfony/console": "^6.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.7",
+ "tracy/tracy": "^2.9"
+ },
+ "suggest": {
+ "ext-pcntl": "for multiprocess rendering"
+ },
+ "default-branch": true,
+ "bin": [
+ "bin/apigen"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ApiGen\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "ApiGen Contributors",
+ "homepage": "https://github.com/apigen/apigen/graphs/contributors"
+ },
+ {
+ "name": "Jaroslav Hanslík",
+ "homepage": "https://github.com/kukulich"
+ },
+ {
+ "name": "Ondřej Nešpor",
+ "homepage": "https://github.com/andrewsville"
+ },
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ }
+ ],
+ "description": "PHP source code API generator.",
+ "support": {
+ "issues": "https://github.com/ApiGen/ApiGen/issues",
+ "source": "https://github.com/ApiGen/ApiGen/tree/master"
+ },
+ "time": "2022-07-10T16:43:45+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "0992cc19268b259a39e86f296da5f0677841f42c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c",
+ "reference": "0992cc19268b259a39e86f296da5f0677841f42c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^3.14"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com/"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com/"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com/"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1"
+ },
+ "time": "2021-08-13T13:06:58+00:00"
+ },
+ {
+ "name": "jetbrains/phpstorm-stubs",
+ "version": "v2022.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JetBrains/phpstorm-stubs.git",
+ "reference": "066fa5b3cd989b9c4fb1793d5ad20af5ab0e2b3c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/066fa5b3cd989b9c4fb1793d5ad20af5ab0e2b3c",
+ "reference": "066fa5b3cd989b9c4fb1793d5ad20af5ab0e2b3c",
+ "shasum": ""
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "@stable",
+ "nikic/php-parser": "@stable",
+ "php": "^8.0",
+ "phpdocumentor/reflection-docblock": "@stable",
+ "phpunit/phpunit": "@stable"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "PhpStormStubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "PHP runtime & extensions header files for PhpStorm",
+ "homepage": "https://www.jetbrains.com/phpstorm",
+ "keywords": [
+ "autocomplete",
+ "code",
+ "inference",
+ "inspection",
+ "jetbrains",
+ "phpstorm",
+ "stubs",
+ "type"
+ ],
+ "support": {
+ "source": "https://github.com/JetBrains/phpstorm-stubs/tree/v2022.1"
+ },
+ "time": "2022-03-08T07:40:50+00:00"
+ },
+ {
+ "name": "latte/latte",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/latte.git",
+ "reference": "c3eee2e4e2c21cdf9f9c158c4bfa6150625457e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/latte/zipball/c3eee2e4e2c21cdf9f9c158c4bfa6150625457e1",
+ "reference": "c3eee2e4e2c21cdf9f9c158c4bfa6150625457e1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=8.0 <8.2"
+ },
+ "conflict": {
+ "nette/application": "<2.4.1"
+ },
+ "require-dev": {
+ "nette/php-generator": "^3.3.4",
+ "nette/tester": "^2.0",
+ "nette/utils": "^3.0",
+ "phpstan/phpstan": "^1",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-fileinfo": "to use filter |datastream",
+ "ext-iconv": "to use filters |reverse, |substring",
+ "ext-mbstring": "to use filters like lower, upper, capitalize, ...",
+ "nette/php-generator": "to use tag {templatePrint}",
+ "nette/utils": "to use filter |webalize"
+ },
+ "bin": [
+ "bin/latte-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "☕ Latte: the intuitive and fast template engine for those who want the most secure PHP sites. Introduces context-sensitive escaping.",
+ "homepage": "https://latte.nette.org/",
+ "keywords": [
+ "context-sensitive",
+ "engine",
+ "escaping",
+ "html",
+ "nette",
+ "security",
+ "template",
+ "twig"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/latte/issues",
+ "source": "https://github.com/nette/latte/tree/v3.0.2"
+ },
+ "time": "2022-06-15T13:42:57+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "0da1dca5781dd3cfddbe328224d9a7a62571addc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/0da1dca5781dd3cfddbe328224d9a7a62571addc",
+ "reference": "0da1dca5781dd3cfddbe328224d9a7a62571addc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.30.0",
+ "commonmark/commonmark.js": "0.30.0",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^0.12.88 || ^1.0.0",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com/",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com/",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-06-07T21:28:26+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
+ "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.90",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com/",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com/",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2021-08-14T12:15:32+00:00"
+ },
+ {
+ "name": "nette/di",
+ "version": "v3.0.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/di.git",
+ "reference": "9878f2958a0a804b08430dbc719a52e493022739"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/di/zipball/9878f2958a0a804b08430dbc719a52e493022739",
+ "reference": "9878f2958a0a804b08430dbc719a52e493022739",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/neon": "^3.3 || ^4.0",
+ "nette/php-generator": "^3.5.4 || ^4.0",
+ "nette/robot-loader": "^3.2",
+ "nette/schema": "^1.1",
+ "nette/utils": "^3.1.6",
+ "php": ">=7.1 <8.2"
+ },
+ "conflict": {
+ "nette/bootstrap": "<3.0"
+ },
+ "require-dev": {
+ "nette/tester": "^2.2",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "compiled",
+ "di",
+ "dic",
+ "factory",
+ "ioc",
+ "nette",
+ "static"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/di/issues",
+ "source": "https://github.com/nette/di/tree/v3.0.13"
+ },
+ "time": "2022-03-10T02:43:04+00:00"
+ },
+ {
+ "name": "nette/finder",
+ "version": "v2.5.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/finder.git",
+ "reference": "64dc25b7929b731e72a1bc84a9e57727f5d5d3e8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/finder/zipball/64dc25b7929b731e72a1bc84a9e57727f5d5d3e8",
+ "reference": "64dc25b7929b731e72a1bc84a9e57727f5d5d3e8",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.4 || ^3.0",
+ "php": ">=7.1"
+ },
+ "conflict": {
+ "nette/nette": "<2.2"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🔍 Nette Finder: find files and directories with an intuitive API.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "filesystem",
+ "glob",
+ "iterator",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/finder/issues",
+ "source": "https://github.com/nette/finder/tree/v2.5.3"
+ },
+ "time": "2021-12-12T17:43:24+00:00"
+ },
+ {
+ "name": "nette/neon",
+ "version": "v3.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/neon.git",
+ "reference": "22e384da162fab42961d48eb06c06d3ad0c11b95"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/neon/zipball/22e384da162fab42961d48eb06c06d3ad0c11b95",
+ "reference": "22e384da162fab42961d48eb06c06d3ad0c11b95",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.7"
+ },
+ "bin": [
+ "bin/neon-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
+ "homepage": "https://ne-on.org/",
+ "keywords": [
+ "export",
+ "import",
+ "neon",
+ "nette",
+ "yaml"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/neon/issues",
+ "source": "https://github.com/nette/neon/tree/v3.3.3"
+ },
+ "time": "2022-03-10T02:04:26+00:00"
+ },
+ {
+ "name": "nette/php-generator",
+ "version": "v4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/php-generator.git",
+ "reference": "f19b7975c7c4d729be5b64fce7eb72f0d4aac6fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/php-generator/zipball/f19b7975c7c4d729be5b64fce7eb72f0d4aac6fc",
+ "reference": "f19b7975c7c4d729be5b64fce7eb72f0d4aac6fc",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^3.2.7 || ^4.0",
+ "php": ">=8.0 <8.2"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "nikic/php-parser": "^4.13",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.8"
+ },
+ "suggest": {
+ "nikic/php-parser": "to use ClassType::from(withBodies: true) & ClassType::fromCode()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.1 features.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "code",
+ "nette",
+ "php",
+ "scaffolding"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/php-generator/issues",
+ "source": "https://github.com/nette/php-generator/tree/v4.0.2"
+ },
+ "time": "2022-06-17T12:20:08+00:00"
+ },
+ {
+ "name": "nette/robot-loader",
+ "version": "v3.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/robot-loader.git",
+ "reference": "e2adc334cb958164c050f485d99c44c430f51fe2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/robot-loader/zipball/e2adc334cb958164c050f485d99c44c430f51fe2",
+ "reference": "e2adc334cb958164c050f485d99c44c430f51fe2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/finder": "^2.5 || ^3.0",
+ "nette/utils": "^3.0",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "autoload",
+ "class",
+ "interface",
+ "nette",
+ "trait"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/robot-loader/issues",
+ "source": "https://github.com/nette/robot-loader/tree/v3.4.1"
+ },
+ "time": "2021-08-25T15:53:54+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df",
+ "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
+ "php": ">=7.1 <8.2"
+ },
+ "require-dev": {
+ "nette/tester": "^2.3 || ^2.4",
+ "phpstan/phpstan-nette": "^0.12",
+ "tracy/tracy": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.2.2"
+ },
+ "time": "2021-10-15T11:40:02+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v3.2.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/0af4e3de4df9f1543534beab255ccf459e7a2c99",
+ "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2 <8.2"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
+ },
+ "require-dev": {
+ "nette/tester": "~2.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+ "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v3.2.7"
+ },
+ "time": "2022-01-24T11:29:14+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.14.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0"
+ },
+ "time": "2022-05-31T20:59:12+00:00"
+ },
+ {
+ "name": "phpstan/php-8-stubs",
+ "version": "0.3.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/php-8-stubs.git",
+ "reference": "2be8adf73c7034f78ca109bb5bb6cb14ea04a49f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/php-8-stubs/zipball/2be8adf73c7034f78ca109bb5bb6cb14ea04a49f",
+ "reference": "2be8adf73c7034f78ca109bb5bb6cb14ea04a49f",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Php8StubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT",
+ "PHP-3.01"
+ ],
+ "description": "PHP stubs extracted from php-src",
+ "support": {
+ "issues": "https://github.com/phpstan/php-8-stubs/issues",
+ "source": "https://github.com/phpstan/php-8-stubs/tree/0.3.17"
+ },
+ "time": "2022-06-23T00:14:01+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "1.6.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "135607f9ccc297d6923d49c2bcf309f509413215"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/135607f9ccc297d6923d49c2bcf309f509413215",
+ "reference": "135607f9ccc297d6923d49c2bcf309f509413215",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.5",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.6.4"
+ },
+ "time": "2022-06-26T13:09:08+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "7a86c1c42fbcb69b59768504c7bca1d3767760b7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/7a86c1c42fbcb69b59768504c7bca1d3767760b7",
+ "reference": "7a86c1c42fbcb69b59768504c7bca1d3767760b7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.4|^6.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/lock": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/var-dumper": "^5.4|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-06-26T13:01:30+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
+ "reference": "07f1b9cc2ffee6aaafcf4b710fbc38ff736bd918",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-02-25T11:15:52+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2",
+ "reference": "433d05519ce6990bf3530fba6957499d327395c2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "219aa369ceff116e673852dce47c3a41794c14bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd",
+ "reference": "219aa369ceff116e673852dce47c3a41794c14bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-24T11:49:31+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.26-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-10T07:21:04+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/925e713fe8fcacf6bc05e936edd8dd5441a21239",
+ "reference": "925e713fe8fcacf6bc05e936edd8dd5441a21239",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.1-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-30T19:18:58+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "1903f2879875280c5af944625e8246d81c2f0604"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/1903f2879875280c5af944625e8246d81c2f0604",
+ "reference": "1903f2879875280c5af944625e8246d81c2f0604",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/translation-contracts": "^2.0|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-06-26T16:35:04+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "apigen/apigen": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/apigen/src/Filter.php b/apigen/src/Filter.php
new file mode 100644
index 0000000000..66f39c3bfb
--- /dev/null
+++ b/apigen/src/Filter.php
@@ -0,0 +1,170 @@
+namespacedName->toString();
+ if (Strings::startsWith($name, 'PhpParser\\')) {
+ return true;
+ }
+
+ if (!Strings::startsWith($name, 'PHPStan\\')) {
+ return false;
+ }
+
+ if (Strings::startsWith($name, 'PHPStan\\PhpDocParser\\')) {
+ return true;
+ }
+
+ if (Strings::startsWith($name, 'PHPStan\\BetterReflection\\')) {
+ return true;
+ }
+
+ if ($this->hasApiTag($node)) {
+ return true;
+ }
+
+ foreach ($node->getMethods() as $method) {
+ if ($this->hasApiTag($method)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function filterClassLikeTags(array $tags): bool
+ {
+ return parent::filterClassLikeTags($tags);
+ }
+
+ public function filterClassLikeInfo(ClassLikeInfo $info): bool
+ {
+ return parent::filterClassLikeInfo($info);
+ }
+
+ public function filterFunctionNode(Node\Stmt\Function_ $node): bool
+ {
+ $name = $node->namespacedName->toString();
+ if (!Strings::startsWith($name, 'PHPStan\\')) {
+ return false;
+ }
+
+ return $this->hasApiTag($node);
+ }
+
+ public function filterFunctionTags(array $tags): bool
+ {
+ return parent::filterFunctionTags($tags);
+ }
+
+ public function filterFunctionInfo(FunctionInfo $info): bool
+ {
+ return parent::filterFunctionInfo($info);
+ }
+
+ public function filterConstantNode(Node\Stmt\ClassConst $node): bool
+ {
+ return parent::filterConstantNode($node);
+ }
+
+ public function filterPropertyNode(Node\Stmt\Property $node): bool
+ {
+ return parent::filterPropertyNode($node);
+ }
+
+ public function filterPromotedPropertyNode(Node\Param $node): bool
+ {
+ return parent::filterPromotedPropertyNode($node);
+ }
+
+ public function filterMethodNode(Node\Stmt\ClassMethod $node): bool
+ {
+ return parent::filterMethodNode($node);
+ }
+
+ public function filterEnumCaseNode(Node\Stmt\EnumCase $node): bool
+ {
+ return parent::filterEnumCaseNode($node);
+ }
+
+ public function filterMemberTags(array $tags): bool
+ {
+ return parent::filterMemberTags($tags);
+ }
+
+ public function filterMemberInfo(ClassLikeInfo $classLike, MemberInfo $member): bool
+ {
+ $className = $classLike->name->full;
+ if (Strings::startsWith($className, 'PhpParser\\')) {
+ return true;
+ }
+ if (Strings::startsWith($className, 'PHPStan\\PhpDocParser\\')) {
+ return true;
+ }
+
+ if (Strings::startsWith($className, 'PHPStan\\BetterReflection\\')) {
+ return true;
+ }
+ if (!$member instanceof MethodInfo) {
+ return !Strings::startsWith($className, 'PHPStan\\');
+ }
+
+ if (!Strings::startsWith($className, 'PHPStan\\')) {
+ return false;
+ }
+
+ if (isset($classLike->tags['api'])) {
+ return true;
+ }
+
+ return isset($member->tags['api']);
+ }
+
+ private function hasApiTag(Node $node): bool
+ {
+ $classDoc = $this->extractPhpDoc($node);
+ $tags = $this->extractTags($classDoc);
+
+ return isset($tags['api']);
+ }
+
+ private function extractPhpDoc(Node $node): PhpDocNode
+ {
+ return $node->getAttribute('phpDoc') ?? new PhpDocNode([]);
+ }
+
+ /**
+ * @return PhpDocTagValueNode[][] indexed by [tagName][]
+ */
+ private function extractTags(PhpDocNode $node): array
+ {
+ $tags = [];
+
+ foreach ($node->getTags() as $tag) {
+ if ($tag->value instanceof InvalidTagValueNode) {
+ continue;
+ }
+
+ $tags[substr($tag->name, 1)][] = $tag->value;
+ }
+
+ return $tags;
+ }
+
+}
diff --git a/apigen/src/RendererFilter.php b/apigen/src/RendererFilter.php
new file mode 100644
index 0000000000..9f25bbd5d8
--- /dev/null
+++ b/apigen/src/RendererFilter.php
@@ -0,0 +1,113 @@
+children as $child) {
+ if ($this->filterNamespacePage($child)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->class as $class) {
+ if ($this->filterClassLikePage($class)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->interface as $interface) {
+ if ($this->filterClassLikePage($interface)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->trait as $trait) {
+ if ($this->filterClassLikePage($trait)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->enum as $enum) {
+ if ($this->filterClassLikePage($enum)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->exception as $exception) {
+ if ($this->filterClassLikePage($exception)) {
+ return true;
+ }
+ }
+
+ foreach ($namespace->function as $function) {
+ if ($this->filterFunctionPage($function)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function filterClassLikePage(ClassLikeInfo $classLike): bool
+ {
+ return $this->isClassRendered($classLike);
+ }
+
+ private function isClassRendered(ClassLikeInfo $classLike): bool
+ {
+ $className = $classLike->name->full;
+ if (Strings::startsWith($className, 'PhpParser\\')) {
+ return true;
+ }
+ if (Strings::startsWith($className, 'PHPStan\\PhpDocParser\\')) {
+ return true;
+ }
+
+ if (Strings::startsWith($className, 'PHPStan\\BetterReflection\\')) {
+ return true;
+ }
+
+ if (!Strings::startsWith($className, 'PHPStan\\')) {
+ return false;
+ }
+
+ if (isset($classLike->tags['api'])) {
+ return true;
+ }
+
+ foreach ($classLike->methods as $method) {
+ if (isset($method->tags['api'])) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function filterFunctionPage(FunctionInfo $function): bool
+ {
+ return parent::filterFunctionPage($function); // todo
+ }
+
+ public function filterSourcePage(FileIndex $file): bool
+ {
+ return parent::filterSourcePage($file);
+ }
+
+}
diff --git a/apigen/theme/blocks/head.latte b/apigen/theme/blocks/head.latte
new file mode 100644
index 0000000000..16f25417e3
--- /dev/null
+++ b/apigen/theme/blocks/head.latte
@@ -0,0 +1,8 @@
+{define head}
+
+
+{/define}
+{define menu}
+ API Reference
+ {include #parent}
+{/define}
diff --git a/bin/functionMetadata_original.php b/bin/functionMetadata_original.php
new file mode 100644
index 0000000000..f4c9cd19fc
--- /dev/null
+++ b/bin/functionMetadata_original.php
@@ -0,0 +1,182 @@
+ ['hasSideEffects' => false],
+ 'acos' => ['hasSideEffects' => false],
+ 'acosh' => ['hasSideEffects' => false],
+ 'addcslashes' => ['hasSideEffects' => false],
+ 'addslashes' => ['hasSideEffects' => false],
+ 'array_change_key_case' => ['hasSideEffects' => false],
+ 'array_chunk' => ['hasSideEffects' => false],
+ 'array_column' => ['hasSideEffects' => false],
+ 'array_combine' => ['hasSideEffects' => false],
+ 'array_count_values' => ['hasSideEffects' => false],
+ 'array_diff' => ['hasSideEffects' => false],
+ 'array_diff_assoc' => ['hasSideEffects' => false],
+ 'array_diff_key' => ['hasSideEffects' => false],
+ 'array_diff_uassoc' => ['hasSideEffects' => false],
+ 'array_diff_ukey' => ['hasSideEffects' => false],
+ 'array_fill' => ['hasSideEffects' => false],
+ 'array_fill_keys' => ['hasSideEffects' => false],
+ 'array_flip' => ['hasSideEffects' => false],
+ 'array_intersect' => ['hasSideEffects' => false],
+ 'array_intersect_assoc' => ['hasSideEffects' => false],
+ 'array_intersect_key' => ['hasSideEffects' => false],
+ 'array_intersect_uassoc' => ['hasSideEffects' => false],
+ 'array_intersect_ukey' => ['hasSideEffects' => false],
+ 'array_key_first' => ['hasSideEffects' => false],
+ 'array_key_last' => ['hasSideEffects' => false],
+ 'array_key_exists' => ['hasSideEffects' => false],
+ 'array_keys' => ['hasSideEffects' => false],
+ 'array_merge' => ['hasSideEffects' => false],
+ 'array_merge_recursive' => ['hasSideEffects' => false],
+ 'array_pad' => ['hasSideEffects' => false],
+ 'array_pop' => ['hasSideEffects' => true],
+ 'array_product' => ['hasSideEffects' => false],
+ 'array_push' => ['hasSideEffects' => true],
+ 'array_rand' => ['hasSideEffects' => false],
+ 'array_replace' => ['hasSideEffects' => false],
+ 'array_replace_recursive' => ['hasSideEffects' => false],
+ 'array_reverse' => ['hasSideEffects' => false],
+ 'array_shift' => ['hasSideEffects' => true],
+ 'array_slice' => ['hasSideEffects' => false],
+ 'array_sum' => ['hasSideEffects' => false],
+ 'array_udiff' => ['hasSideEffects' => false],
+ 'array_udiff_assoc' => ['hasSideEffects' => false],
+ 'array_udiff_uassoc' => ['hasSideEffects' => false],
+ 'array_uintersect' => ['hasSideEffects' => false],
+ 'array_uintersect_assoc' => ['hasSideEffects' => false],
+ 'array_uintersect_uassoc' => ['hasSideEffects' => false],
+ 'array_unique' => ['hasSideEffects' => false],
+ 'array_unshift' => ['hasSideEffects' => true],
+ 'array_values' => ['hasSideEffects' => false],
+ 'asin' => ['hasSideEffects' => false],
+ 'asinh' => ['hasSideEffects' => false],
+ 'atan' => ['hasSideEffects' => false],
+ 'atan2' => ['hasSideEffects' => false],
+ 'atanh' => ['hasSideEffects' => false],
+ 'base64_decode' => ['hasSideEffects' => false],
+ 'base64_encode' => ['hasSideEffects' => false],
+ 'base_convert' => ['hasSideEffects' => false],
+ 'basename' => ['hasSideEffects' => false],
+ 'bcadd' => ['hasSideEffects' => false],
+ 'bccomp' => ['hasSideEffects' => false],
+ 'bcdiv' => ['hasSideEffects' => false],
+ 'bcmod' => ['hasSideEffects' => false],
+ 'bcmul' => ['hasSideEffects' => false],
+ // continue functionMap.php, line 424
+ 'chgrp' => ['hasSideEffects' => true],
+ 'chmod' => ['hasSideEffects' => true],
+ 'chown' => ['hasSideEffects' => true],
+ 'copy' => ['hasSideEffects' => true],
+ 'count' => ['hasSideEffects' => false],
+ 'error_log' => ['hasSideEffects' => true],
+ 'fclose' => ['hasSideEffects' => true],
+ 'fflush' => ['hasSideEffects' => true],
+ 'fgetc' => ['hasSideEffects' => true],
+ 'fgetcsv' => ['hasSideEffects' => true],
+ 'fgets' => ['hasSideEffects' => true],
+ 'fgetss' => ['hasSideEffects' => true],
+ 'file_put_contents' => ['hasSideEffects' => true],
+ 'flock' => ['hasSideEffects' => true],
+ 'fopen' => ['hasSideEffects' => true],
+ 'fpassthru' => ['hasSideEffects' => true],
+ 'fputcsv' => ['hasSideEffects' => true],
+ 'fputs' => ['hasSideEffects' => true],
+ 'fread' => ['hasSideEffects' => true],
+ 'fscanf' => ['hasSideEffects' => true],
+ 'fseek' => ['hasSideEffects' => true],
+ 'ftruncate' => ['hasSideEffects' => true],
+ 'fwrite' => ['hasSideEffects' => true],
+ 'json_validate' => ['hasSideEffects' => false],
+ 'lchgrp' => ['hasSideEffects' => true],
+ 'lchown' => ['hasSideEffects' => true],
+ 'link' => ['hasSideEffects' => true],
+ 'mb_str_pad' => ['hasSideEffects' => false],
+ 'mkdir' => ['hasSideEffects' => true],
+ 'move_uploaded_file' => ['hasSideEffects' => true],
+ 'ob_clean' => ['hasSideEffects' => true],
+ 'ob_end_clean' => ['hasSideEffects' => true],
+ 'ob_end_flush' => ['hasSideEffects' => true],
+ 'ob_flush' => ['hasSideEffects' => true],
+ 'ob_get_clean' => ['hasSideEffects' => true],
+ 'ob_get_contents' => ['hasSideEffects' => true],
+ 'ob_get_length' => ['hasSideEffects' => true],
+ 'ob_get_level' => ['hasSideEffects' => true],
+ 'ob_get_status' => ['hasSideEffects' => true],
+ 'ob_list_handlers' => ['hasSideEffects' => true],
+ 'output_add_rewrite_var' => ['hasSideEffects' => true],
+ 'output_reset_rewrite_vars' => ['hasSideEffects' => true],
+ 'pclose' => ['hasSideEffects' => true],
+ 'popen' => ['hasSideEffects' => true],
+ 'readfile' => ['hasSideEffects' => true],
+ 'rename' => ['hasSideEffects' => true],
+ 'rewind' => ['hasSideEffects' => true],
+ 'rmdir' => ['hasSideEffects' => true],
+ 'sprintf' => ['hasSideEffects' => false],
+ 'str_decrement' => ['hasSideEffects' => false],
+ 'str_increment' => ['hasSideEffects' => false],
+ 'symlink' => ['hasSideEffects' => true],
+ 'tempnam' => ['hasSideEffects' => true],
+ 'tmpfile' => ['hasSideEffects' => true],
+ 'touch' => ['hasSideEffects' => true],
+ 'umask' => ['hasSideEffects' => true],
+ 'unlink' => ['hasSideEffects' => true],
+
+ // random functions, do not have side effects but are not deterministic
+ 'mt_rand' => ['hasSideEffects' => true],
+ 'rand' => ['hasSideEffects' => true],
+ 'random_bytes' => ['hasSideEffects' => true],
+ 'random_int' => ['hasSideEffects' => true],
+
+ // methods
+ 'DateTime::createFromFormat' => ['hasSideEffects' => false],
+ 'DateTime::createFromImmutable' => ['hasSideEffects' => false],
+ 'DateTime::getLastErrors' => ['hasSideEffects' => false],
+ 'DateTime::add' => ['hasSideEffects' => true],
+ 'DateTime::modify' => ['hasSideEffects' => true],
+ 'DateTime::setDate' => ['hasSideEffects' => true],
+ 'DateTime::setISODate' => ['hasSideEffects' => true],
+ 'DateTime::setTime' => ['hasSideEffects' => true],
+ 'DateTime::setTimestamp' => ['hasSideEffects' => true],
+ 'DateTime::setTimezone' => ['hasSideEffects' => true],
+ 'DateTime::sub' => ['hasSideEffects' => true],
+ 'DateTime::diff' => ['hasSideEffects' => false],
+ 'DateTime::format' => ['hasSideEffects' => false],
+ 'DateTime::getOffset' => ['hasSideEffects' => false],
+ 'DateTime::getTimestamp' => ['hasSideEffects' => false],
+ 'DateTime::getTimezone' => ['hasSideEffects' => false],
+
+ 'DateTimeImmutable::createFromFormat' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::createFromMutable' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::getLastErrors' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::add' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::modify' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::setDate' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::setISODate' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::setTime' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::setTimestamp' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::setTimezone' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::sub' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::diff' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::format' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::getOffset' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::getTimestamp' => ['hasSideEffects' => false],
+ 'DateTimeImmutable::getTimezone' => ['hasSideEffects' => false],
+
+ 'SplFileObject::fflush' => ['hasSideEffects' => true],
+ 'SplFileObject::fgetc' => ['hasSideEffects' => true],
+ 'SplFileObject::fgetcsv' => ['hasSideEffects' => true],
+ 'SplFileObject::fgets' => ['hasSideEffects' => true],
+ 'SplFileObject::fgetss' => ['hasSideEffects' => true],
+ 'SplFileObject::fpassthru' => ['hasSideEffects' => true],
+ 'SplFileObject::fputcsv' => ['hasSideEffects' => true],
+ 'SplFileObject::fread' => ['hasSideEffects' => true],
+ 'SplFileObject::fscanf' => ['hasSideEffects' => true],
+ 'SplFileObject::fseek' => ['hasSideEffects' => true],
+ 'SplFileObject::ftruncate' => ['hasSideEffects' => true],
+ 'SplFileObject::fwrite' => ['hasSideEffects' => true],
+
+ 'XmlReader::next' => ['hasSideEffects' => true],
+ 'XmlReader::read' => ['hasSideEffects' => true],
+];
diff --git a/bin/generate-changelog.php b/bin/generate-changelog.php
deleted file mode 100755
index 5119d62564..0000000000
--- a/bin/generate-changelog.php
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env php
-setName('run');
- $this->addArgument('fromCommit', InputArgument::REQUIRED);
- $this->addArgument('toCommit', InputArgument::REQUIRED);
- }
-
- protected function execute(InputInterface $input, OutputInterface $output)
- {
- $commitLines = $this->exec(['git', 'log', sprintf('%s..%s', $input->getArgument('fromCommit'), $input->getArgument('toCommit')), '--reverse', '--pretty=%H %s']);
- $commits = array_map(function (string $line): array {
- [$hash, $message] = explode(' ', $line, 2);
-
- return [
- 'hash' => $hash,
- 'message' => $message
- ];
- }, explode("\n", $commitLines));
-
- $i = 0;
-
- foreach ($commits as $commit) {
- $searchPullRequestsResponse = Request::get(sprintf('https://api.github.com/search/issues?q=repo:phpstan/phpstan-src+%s', $commit['hash']))
- ->sendsAndExpectsType('application/json')
- ->basicAuth('ondrejmirtes', getenv('GITHUB_TOKEN'))
- ->send();
- if ($searchPullRequestsResponse->code !== 200) {
- $output->writeln(var_export($searchPullRequestsResponse->body, true));
- throw new \InvalidArgumentException((string) $searchPullRequestsResponse->code);
- }
- $searchPullRequestsResponse = $searchPullRequestsResponse->body;
-
- $searchIssuesResponse = Request::get(sprintf('https://api.github.com/search/issues?q=repo:phpstan/phpstan+%s', $commit['hash']))
- ->sendsAndExpectsType('application/json')
- ->basicAuth('ondrejmirtes', getenv('GITHUB_TOKEN'))
- ->send();
- if ($searchIssuesResponse->code !== 200) {
- $output->writeln(var_export($searchIssuesResponse->body, true));
- throw new \InvalidArgumentException((string) $searchIssuesResponse->code);
- }
- $searchIssuesResponse = $searchIssuesResponse->body;
- $items = array_merge($searchPullRequestsResponse->items, $searchIssuesResponse->items);
- $parenthesis = 'https://github.com/phpstan/phpstan-src/commit/' . $commit['hash'];
- $thanks = null;
- $issuesToReference = [];
- foreach ($items as $responseItem) {
- if (isset($responseItem->pull_request)) {
- $parenthesis = sprintf('[#%d](%s)', $responseItem->number, 'https://github.com/phpstan/phpstan-src/pull/' . $responseItem->number);
- $thanks = $responseItem->user->login;
- } else {
- $issuesToReference[] = sprintf('#%d', $responseItem->number);
- }
- }
-
- $output->writeln(sprintf('* %s (%s)%s%s', $commit['message'], $parenthesis, count($issuesToReference) > 0 ? ', ' . implode(', ', $issuesToReference) : '', $thanks !== null ? sprintf(', thanks @%s!', $thanks) : ''));
-
- if ($i > 0 && $i % 8 === 0) {
- sleep(60);
- }
-
- $i++;
- }
-
- return 0;
- }
-
- /**
- * @param string[] $commandParts
- * @return string
- */
- private function exec(array $commandParts): string
- {
- $command = implode(' ', array_map(function (string $part): string {
- return escapeshellarg($part);
- }, $commandParts));
-
- exec($command, $outputLines, $statusCode);
- $output = implode("\n", $outputLines);
- if ($statusCode !== 0) {
- throw new \InvalidArgumentException(sprintf('Command %s failed: %s', $command, $output));
- }
-
- return $output;
- }
-
- };
-
- $application = new \Symfony\Component\Console\Application();
- $application->add($command);
- $application->setDefaultCommand('run', true);
- $application->run();
-
-})();
diff --git a/bin/generate-function-metadata.php b/bin/generate-function-metadata.php
new file mode 100755
index 0000000000..d161d374e4
--- /dev/null
+++ b/bin/generate-function-metadata.php
@@ -0,0 +1,197 @@
+#!/usr/bin/env php
+createForNewestSupportedVersion();
+ $finder = new Finder();
+ $finder->in(__DIR__ . '/../vendor/jetbrains/phpstorm-stubs')->files()->name('*.php');
+
+ $visitor = new class() extends NodeVisitorAbstract {
+
+ /** @var string[] */
+ public array $functions = [];
+
+ /** @var list */
+ public array $impureFunctions = [];
+
+ /** @var string[] */
+ public array $methods = [];
+
+ public function enterNode(Node $node)
+ {
+ if ($node instanceof Node\Stmt\Function_) {
+ assert(isset($node->namespacedName));
+ $functionName = $node->namespacedName->toLowerString();
+
+ foreach ($node->attrGroups as $attrGroup) {
+ foreach ($attrGroup->attrs as $attr) {
+ if ($attr->name->toString() !== Pure::class) {
+ continue;
+ }
+
+ // The following functions have side effects, but their state is managed within the PHPStan scope:
+ if (in_array($functionName, [
+ 'stat',
+ 'lstat',
+ 'file_exists',
+ 'is_writable',
+ 'is_writeable',
+ 'is_readable',
+ 'is_executable',
+ 'is_file',
+ 'is_dir',
+ 'is_link',
+ 'filectime',
+ 'fileatime',
+ 'filemtime',
+ 'fileinode',
+ 'filegroup',
+ 'fileowner',
+ 'filesize',
+ 'filetype',
+ 'fileperms',
+ 'ftell',
+ 'ini_get',
+ 'function_exists',
+ 'json_last_error',
+ 'json_last_error_msg',
+ ], true)) {
+ $this->functions[] = $functionName;
+ break 2;
+ }
+
+ // PhpStorm stub's #[Pure(true)] means the function has side effects but its return value is important.
+ // In PHPStan's criteria, these functions are simply considered as ['hasSideEffect' => true].
+ if (isset($attr->args[0]->value->name->name) && $attr->args[0]->value->name->name === 'true') {
+ $this->impureFunctions[] = $functionName;
+ } else {
+ $this->functions[] = $functionName;
+ }
+ break 2;
+ }
+ }
+ }
+
+ if ($node instanceof Node\Stmt\ClassMethod) {
+ $class = $node->getAttribute('parent');
+ if (!$class instanceof Node\Stmt\ClassLike) {
+ throw new ShouldNotHappenException($node->name->toString());
+ }
+ $className = $class->namespacedName->toString();
+ foreach ($node->attrGroups as $attrGroup) {
+ foreach ($attrGroup->attrs as $attr) {
+ if ($attr->name->toString() === Pure::class) {
+ $this->methods[] = sprintf('%s::%s', $className, $node->name->toString());
+ break 2;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ };
+
+ foreach ($finder as $stubFile) {
+ $path = $stubFile->getPathname();
+ $traverser = new NodeTraverser();
+ $traverser->addVisitor(new NameResolver());
+ $traverser->addVisitor(new NodeConnectingVisitor());
+ $traverser->addVisitor($visitor);
+
+ $traverser->traverse(
+ $parser->parse(FileReader::read($path)),
+ );
+ }
+
+ /** @var array $metadata */
+ $metadata = require __DIR__ . '/functionMetadata_original.php';
+ foreach ($visitor->functions as $functionName) {
+ if (array_key_exists($functionName, $metadata)) {
+ if ($metadata[$functionName]['hasSideEffects']) {
+ throw new ShouldNotHappenException($functionName);
+ }
+ }
+ $metadata[$functionName] = ['hasSideEffects' => false];
+ }
+ foreach ($visitor->impureFunctions as $functionName) {
+ if (in_array($functionName, [
+ 'class_exists',
+ 'enum_exists',
+ 'interface_exists',
+ 'trait_exists',
+ ], true)) {
+ continue;
+ }
+ if (array_key_exists($functionName, $metadata)) {
+ if (in_array($functionName, [
+ 'ob_get_contents',
+ ], true)) {
+ continue;
+ }
+ if (!$metadata[$functionName]['hasSideEffects']) {
+ throw new ShouldNotHappenException($functionName);
+ }
+ }
+ $metadata[$functionName] = ['hasSideEffects' => true];
+ }
+
+ foreach ($visitor->methods as $methodName) {
+ if (array_key_exists($methodName, $metadata)) {
+ if ($metadata[$methodName]['hasSideEffects']) {
+ throw new ShouldNotHappenException($methodName);
+ }
+ }
+ $metadata[$methodName] = ['hasSideEffects' => false];
+ }
+
+ ksort($metadata);
+
+ $template = <<<'php'
+ true as a modification to bin/functionMetadata_original.php.
+ * 3) Contribute the #[Pure] functions without side effects to https://github.com/JetBrains/phpstorm-stubs
+ * 4) Once the PR from 3) is merged, please update the package here and run ./bin/generate-function-metadata.php.
+ */
+
+return [
+%s
+];
+php;
+ $content = '';
+ foreach ($metadata as $name => $meta) {
+ $content .= sprintf(
+ "\t%s => [%s => %s],\n",
+ var_export($name, true),
+ var_export('hasSideEffects', true),
+ var_export($meta['hasSideEffects'], true),
+ );
+ }
+
+ FileWriter::write(__DIR__ . '/../resources/functionMetadata.php', sprintf($template, $content));
+})();
diff --git a/bin/generate-rule-error-classes.php b/bin/generate-rule-error-classes.php
index 116910ee86..633b1824b4 100755
--- a/bin/generate-rule-error-classes.php
+++ b/bin/generate-rule-error-classes.php
@@ -1,7 +1,9 @@
#!/usr/bin/env php
- [$interface, $propertyName, $nativePropertyType, $phpDocPropertyType]) {
- if (($typeCombination & $typeNumber) === $typeNumber) {
- $interfaces[] = '\\' . $interface;
- if ($propertyName !== null && $nativePropertyType !== null && $phpDocPropertyType !== null) {
- $properties[] = [$propertyName, $nativePropertyType, $phpDocPropertyType];
- }
+ foreach ($ruleErrorTypes as $typeNumber => [$interface, $typeProperties]) {
+ if (!(($typeCombination & $typeNumber) === $typeNumber)) {
+ continue;
}
+
+ $interfaces[] = '\\' . $interface;
+ $properties = array_merge($properties, $typeProperties);
}
$phpClass = sprintf(
$template,
$typeCombination,
implode(', ', $interfaces),
- implode("\n\n\t", array_map(function (array $property): string {
- return sprintf("%spublic %s $%s;", $property[2] !== $property[1] ? sprintf("/** @var %s */\n\t", $property[2]) : '', $property[1], $property[0]);
- }, $properties)),
- implode("\n\n\t", array_map(function (array $property): string {
- return sprintf("%spublic function get%s(): %s\n\t{\n\t\treturn \$this->%s;\n\t}", $property[2] !== $property[1] ? sprintf("/**\n\t * @return %s\n\t */\n\t", $property[2]) : '', ucfirst($property[0]), $property[1], $property[0]);
- }, $properties))
+ implode("\n\n\t", array_map(static fn (array $property): string => sprintf('%spublic %s $%s;', $property[2] !== $property[1] ? sprintf("/** @var %s */\n\t", $property[2]) : '', $property[1], $property[0]), $properties)),
+ implode("\n\n\t", array_map(static fn (array $property): string => sprintf("%spublic function get%s(): %s\n\t{\n\t\treturn \$this->%s;\n\t}", $property[2] !== $property[1] ? sprintf("/**\n\t * @return %s\n\t */\n\t", $property[2]) : '', ucfirst($property[0]), $property[1], $property[0]), $properties)),
);
file_put_contents(__DIR__ . '/../src/Rules/RuleErrors/RuleError' . $typeCombination . '.php', $phpClass);
diff --git a/bin/make-optional-parameters-required.php b/bin/make-optional-parameters-required.php
new file mode 100755
index 0000000000..5d2dd308c0
--- /dev/null
+++ b/bin/make-optional-parameters-required.php
@@ -0,0 +1,51 @@
+#!/usr/bin/env php
+createForHostVersion();
+ $traverser = new NodeTraverser(new CloningVisitor());
+ $printer = new Standard();
+ $finder = new Finder();
+ $finder->followLinks();
+
+ $removeParamDefaultTraverser = new NodeTraverser(new class () extends NodeVisitorAbstract {
+
+ public function enterNode(Node $node)
+ {
+ if (!$node instanceof Node\Param) {
+ return null;
+ }
+
+ $node->default = null;
+
+ return $node;
+ }
+
+ });
+ foreach ($finder->files()->name('*.php')->in($dir) as $fileInfo) {
+ $oldStmts = $parser->parse(file_get_contents($fileInfo->getPathname()));
+ $oldTokens = $parser->getTokens();
+
+ $newStmts = $traverser->traverse($oldStmts);
+ $newStmts = $removeParamDefaultTraverser->traverse($newStmts);
+
+ $newCode = $printer->printFormatPreserving($newStmts, $oldStmts, $oldTokens);
+ file_put_contents($fileInfo->getPathname(), $newCode);
+ }
+})();
diff --git a/bin/phpstan b/bin/phpstan
index f52278f560..119af4377c 100755
--- a/bin/phpstan
+++ b/bin/phpstan
@@ -3,24 +3,41 @@
use PHPStan\Command\AnalyseCommand;
use PHPStan\Command\ClearResultCacheCommand;
-use PHPStan\Command\DumpDependenciesCommand;
+use PHPStan\Command\DiagnoseCommand;
+use PHPStan\Command\DumpParametersCommand;
+use PHPStan\Command\FixerWorkerCommand;
use PHPStan\Command\WorkerCommand;
+use PHPStan\Internal\ComposerHelper;
+use Symfony\Component\Console\Helper\ProgressBar;
(function () {
- error_reporting(E_ALL);
+ error_reporting(E_ALL & ~E_DEPRECATED);
ini_set('display_errors', 'stderr');
- gc_disable(); // performance boost
define('__PHPSTAN_RUNNING__', true);
+ $analysisStartTime = microtime(true);
+
$devOrPharLoader = require_once __DIR__ . '/../vendor/autoload.php';
require_once __DIR__ . '/../preload.php';
+ $composer = ComposerHelper::getComposerConfig(getcwd());
+
+ if ($composer !== null) {
+ $vendorDirectory = ComposerHelper::getVendorDirFromComposerConfig(getcwd(), $composer);
+ } else {
+ $vendorDirectory = getcwd() . '/' . 'vendor';
+ }
$devOrPharLoader->unregister();
$composerAutoloadFiles = $GLOBALS['__composer_autoload_files'];
if (
!array_key_exists('e88992873b7765f9b5710cab95ba5dd7', $composerAutoloadFiles)
|| !array_key_exists('3e76f7f02b41af8cea96018933f6b7e3', $composerAutoloadFiles)
+ || !array_key_exists('a4a119a56e50fbb293281d9a48007e0e', $composerAutoloadFiles)
+ || !array_key_exists('0e6d7bf4a5811bfa5cf40c5ccd6fae6a', $composerAutoloadFiles)
+ || !array_key_exists('e69f7f6ee287b969198c3c9d6777bd38', $composerAutoloadFiles)
+ || !array_key_exists('8825ede83f2f289127722d4e842cf7e8', $composerAutoloadFiles)
+ || !array_key_exists('23c18046f52bef3eea034657bafda50f', $composerAutoloadFiles)
) {
echo "Composer autoloader changed\n";
exit(1);
@@ -31,63 +48,110 @@ use PHPStan\Command\WorkerCommand;
// fix unprefixed Hoa namespace - files already loaded
'e88992873b7765f9b5710cab95ba5dd7' => true,
'3e76f7f02b41af8cea96018933f6b7e3' => true,
+
+ // vendor/symfony/polyfill-php80/bootstrap.php
+ 'a4a119a56e50fbb293281d9a48007e0e' => true,
+
+ // vendor/symfony/polyfill-mbstring/bootstrap.php
+ '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => true,
+
+ // vendor/symfony/polyfill-intl-normalizer/bootstrap.php
+ 'e69f7f6ee287b969198c3c9d6777bd38' => true,
+
+ // vendor/symfony/polyfill-intl-grapheme/bootstrap.php
+ '8825ede83f2f289127722d4e842cf7e8' => true,
+
+ // vendor/symfony/polyfill-php81/bootstrap.php
+ '23c18046f52bef3eea034657bafda50f' => true,
];
- $autoloaderInWorkingDirectory = getcwd() . '/vendor/autoload.php';
+ $autoloaderInWorkingDirectory = $vendorDirectory . '/autoload.php';
$composerAutoloaderProjectPaths = [];
- if (is_file($autoloaderInWorkingDirectory)) {
+
+ /** @var array|false $autoloadFunctionsBefore */
+ $autoloadFunctionsBefore = spl_autoload_functions();
+
+ if (@is_file($autoloaderInWorkingDirectory)) {
$composerAutoloaderProjectPaths[] = dirname($autoloaderInWorkingDirectory, 2);
require_once $autoloaderInWorkingDirectory;
}
- $autoloadProjectAutoloaderFile = function (string $file) use (&$composerAutoloaderProjectPaths): void {
- $path = dirname(__DIR__) . $file;
- if (!extension_loaded('phar')) {
- if (is_file($path)) {
+ $path = dirname(__DIR__, 3) . '/autoload.php';
+ if (!extension_loaded('phar')) {
+ if (@is_file($path)) {
+ $composerAutoloaderProjectPaths[] = dirname($path, 2);
+
+ require_once $path;
+ }
+ } else {
+ $pharPath = \Phar::running(false);
+ if ($pharPath === '') {
+ if (@is_file($path)) {
$composerAutoloaderProjectPaths[] = dirname($path, 2);
require_once $path;
}
} else {
- $pharPath = \Phar::running(false);
- if ($pharPath === '') {
- if (is_file($path)) {
- $composerAutoloaderProjectPaths[] = dirname($path, 2);
+ $path = dirname($pharPath, 3) . '/autoload.php';
+ if (@is_file($path)) {
+ $composerAutoloaderProjectPaths[] = dirname($path, 2);
- require_once $path;
- }
- } else {
- $path = dirname($pharPath) . $file;
- if (is_file($path)) {
- $composerAutoloaderProjectPaths[] = dirname($path, 2);
+ require_once $path;
+ }
+ }
+ }
- require_once $path;
+ /** @var array|false $autoloadFunctionsAfter */
+ $autoloadFunctionsAfter = spl_autoload_functions();
+
+ if ($autoloadFunctionsBefore !== false && $autoloadFunctionsAfter !== false) {
+ $newAutoloadFunctions = [];
+ foreach ($autoloadFunctionsAfter as $after) {
+ if (
+ is_array($after)
+ && count($after) > 0
+ ) {
+ if (is_object($after[0])
+ && get_class($after[0]) === \Composer\Autoload\ClassLoader::class
+ ) {
+ continue;
+ }
+ if ($after[0] === 'PHPStan\\PharAutoloader') {
+ continue;
+ }
+ }
+ foreach ($autoloadFunctionsBefore as $before) {
+ if ($after === $before) {
+ continue 2;
}
}
+
+ $newAutoloadFunctions[] = $after;
}
- };
- $autoloadProjectAutoloaderFile('/../../autoload.php');
+ $GLOBALS['__phpstanAutoloadFunctions'] = $newAutoloadFunctions;
+ }
$devOrPharLoader->register(true);
- $version = 'Version unknown';
- try {
- $version = \Jean85\PrettyVersions::getVersion('phpstan/phpstan')->getPrettyVersion();
- } catch (\OutOfBoundsException $e) {
-
- }
-
$application = new \Symfony\Component\Console\Application(
'PHPStan - PHP Static Analysis Tool',
- $version
+ ComposerHelper::getPhpStanVersion()
);
+ $application->setDefaultCommand('analyse');
+ ProgressBar::setFormatDefinition('file_download', ' [%bar%] %percent:3s%% %fileSize%');
+
+ $composerAutoloaderProjectPaths = array_map(function(string $s): string {
+ return str_replace(DIRECTORY_SEPARATOR, '/', $s);
+ }, $composerAutoloaderProjectPaths);
+ $reversedComposerAutoloaderProjectPaths = array_values(array_unique(array_reverse($composerAutoloaderProjectPaths)));
- $reversedComposerAutoloaderProjectPaths = array_reverse($composerAutoloaderProjectPaths);
- $application->add(new AnalyseCommand($reversedComposerAutoloaderProjectPaths));
- $application->add(new DumpDependenciesCommand($reversedComposerAutoloaderProjectPaths));
+ $application->add(new AnalyseCommand($reversedComposerAutoloaderProjectPaths, $analysisStartTime));
$application->add(new WorkerCommand($reversedComposerAutoloaderProjectPaths));
$application->add(new ClearResultCacheCommand($reversedComposerAutoloaderProjectPaths));
+ $application->add(new FixerWorkerCommand($reversedComposerAutoloaderProjectPaths));
+ $application->add(new DumpParametersCommand($reversedComposerAutoloaderProjectPaths));
+ $application->add(new DiagnoseCommand($reversedComposerAutoloaderProjectPaths));
$application->run();
})();
diff --git a/bin/transform-source.php b/bin/transform-source.php
deleted file mode 100755
index 8ecbefb023..0000000000
--- a/bin/transform-source.php
+++ /dev/null
@@ -1,122 +0,0 @@
-#!/usr/bin/env php
-type === null) {
- return null;
- }
- $docComment = $node->getDocComment();
- if ($docComment !== null) {
- $node->type = null;
- return $node;
- }
-
- $node->setDocComment(new \PhpParser\Comment\Doc(sprintf('/** @var %s */', $this->printType($node->type))));
- $node->type = null;
-
- return $node;
- }
-
- /**
- * @param Identifier|Name|NullableType|UnionType $type
- * @return string
- */
- private function printType($type): string
- {
- if ($type instanceof NullableType) {
- return $this->printType($type->type) . '|null';
- }
-
- if ($type instanceof UnionType) {
- throw new \Exception('UnionType not yet supported');
- }
-
- if ($type instanceof Name) {
- $name = $type->toString();
- if ($type->isFullyQualified()) {
- return '\\' . $name;
- }
-
- return $name;
- }
-
- if ($type instanceof Identifier) {
- return $type->name;
- }
-
- throw new \Exception('Unsupported type class');
- }
-
-}
-
-(function () {
- $dir = __DIR__ . '/../src';
-
- $lexer = new Lexer\Emulative([
- 'usedAttributes' => [
- 'comments',
- 'startLine', 'endLine',
- 'startTokenPos', 'endTokenPos',
- ],
- ]);
- $parser = new Parser\Php7($lexer, [
- 'useIdentifierNodes' => true,
- 'useConsistentVariableNodes' => true,
- 'useExpressionStatements' => true,
- 'useNopStatements' => false,
- ]);
- $nameResolver = new NodeVisitor\NameResolver(null, [
- 'replaceNodes' => false
- ]);
-
- $printer = new PrettyPrinter\Standard();
-
- $traverser = new NodeTraverser();
- $traverser->addVisitor(new NodeVisitor\CloningVisitor());
- $traverser->addVisitor($nameResolver);
- $traverser->addVisitor(new PhpPatcher($printer));
-
- $it = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($dir),
- RecursiveIteratorIterator::LEAVES_ONLY
- );
- foreach ($it as $file) {
- $fileName = $file->getPathname();
- if (!preg_match('/\.php$/', $fileName)) {
- continue;
- }
-
- $code = \PHPStan\File\FileReader::read($fileName);
- $origStmts = $parser->parse($code);
- $newCode = $printer->printFormatPreserving(
- $traverser->traverse($origStmts),
- $origStmts,
- $lexer->getTokens()
- );
-
- \PHPStan\File\FileWriter::write($fileName, $newCode);
- }
-})();
diff --git a/build-cs/.gitignore b/build-cs/.gitignore
index ff72e2d08c..61ead86667 100644
--- a/build-cs/.gitignore
+++ b/build-cs/.gitignore
@@ -1,2 +1 @@
-/composer.lock
/vendor
diff --git a/build-cs/composer.json b/build-cs/composer.json
index c2128290d3..16a240bc97 100644
--- a/build-cs/composer.json
+++ b/build-cs/composer.json
@@ -1,8 +1,13 @@
{
"require-dev": {
- "consistence/coding-standard": "^3.10",
- "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2",
- "slevomat/coding-standard": "^6.3.0",
+ "consistence-community/coding-standard": "^3.11.0",
+ "dealerdirect/phpcodesniffer-composer-installer": "^1.0.0",
+ "slevomat/coding-standard": "^8.8.0",
"squizlabs/php_codesniffer": "^3.5.3"
+ },
+ "config": {
+ "allow-plugins": {
+ "dealerdirect/phpcodesniffer-composer-installer": true
+ }
}
}
diff --git a/build-cs/composer.lock b/build-cs/composer.lock
new file mode 100644
index 0000000000..e0bfbd4cae
--- /dev/null
+++ b/build-cs/composer.lock
@@ -0,0 +1,333 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "e69c1916405a7e3c8001c1b609a0ee61",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "consistence-community/coding-standard",
+ "version": "3.11.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/consistence-community/coding-standard.git",
+ "reference": "f38e06327d5bf80ff5ff523a2c05e623b5e8d8b1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/consistence-community/coding-standard/zipball/f38e06327d5bf80ff5ff523a2c05e623b5e8d8b1",
+ "reference": "f38e06327d5bf80ff5ff523a2c05e623b5e8d8b1",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~8.0",
+ "slevomat/coding-standard": "~8.0",
+ "squizlabs/php_codesniffer": "~3.7.0"
+ },
+ "replace": {
+ "consistence/coding-standard": "3.10.*"
+ },
+ "require-dev": {
+ "phing/phing": "2.17.0",
+ "php-parallel-lint/php-parallel-lint": "1.3.1",
+ "phpunit/phpunit": "9.5.10"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Consistence\\": [
+ "Consistence"
+ ]
+ },
+ "classmap": [
+ "Consistence"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Vašek Purchart",
+ "email": "me@vasekpurchart.cz",
+ "homepage": "http://vasekpurchart.cz/"
+ }
+ ],
+ "description": "Consistence - Coding Standard - PHP Code Sniffer rules",
+ "keywords": [
+ "Coding Standard",
+ "PHPCodeSniffer",
+ "codesniffer",
+ "coding",
+ "cs",
+ "phpcs",
+ "ruleset",
+ "sniffer",
+ "standard"
+ ],
+ "support": {
+ "issues": "https://github.com/consistence-community/coding-standard/issues",
+ "source": "https://github.com/consistence-community/coding-standard/tree/3.11.3"
+ },
+ "time": "2023-03-27T14:55:41+00:00"
+ },
+ {
+ "name": "dealerdirect/phpcodesniffer-composer-installer",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCSStandards/composer-installer.git",
+ "reference": "4be43904336affa5c2f70744a348312336afd0da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da",
+ "reference": "4be43904336affa5c2f70744a348312336afd0da",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.4",
+ "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
+ },
+ "require-dev": {
+ "composer/composer": "*",
+ "ext-json": "*",
+ "ext-zip": "*",
+ "php-parallel-lint/php-parallel-lint": "^1.3.1",
+ "phpcompatibility/php-compatibility": "^9.0",
+ "yoast/phpunit-polyfills": "^1.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Franck Nijhof",
+ "email": "franck.nijhof@dealerdirect.com",
+ "homepage": "http://www.frenck.nl/",
+ "role": "Developer / IT Manager"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors"
+ }
+ ],
+ "description": "PHP_CodeSniffer Standards Composer Installer Plugin",
+ "homepage": "http://www.dealerdirect.com/",
+ "keywords": [
+ "PHPCodeSniffer",
+ "PHP_CodeSniffer",
+ "code quality",
+ "codesniffer",
+ "composer",
+ "installer",
+ "phpcbf",
+ "phpcs",
+ "plugin",
+ "qa",
+ "quality",
+ "standard",
+ "standards",
+ "style guide",
+ "stylecheck",
+ "tests"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPCSStandards/composer-installer/issues",
+ "source": "https://github.com/PHPCSStandards/composer-installer"
+ },
+ "time": "2023-01-05T11:28:13+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "1.24.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "bcad8d995980440892759db0c32acae7c8e79442"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442",
+ "reference": "bcad8d995980440892759db0c32acae7c8e79442",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^4.15",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^1.5",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2"
+ },
+ "time": "2023-09-26T12:28:12+00:00"
+ },
+ {
+ "name": "slevomat/coding-standard",
+ "version": "8.14.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/slevomat/coding-standard.git",
+ "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/fea1fd6f137cc84f9cba0ae30d549615dbc6a926",
+ "reference": "fea1fd6f137cc84f9cba0ae30d549615dbc6a926",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0",
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpdoc-parser": "^1.23.1",
+ "squizlabs/php_codesniffer": "^3.7.1"
+ },
+ "require-dev": {
+ "phing/phing": "2.17.4",
+ "php-parallel-lint/php-parallel-lint": "1.3.2",
+ "phpstan/phpstan": "1.10.37",
+ "phpstan/phpstan-deprecation-rules": "1.1.4",
+ "phpstan/phpstan-phpunit": "1.3.14",
+ "phpstan/phpstan-strict-rules": "1.5.1",
+ "phpunit/phpunit": "8.5.21|9.6.8|10.3.5"
+ },
+ "type": "phpcodesniffer-standard",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SlevomatCodingStandard\\": "SlevomatCodingStandard/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.",
+ "keywords": [
+ "dev",
+ "phpcs"
+ ],
+ "support": {
+ "issues": "https://github.com/slevomat/coding-standard/issues",
+ "source": "https://github.com/slevomat/coding-standard/tree/8.14.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/kukulich",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-08T07:28:08+00:00"
+ },
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "3.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879",
+ "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "bin": [
+ "bin/phpcs",
+ "bin/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "lead"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "keywords": [
+ "phpcs",
+ "standards",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues",
+ "source": "https://github.com/squizlabs/PHP_CodeSniffer",
+ "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki"
+ },
+ "time": "2023-02-22T23:07:41+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/build.xml b/build.xml
deleted file mode 100644
index 3fd9b25d4a..0000000000
--- a/build.xml
+++ /dev/null
@@ -1,527 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php b/build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php
new file mode 100644
index 0000000000..8e43bd2d47
--- /dev/null
+++ b/build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php
@@ -0,0 +1,62 @@
+getName(), [
+ 'getByType',
+ ], true);
+ }
+
+ public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type
+ {
+ if (count($methodCall->getArgs()) === 0) {
+ return ParametersAcceptorSelector::selectFromArgs(
+ $scope,
+ $methodCall->getArgs(),
+ $methodReflection->getVariants(),
+ )->getReturnType();
+ }
+ $argType = $scope->getType($methodCall->getArgs()[0]->value);
+ if (!$argType instanceof ConstantStringType) {
+ return ParametersAcceptorSelector::selectFromArgs(
+ $scope,
+ $methodCall->getArgs(),
+ $methodReflection->getVariants(),
+ )->getReturnType();
+ }
+
+ $type = new ObjectType($argType->getValue());
+ if ($methodReflection->getName() === 'getByType' && count($methodCall->getArgs()) >= 2) {
+ $argType = $scope->getType($methodCall->getArgs()[1]->value);
+ if ($argType->isTrue()->yes()) {
+ $type = TypeCombinator::addNull($type);
+ }
+ }
+
+ return $type;
+ }
+
+}
diff --git a/build/PHPStan/Build/FinalClassRule.php b/build/PHPStan/Build/FinalClassRule.php
new file mode 100644
index 0000000000..018e1da4f8
--- /dev/null
+++ b/build/PHPStan/Build/FinalClassRule.php
@@ -0,0 +1,74 @@
+
+ */
+final class FinalClassRule implements Rule
+{
+
+ public function __construct(private FileHelper $fileHelper)
+ {
+ }
+
+ public function getNodeType(): string
+ {
+ return InClassNode::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ $classReflection = $node->getClassReflection();
+ if (!$classReflection->isClass()) {
+ return [];
+ }
+ if ($classReflection->isAbstract()) {
+ return [];
+ }
+ if ($classReflection->isFinal()) {
+ return [];
+ }
+ if ($classReflection->is(Type::class)) {
+ return [];
+ }
+
+ // exceptions
+ if (in_array($classReflection->getName(), [
+ FunctionVariant::class,
+ ExtendedFunctionVariant::class,
+ DummyParameter::class,
+ PhpFunctionFromParserNodeReflection::class,
+ ], true)) {
+ return [];
+ }
+
+ if (str_starts_with($this->fileHelper->normalizePath($scope->getFile()), $this->fileHelper->normalizePath(dirname(__DIR__, 3) . '/tests'))) {
+ return [];
+ }
+
+ return [
+ RuleErrorBuilder::message(
+ sprintf('Class %s must be abstract or final.', $classReflection->getDisplayName()),
+ )
+ ->identifier('phpstan.finalClass')
+ ->build(),
+ ];
+ }
+
+}
diff --git a/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php b/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php
index 8ad0e108c1..22812240f4 100644
--- a/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php
+++ b/build/PHPStan/Build/ServiceLocatorDynamicReturnTypeExtension.php
@@ -6,13 +6,10 @@
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
-use PHPStan\Type\Constant\ConstantBooleanType;
-use PHPStan\Type\Constant\ConstantStringType;
-use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
-class ServiceLocatorDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension
+final class ServiceLocatorDynamicReturnTypeExtension implements \PHPStan\Type\DynamicMethodReturnTypeExtension
{
public function getClass(): string
@@ -30,23 +27,24 @@ public function isMethodSupported(MethodReflection $methodReflection): bool
public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type
{
- if (count($methodCall->args) === 0) {
- return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
- }
- $argType = $scope->getType($methodCall->args[0]->value);
- if (!$argType instanceof ConstantStringType) {
- return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType();
+ if (count($methodCall->getArgs()) === 0) {
+ return ParametersAcceptorSelector::selectFromArgs($scope, $methodCall->getArgs(), $methodReflection->getVariants())->getReturnType();
}
- $type = new ObjectType($argType->getValue());
- if ($methodReflection->getName() === 'getByType' && count($methodCall->args) >= 2) {
- $argType = $scope->getType($methodCall->args[1]->value);
- if ($argType instanceof ConstantBooleanType && $argType->getValue()) {
- $type = TypeCombinator::addNull($type);
+ $returnType = ParametersAcceptorSelector::selectFromArgs($scope, $methodCall->getArgs(), $methodReflection->getVariants())->getReturnType();
+
+ if ($methodReflection->getName() === 'getByType') {
+ if (count($methodCall->getArgs()) < 2) {
+ $returnType = TypeCombinator::removeNull($returnType);
+ } else {
+ $argType = $scope->getType($methodCall->getArgs()[1]->value);
+ if ($argType->isTrue()->yes()) {
+ $returnType = TypeCombinator::removeNull($returnType);
+ }
}
}
- return $type;
+ return $returnType;
}
}
diff --git a/build/baseline-32bit.neon b/build/baseline-32bit.neon
new file mode 100644
index 0000000000..82adbae209
--- /dev/null
+++ b/build/baseline-32bit.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Parameter \\#1 \\$value of class PHPStan\\\\Type\\\\Constant\\\\ConstantIntegerType constructor expects int, float given\\.$#"
+ count: 2
+ path: ../src/Analyser/MutatingScope.php
diff --git a/build/baseline-7.3.neon b/build/baseline-7.3.neon
new file mode 100644
index 0000000000..0e3557e728
--- /dev/null
+++ b/build/baseline-7.3.neon
@@ -0,0 +1,14 @@
+parameters:
+ ignoreErrors:
+ -
+ message:
+ """
+ #^Call to deprecated method assertFileNotExists\\(\\) of class PHPUnit\\\\Framework\\\\Assert\\:
+ https\\://github\\.com/sebastianbergmann/phpunit/issues/4077$#
+ """
+ count: 1
+ path: ../src/Testing/LevelsTestCase.php
+ -
+ message: "#^Call to function method_exists\\(\\) with 'PHPUnit\\\\\\\\Framework\\\\\\\\TestCase' and 'assertFileDoesNotEx…' will always evaluate to true\\.$#"
+ count: 1
+ path: ../src/Testing/LevelsTestCase.php
diff --git a/build/baseline-7.4.neon b/build/baseline-7.4.neon
new file mode 100644
index 0000000000..82e6b89e0c
--- /dev/null
+++ b/build/baseline-7.4.neon
@@ -0,0 +1,83 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Class PHPStan\\\\Command\\\\ErrorsConsoleStyle has an uninitialized property \\$progressBar\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Command/ErrorsConsoleStyle.php
+
+ -
+ message: "#^Class PHPStan\\\\Parallel\\\\ParallelAnalyser has an uninitialized property \\$processPool\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Parallel/ParallelAnalyser.php
+
+ -
+ message: "#^Class PHPStan\\\\Parallel\\\\Process has an uninitialized property \\$process\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Parallel/Process.php
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$phpDocNodes\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$phpDocNode\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$phpDocString\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$filename\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$templateTypeMap\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$templateTags\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$phpDocNodeResolver\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\PhpDoc\\\\ResolvedPhpDocBlock has an uninitialized property \\$reflectionProvider\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/PhpDoc/ResolvedPhpDocBlock.php
+
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$fileName\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$contents\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$classNodes\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$functionNodes\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\BetterReflection\\\\SourceLocator\\\\CachingVisitor has an uninitialized property \\$constantNodes\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/CachingVisitor.php
+ -
+ message: "#^Class PHPStan\\\\Reflection\\\\ReflectionProvider\\\\SetterReflectionProviderProvider has an uninitialized property \\$reflectionProvider\\. Give it default value or assign it in the constructor\\.$#"
+ count: 1
+ path: ../src/Reflection/ReflectionProvider/SetterReflectionProviderProvider.php
diff --git a/build/baseline-8.0.neon b/build/baseline-8.0.neon
new file mode 100644
index 0000000000..95dfa6cf8a
--- /dev/null
+++ b/build/baseline-8.0.neon
@@ -0,0 +1,36 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Strict comparison using \\=\\=\\= between list and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between list\\ and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/MbFunctionsReturnTypeExtension.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between int<0, max> and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/MbStrlenFunctionReturnTypeExtension.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between list\\ and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/MbStrlenFunctionReturnTypeExtension.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between list\\ and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/StrSplitFunctionReturnTypeExtension.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between list and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/StrSplitFunctionReturnTypeExtension.php
+
+ -
+ message: "#^Call to function is_bool\\(\\) with string will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/SubstrDynamicReturnTypeExtension.php
diff --git a/build/baseline-8.1.neon b/build/baseline-8.1.neon
new file mode 100644
index 0000000000..aab4991158
--- /dev/null
+++ b/build/baseline-8.1.neon
@@ -0,0 +1,2 @@
+parameters:
+ ignoreErrors: []
diff --git a/build/collision-detector.json b/build/collision-detector.json
new file mode 100644
index 0000000000..a687cd3ea4
--- /dev/null
+++ b/build/collision-detector.json
@@ -0,0 +1,20 @@
+{
+ "scanPaths": ["../src", "../build", "../tests"],
+ "excludePaths": [
+ "../tests/PHPStan/Analyser/data/parse-error.php",
+ "../tests/PHPStan/Analyser/data/multipleParseErrors.php",
+ "../tests/PHPStan/Parser/data/cleaning-1-before.php",
+ "../tests/PHPStan/Parser/data/cleaning-1-after.php",
+ "../tests/PHPStan/Parser/data/cleaning-property-hooks-before.php",
+ "../tests/PHPStan/Parser/data/cleaning-property-hooks-after.php",
+ "../tests/PHPStan/Rules/Functions/data/duplicate-function.php",
+ "../tests/PHPStan/Rules/Classes/data/duplicate-class.php",
+ "../tests/PHPStan/Rules/Names/data/multiple-namespaces.php",
+ "../tests/PHPStan/Rules/Names/data/no-namespace.php",
+ "../tests/notAutoloaded",
+ "../tests/PHPStan/Rules/Functions/data/define-bug-3349.php",
+ "../tests/PHPStan/Levels/data/stubs/function.php",
+ "../tests/PHPStan/Rules/Properties/data/abstract-final-property-hook-parse-error.php",
+ "../tests/PHPStan/Rules/Properties/data/final-property-hooks.php"
+ ]
+}
diff --git a/build/composer-dependency-analyser.php b/build/composer-dependency-analyser.php
new file mode 100644
index 0000000000..79dc694253
--- /dev/null
+++ b/build/composer-dependency-analyser.php
@@ -0,0 +1,38 @@
+addPathToScan(__DIR__ . '/../bin', true)
+ ->ignoreErrorsOnPackages(
+ [
+ ...$pinnedToSupportPhp72, // those are unused, but we need to pin them to support PHP 7.2
+ ...$polyfills, // not detected by composer-dependency-analyser
+ ],
+ [ErrorType::UNUSED_DEPENDENCY],
+ )
+ ->ignoreErrorsOnPackage('phpunit/phpunit', [ErrorType::DEV_DEPENDENCY_IN_PROD]) // prepared test tooling
+ ->ignoreErrorsOnPackage('jetbrains/phpstorm-stubs', [ErrorType::PROD_DEPENDENCY_ONLY_IN_DEV]) // there is no direct usage, but we need newer version then required by ondrejmirtes/BetterReflection
+ ->ignoreErrorsOnPath(__DIR__ . '/../tests', [ErrorType::UNKNOWN_CLASS, ErrorType::UNKNOWN_FUNCTION, ErrorType::SHADOW_DEPENDENCY]) // to be able to test invalid symbols
+ ->ignoreUnknownClasses([
+ 'JetBrains\PhpStorm\Pure', // not present on composer's classmap
+ 'PHPStan\ExtensionInstaller\GeneratedConfig', // generated
+ ]);
diff --git a/build/composer-require-checker.json b/build/composer-require-checker.json
deleted file mode 100644
index 0cd3079214..0000000000
--- a/build/composer-require-checker.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "symbol-whitelist" : [
- "null", "true", "false",
- "static", "self", "parent",
- "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object",
- "PHPUnit\\Framework\\TestCase", "PHPUnit\\Framework\\AssertionFailedError", "Composer\\Autoload\\ClassLoader",
- "JSON_THROW_ON_ERROR", "JsonSerializable", "SimpleXMLElement", "PHPStan\\ExtensionInstaller\\GeneratedConfig", "Nette\\DI\\InvalidConfigurationException",
- "FILTER_SANITIZE_EMAIL", "FILTER_SANITIZE_EMAIL", "FILTER_SANITIZE_ENCODED", "FILTER_SANITIZE_MAGIC_QUOTES", "FILTER_SANITIZE_NUMBER_FLOAT",
- "FILTER_SANITIZE_NUMBER_INT", "FILTER_SANITIZE_SPECIAL_CHARS", "FILTER_SANITIZE_STRING", "FILTER_SANITIZE_URL", "FILTER_VALIDATE_BOOLEAN",
- "FILTER_VALIDATE_EMAIL", "FILTER_VALIDATE_FLOAT", "FILTER_VALIDATE_INT", "FILTER_VALIDATE_IP", "FILTER_VALIDATE_MAC", "FILTER_VALIDATE_REGEXP",
- "FILTER_VALIDATE_URL", "FILTER_NULL_ON_FAILURE", "FILTER_FORCE_ARRAY", "FILTER_SANITIZE_ADD_SLASHES", "FILTER_DEFAULT", "FILTER_UNSAFE_RAW", "opcache_invalidate"
- ],
- "php-core-extensions" : [
- "Core",
- "date",
- "pcre",
- "Phar",
- "Reflection",
- "SPL",
- "standard",
- "pcntl",
- "mbstring",
- "hash",
- "tokenizer"
- ]
-}
diff --git a/build/datetime-php-83.neon b/build/datetime-php-83.neon
new file mode 100644
index 0000000000..953379bf4f
--- /dev/null
+++ b/build/datetime-php-83.neon
@@ -0,0 +1,11 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^If condition is always false\\.$#"
+ count: 1
+ path: ../src/Type/Php/DateTimeModifyReturnTypeExtension.php
+
+ -
+ message: "#^Strict comparison using \\=\\=\\= between DateTime and false will always evaluate to false\\.$#"
+ count: 1
+ path: ../src/Type/Php/DateTimeModifyReturnTypeExtension.php
diff --git a/build/deprecated-8.4.neon b/build/deprecated-8.4.neon
new file mode 100644
index 0000000000..6b3bd6db5e
--- /dev/null
+++ b/build/deprecated-8.4.neon
@@ -0,0 +1,7 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Use of constant E_STRICT is deprecated\.$#'
+ identifier: constant.deprecated
+ count: 1
+ path: ../src/Analyser/FileAnalyser.php
diff --git a/build/downgrade.php b/build/downgrade.php
new file mode 100644
index 0000000000..7c117d13f5
--- /dev/null
+++ b/build/downgrade.php
@@ -0,0 +1,20 @@
+ [
+ __DIR__ . '/../build/PHPStan',
+ __DIR__ . '/../src',
+ __DIR__ . '/../tests/PHPStan',
+ __DIR__ . '/../tests/e2e',
+ ],
+ 'excludePaths' => [
+ 'tests/*/data/*',
+ 'tests/*/Fixture/*',
+ 'tests/PHPStan/Analyser/traits/*',
+ 'tests/PHPStan/Analyser/nsrt/*',
+ 'tests/PHPStan/Generics/functions.php',
+ 'tests/e2e/resultCache_1.php',
+ 'tests/e2e/resultCache_2.php',
+ 'tests/e2e/resultCache_3.php',
+ ],
+];
diff --git a/build/enums.neon b/build/enums.neon
new file mode 100644
index 0000000000..44eaccbbd1
--- /dev/null
+++ b/build/enums.neon
@@ -0,0 +1,19 @@
+parameters:
+ excludePaths:
+ - ../tests/PHPStan/Fixture/TestEnum.php
+ - ../tests/PHPStan/Fixture/AnotherTestEnum.php
+ - ../tests/PHPStan/Fixture/ManyCasesTestEnum.php
+
+ ignoreErrors:
+ -
+ message: '#^Access to constant ONE on an unknown class EnumTypeAssertions\\Foo\.$#'
+ path: ../tests/PHPStan/Analyser/NodeScopeResolverTest.php
+ -
+ message: '#^Class ObjectTypeEnums\\FooEnum not found\.$#'
+ paths:
+ - ../tests/PHPStan/Type/ObjectTypeTest.php
+ - ../tests/PHPStan/Type/IntersectionTypeTest.php
+ -
+ message: '#^Class CustomDeprecations\\MyDeprecatedEnum not found\.$#'
+ paths:
+ - ../tests/PHPStan/Reflection/Deprecation/DeprecationProviderTest.php
diff --git a/build/even-more-enum-adapter-errors.neon b/build/even-more-enum-adapter-errors.neon
new file mode 100644
index 0000000000..364905f714
--- /dev/null
+++ b/build/even-more-enum-adapter-errors.neon
@@ -0,0 +1,2 @@
+parameters:
+ ignoreErrors:
diff --git a/build/ignore-by-architecture.neon.php b/build/ignore-by-architecture.neon.php
new file mode 100644
index 0000000000..a6c86b46cf
--- /dev/null
+++ b/build/ignore-by-architecture.neon.php
@@ -0,0 +1,11 @@
+load(__DIR__ . '/baseline-32bit.neon');
+}
+
+return [];
diff --git a/build/ignore-by-php-version.neon.php b/build/ignore-by-php-version.neon.php
new file mode 100644
index 0000000000..c250ea9eec
--- /dev/null
+++ b/build/ignore-by-php-version.neon.php
@@ -0,0 +1,42 @@
+= 80000) {
+ $includes[] = __DIR__ . '/baseline-8.0.neon';
+}
+if (PHP_VERSION_ID >= 80100) {
+ $includes[] = __DIR__ . '/baseline-8.1.neon';
+} else {
+ $includes[] = __DIR__ . '/enums.neon';
+ $includes[] = __DIR__ . '/readonly-property.neon';
+}
+
+if (PHP_VERSION_ID >= 70400) {
+ $includes[] = __DIR__ . '/ignore-gte-php7.4-errors.neon';
+}
+
+if (PHP_VERSION_ID < 80000) {
+ $includes[] = __DIR__ . '/more-enum-adapter-errors.neon';
+}
+
+if (PHP_VERSION_ID < 80000) {
+ $includes[] = __DIR__ . '/spl-autoload-functions-pre-php-7.neon';
+} else {
+ $includes[] = __DIR__ . '/spl-autoload-functions-php-8.neon';
+}
+
+if (PHP_VERSION_ID >= 80300) {
+ $includes[] = __DIR__ . '/datetime-php-83.neon';
+}
+
+if (PHP_VERSION_ID >= 80400) {
+ $includes[] = __DIR__ . '/deprecated-8.4.neon';
+}
+
+$config = [];
+$config['includes'] = $includes;
+
+// overrides config.platform.php in composer.json
+$config['parameters']['phpVersion'] = PHP_VERSION_ID;
+
+return $config;
diff --git a/build/ignore-gte-php7.4-errors.neon b/build/ignore-gte-php7.4-errors.neon
index 3dae92de53..d5ae8bada3 100644
--- a/build/ignore-gte-php7.4-errors.neon
+++ b/build/ignore-gte-php7.4-errors.neon
@@ -1,5 +1,10 @@
+includes:
+ - baseline-7.4.neon
+
parameters:
ignoreErrors:
+ - '#^Class PHPStan\\Rules\\RuleErrors\\RuleError(?:\d+) has an uninitialized property (?:\$message|\$line|\$identifier|\$tip|\$file|\$metadata)#'
+ - '#Extension has an uninitialized property (?:\$typeSpecifier|\$broker)#'
-
- message: "#^Call to function method_exists\\(\\) with ReflectionProperty and '(?:hasType|getType)' will always evaluate to true\\.$#"
- path: ../src/Reflection/Php/PhpClassReflectionExtension.php
+ message: '#has an uninitialized property#'
+ path: ../tests
diff --git a/build/ignore-hoa.neon b/build/ignore-hoa.neon
deleted file mode 100644
index 6accc42618..0000000000
--- a/build/ignore-hoa.neon
+++ /dev/null
@@ -1,3 +0,0 @@
-parameters:
- excludes_analyse:
- - ../tests/PHPStan/Command/IgnoredRegexValidatorTest.php
diff --git a/build/ignore-windows-runtime.neon b/build/ignore-windows-runtime.neon
deleted file mode 100644
index 69479d766a..0000000000
--- a/build/ignore-windows-runtime.neon
+++ /dev/null
@@ -1,5 +0,0 @@
-parameters:
- ignoreErrors:
- - '#^Function pcntl_async_signals not found\.$#'
- - '#^Function pcntl_signal not found\.$#'
- - '#^Constant SIGINT not found\.$#'
diff --git a/build/key.gpg.enc b/build/key.gpg.enc
deleted file mode 100644
index 754af04785..0000000000
Binary files a/build/key.gpg.enc and /dev/null differ
diff --git a/build/more-enum-adapter-errors.neon b/build/more-enum-adapter-errors.neon
new file mode 100644
index 0000000000..4e7e2ee083
--- /dev/null
+++ b/build/more-enum-adapter-errors.neon
@@ -0,0 +1,24 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Strict comparison using \\!\\=\\= between class\\-string and 'UnitEnum' will always evaluate to true\\.$#"
+ count: 1
+ path: ../src/Reflection/Php/PhpClassReflectionExtension.php
+
+ -
+ message: "#^Access to property \\$name on an unknown class UnitEnum\\.$#"
+ count: 1
+ path: ../src/Type/ConstantTypeHelper.php
+
+ -
+ message: "#^PHPDoc tag @var for variable \\$value contains unknown class UnitEnum\\.$#"
+ count: 1
+ path: ../src/Type/ConstantTypeHelper.php
+
+ -
+ message: "#^Class BackedEnum not found\\.$#"
+ count: 1
+ path: ../src/Type/Php/BackedEnumFromMethodDynamicReturnTypeExtension.php
+
+ -
+ message: "#^Call to method PHPStan\\\\Reflection\\\\ClassReflection::isEnum\\(\\) will always evaluate to false\\.$#"
diff --git a/build/phpstan.neon b/build/phpstan.neon
index 90fc22eb59..b285f56e12 100644
--- a/build/phpstan.neon
+++ b/build/phpstan.neon
@@ -1,22 +1,72 @@
includes:
- ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
- - ../vendor/phpstan/phpstan-php-parser/extension.neon
+ - ../vendor/phpstan/phpstan-nette/rules.neon
- ../vendor/phpstan/phpstan-phpunit/extension.neon
- ../vendor/phpstan/phpstan-phpunit/rules.neon
- ../vendor/phpstan/phpstan-strict-rules/rules.neon
- ../conf/bleedingEdge.neon
- ../phpstan-baseline.neon
+ - ../phpstan-baseline.php
+ - ignore-by-php-version.neon.php
+ - ignore-by-architecture.neon.php
+
parameters:
+ level: 8
+ paths:
+ - PHPStan
+ - ../src
+ - ../tests
bootstrapFiles:
- - %rootDir%/tests/phpstan-bootstrap.php
- excludes_analyse:
- - %rootDir%/src/Reflection/SignatureMap/functionMap.php
- - %rootDir%/src/Reflection/SignatureMap/functionMetadata.php
- - %rootDir%/tests/*/data/*
- - %rootDir%/tests/tmp/*
- - %rootDir%/tests/PHPStan/Analyser/traits/*
- - %rootDir%/tests/notAutoloaded/*
- - %rootDir%/tests/PHPStan/Generics/functions.php
+ - ../tests/phpstan-bootstrap.php
+ cache:
+ nodesByStringCountMax: 128
+ checkUninitializedProperties: true
+ checkMissingCallableSignature: true
+ excludePaths:
+ - ../tests/*/data/*
+ - ../tests/tmp/*
+ - ../tests/PHPStan/Analyser/nsrt/*
+ - ../tests/PHPStan/Analyser/traits/*
+ - ../tests/notAutoloaded/*
+ - ../tests/PHPStan/Reflection/UnionTypesTest.php
+ - ../tests/PHPStan/Reflection/MixedTypeTest.php
+ - ../tests/e2e/magic-setter/*
+ - ../tests/PHPStan/Rules/Properties/UninitializedPropertyRuleTest.php
+ - ../tests/PHPStan/Command/IgnoredRegexValidatorTest.php
+ - ../src/Command/IgnoredRegexValidator.php
+ exceptions:
+ uncheckedExceptionClasses:
+ - 'PHPStan\ShouldNotHappenException'
+ - 'Symfony\Component\Console\Exception\InvalidArgumentException'
+ - 'PHPStan\BetterReflection\SourceLocator\Exception\InvalidFileLocation'
+ - 'PHPStan\BetterReflection\SourceLocator\Exception\InvalidArgumentException'
+ - 'Symfony\Component\Finder\Exception\DirectoryNotFoundException'
+ - 'InvalidArgumentException'
+ - 'PHPStan\DependencyInjection\ParameterNotFoundException'
+ - 'PHPStan\DependencyInjection\DuplicateIncludedFilesException'
+ - 'PHPStan\Analyser\UndefinedVariableException'
+ - 'RuntimeException'
+ - 'Nette\Neon\Exception'
+ - 'Nette\Utils\JsonException'
+ - 'PHPStan\File\CouldNotReadFileException'
+ - 'PHPStan\File\CouldNotWriteFileException'
+ - 'PHPStan\Parser\ParserErrorsException'
+ - 'ReflectionException'
+ - 'Nette\Utils\AssertionException'
+ - 'PHPStan\File\PathNotFoundException'
+ - 'PHPStan\Broker\ClassNotFoundException'
+ - 'PHPStan\Broker\FunctionNotFoundException'
+ - 'PHPStan\Broker\ConstantNotFoundException'
+ - 'PHPStan\Reflection\MissingMethodFromReflectionException'
+ - 'PHPStan\Reflection\MissingPropertyFromReflectionException'
+ - 'PHPStan\Reflection\MissingConstantFromReflectionException'
+ - 'PHPStan\Type\CircularTypeAliasDefinitionException'
+ - 'PHPStan\Broker\ClassAutoloadingException'
+ - 'LogicException'
+ - 'Error'
+ check:
+ missingCheckedExceptionInThrows: true
+ tooWideThrowType: true
ignoreErrors:
- '#^Dynamic call to static method PHPUnit\\Framework\\\S+\(\)\.$#'
- '#should be contravariant with parameter \$node \(PhpParser\\Node\) of method PHPStan\\Rules\\Rule::processNode\(\)$#'
@@ -29,40 +79,35 @@ parameters:
message: '#Fetching class constant class of deprecated class DeprecatedAnnotations\\DeprecatedWithMultipleTags.#'
path: ../tests/PHPStan/Reflection/Annotations/DeprecatedAnnotationsTest.php
-
- message: '#^Variable property access on PHPStan\\Rules\\RuleError\.$#'
+ message: '#^Variable property access on T of PHPStan\\Rules\\RuleError\.$#'
path: ../src/Rules/RuleErrorBuilder.php
+ -
+ message: "#^Parameter \\#1 (?:\\$argument|\\$objectOrClass) of class ReflectionClass constructor expects class\\-string\\\\|PHPStan\\\\ExtensionInstaller\\\\GeneratedConfig, string given\\.$#"
+ count: 1
+ path: ../src/Command/CommandHelper.php
+ -
+ message: "#^Parameter \\#1 (?:\\$argument|\\$objectOrClass) of class ReflectionClass constructor expects class\\-string\\\\|PHPStan\\\\ExtensionInstaller\\\\GeneratedConfig, string given\\.$#"
+ count: 1
+ path: ../src/Diagnose/PHPStanDiagnoseExtension.php
+ - '#^Short ternary operator is not allowed#'
reportStaticMethodSignatures: true
tmpDir: %rootDir%/tmp
stubFiles:
- - stubs/ReactChildProcess.php
- - stubs/ReactStreams.php
+ - stubs/ReactChildProcess.stub
+ - stubs/ReactStreams.stub
+ - stubs/NetteDIContainer.stub
+ - stubs/PhpParserName.stub
+ - stubs/Identifier.stub
+
+rules:
+ - PHPStan\Build\FinalClassRule
+
services:
-
class: PHPStan\Build\ServiceLocatorDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Internal\ContainerDynamicReturnTypeExtension
+ class: PHPStan\Build\ContainerDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicMethodReturnTypeExtension
-
- -
- class: PHPStan\Internal\UnionTypeGetInternalDynamicReturnTypeExtension
- tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- scopeIsInClass:
- class: PHPStan\Internal\ScopeIsInClassTypeSpecifyingExtension
- arguments:
- isInMethodName: isInClass
- removeNullMethodName: getClassReflection
- tags:
- - phpstan.typeSpecifier.methodTypeSpecifyingExtension
-
- scopeIsInTrait:
- class: PHPStan\Internal\ScopeIsInClassTypeSpecifyingExtension
- arguments:
- isInMethodName: isInTrait
- removeNullMethodName: getTraitReflection
- tags:
- - phpstan.typeSpecifier.methodTypeSpecifyingExtension
diff --git a/build/phpstan.runtime-reflection.neon b/build/phpstan.runtime-reflection.neon
deleted file mode 100644
index 59a74ec84b..0000000000
--- a/build/phpstan.runtime-reflection.neon
+++ /dev/null
@@ -1,8 +0,0 @@
-includes:
- - phpstan.neon
-
-services:
- reflectionProvider:
- factory: @innerRuntimeReflectionProvider
- autowired:
- - PHPStan\Reflection\ReflectionProvider
diff --git a/build/readonly-property.neon b/build/readonly-property.neon
new file mode 100644
index 0000000000..96657fb795
--- /dev/null
+++ b/build/readonly-property.neon
@@ -0,0 +1,3 @@
+parameters:
+ excludePaths:
+ - ../tests/PHPStan/Rules/Properties/MissingReadOnlyPropertyAssignRuleTest.php
diff --git a/build/spl-autoload-functions-php-8.neon b/build/spl-autoload-functions-php-8.neon
new file mode 100644
index 0000000000..3669321889
--- /dev/null
+++ b/build/spl-autoload-functions-php-8.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^PHPDoc tag @var with type list\\\\|false is not subtype of native type list\\\\.$#"
+ count: 2
+ path: ../src/Command/CommandHelper.php
diff --git a/build/spl-autoload-functions-pre-php-7.neon b/build/spl-autoload-functions-pre-php-7.neon
new file mode 100644
index 0000000000..42cd820e71
--- /dev/null
+++ b/build/spl-autoload-functions-pre-php-7.neon
@@ -0,0 +1,5 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Parameter \#1 \$array \(list\) of array_values is already a list, call has no effect\.$#'
+ path: ../src/Type/TypeCombinator.php
diff --git a/build/stubs/Identifier.stub b/build/stubs/Identifier.stub
new file mode 100644
index 0000000000..301d034b2d
--- /dev/null
+++ b/build/stubs/Identifier.stub
@@ -0,0 +1,15 @@
+ $attributes
+ */
+ public function __construct(string $name, array $attributes = []) { }
+
+}
diff --git a/build/stubs/NetteDIContainer.stub b/build/stubs/NetteDIContainer.stub
new file mode 100644
index 0000000000..455eb43455
--- /dev/null
+++ b/build/stubs/NetteDIContainer.stub
@@ -0,0 +1,15 @@
+ $type
+ * @return T
+ */
+ public function getByType(string $type);
+
+}
diff --git a/build/stubs/PhpParserName.stub b/build/stubs/PhpParserName.stub
new file mode 100644
index 0000000000..a044fbf684
--- /dev/null
+++ b/build/stubs/PhpParserName.stub
@@ -0,0 +1,25 @@
+|self $name Name as string, part array or Name instance (copy ctor)
+ * @param array $attributes Additional attributes
+ */
+ public function __construct($name, array $attributes = []) {
+ }
+
+ /** @return non-empty-string */
+ public function toString() : string {
+ }
+
+ /** @return non-empty-string */
+ public function toCodeString() : string {
+ }
+}
diff --git a/build/stubs/ReactChildProcess.php b/build/stubs/ReactChildProcess.stub
similarity index 100%
rename from build/stubs/ReactChildProcess.php
rename to build/stubs/ReactChildProcess.stub
diff --git a/build/stubs/ReactStreams.php b/build/stubs/ReactStreams.stub
similarity index 100%
rename from build/stubs/ReactStreams.php
rename to build/stubs/ReactStreams.stub
diff --git a/changelog-generator/.gitignore b/changelog-generator/.gitignore
new file mode 100644
index 0000000000..61ead86667
--- /dev/null
+++ b/changelog-generator/.gitignore
@@ -0,0 +1 @@
+/vendor
diff --git a/changelog-generator/composer.json b/changelog-generator/composer.json
new file mode 100644
index 0000000000..d4527f1c45
--- /dev/null
+++ b/changelog-generator/composer.json
@@ -0,0 +1,22 @@
+{
+ "name": "phpstan/changelog-generator",
+ "require": {
+ "php": "^8.1",
+ "php-http/client-common": "^2.5",
+ "php-http/discovery": "^1.14",
+ "guzzlehttp/guzzle": "^7.4",
+ "http-interop/http-factory-guzzle": "^1.2",
+ "knplabs/github-api": "^3.7",
+ "symfony/console": "^6.1"
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\ChangelogGenerator\\": "src"
+ }
+ },
+ "config": {
+ "allow-plugins": {
+ "php-http/discovery": true
+ }
+ }
+}
diff --git a/changelog-generator/composer.lock b/changelog-generator/composer.lock
new file mode 100644
index 0000000000..3b830c7c5d
--- /dev/null
+++ b/changelog-generator/composer.lock
@@ -0,0 +1,2159 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "3e1d902170abb95f02293ffeb1aa1b2b",
+ "packages": [
+ {
+ "name": "clue/stream-filter",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/clue/stream-filter.git",
+ "reference": "d6169430c7731d8509da7aecd0af756a5747b78e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/clue/stream-filter/zipball/d6169430c7731d8509da7aecd0af756a5747b78e",
+ "reference": "d6169430c7731d8509da7aecd0af756a5747b78e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "Clue\\StreamFilter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "A simple and modern approach to stream filtering in PHP",
+ "homepage": "https://github.com/clue/php-stream-filter",
+ "keywords": [
+ "bucket brigade",
+ "callback",
+ "filter",
+ "php_user_filter",
+ "stream",
+ "stream_filter_append",
+ "stream_filter_register"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/stream-filter/issues",
+ "source": "https://github.com/clue/stream-filter/tree/v1.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2022-02-21T13:15:14+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1110f66a6530a40fe7aea0378fe608ee2b2248f9",
+ "reference": "1110f66a6530a40fe7aea0378fe608ee2b2248f9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.1",
+ "guzzlehttp/psr7": "^1.9.1 || ^2.5.1",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.8.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-27T10:20:53+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/111166291a0f8130081195ac4556a5587d7f1b5d",
+ "reference": "111166291a0f8130081195ac4556a5587d7f1b5d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-03T15:11:55+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/be45764272e8873c72dbe3d2edcfdfcc3bc9f727",
+ "reference": "be45764272e8873c72dbe3d2edcfdfcc3bc9f727",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.1",
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^8.5.29 || ^9.5.23"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu/"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.6.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-27T10:13:57+00:00"
+ },
+ {
+ "name": "http-interop/http-factory-guzzle",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/http-interop/http-factory-guzzle.git",
+ "reference": "8f06e92b95405216b237521cc64c804dd44c4a81"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/8f06e92b95405216b237521cc64c804dd44c4a81",
+ "reference": "8f06e92b95405216b237521cc64c804dd44c4a81",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/psr7": "^1.7||^2.0",
+ "php": ">=7.3",
+ "psr/http-factory": "^1.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "phpunit/phpunit": "^9.5"
+ },
+ "suggest": {
+ "guzzlehttp/psr7": "Includes an HTTP factory starting in version 2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Factory\\Guzzle\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "An HTTP Factory using Guzzle PSR7",
+ "keywords": [
+ "factory",
+ "http",
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/http-interop/http-factory-guzzle/issues",
+ "source": "https://github.com/http-interop/http-factory-guzzle/tree/1.2.0"
+ },
+ "time": "2021-07-21T13:50:14+00:00"
+ },
+ {
+ "name": "knplabs/github-api",
+ "version": "v3.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/KnpLabs/php-github-api.git",
+ "reference": "47024f3483520c0fafdfc5c10d2a20d87b4c7ceb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/47024f3483520c0fafdfc5c10d2a20d87b4c7ceb",
+ "reference": "47024f3483520c0fafdfc5c10d2a20d87b4c7ceb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2.5 || ^8.0",
+ "php-http/cache-plugin": "^1.7.1",
+ "php-http/client-common": "^2.3",
+ "php-http/discovery": "^1.12",
+ "php-http/httplug": "^2.2",
+ "php-http/multipart-stream-builder": "^1.1.2",
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-factory-implementation": "^1.0",
+ "psr/http-message": "^1.0|^2.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.2",
+ "guzzlehttp/psr7": "^1.7",
+ "http-interop/http-factory-guzzle": "^1.0",
+ "php-http/mock-client": "^1.4.1",
+ "phpstan/extension-installer": "^1.0.5",
+ "phpstan/phpstan": "^0.12.57",
+ "phpstan/phpstan-deprecation-rules": "^0.12.5",
+ "phpunit/phpunit": "^8.5 || ^9.4",
+ "symfony/cache": "^5.1.8",
+ "symfony/phpunit-bridge": "^5.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.20.x-dev",
+ "dev-master": "3.12-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Github\\": "lib/Github/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KnpLabs Team",
+ "homepage": "http://knplabs.com/"
+ },
+ {
+ "name": "Thibault Duplessis",
+ "email": "thibault.duplessis@gmail.com",
+ "homepage": "http://ornicar.github.com/"
+ }
+ ],
+ "description": "GitHub API v3 client",
+ "homepage": "https://github.com/KnpLabs/php-github-api",
+ "keywords": [
+ "api",
+ "gh",
+ "gist",
+ "github"
+ ],
+ "support": {
+ "issues": "https://github.com/KnpLabs/php-github-api/issues",
+ "source": "https://github.com/KnpLabs/php-github-api/tree/v3.13.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/acrobat",
+ "type": "github"
+ }
+ ],
+ "time": "2023-11-19T21:08:19+00:00"
+ },
+ {
+ "name": "php-http/cache-plugin",
+ "version": "1.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/cache-plugin.git",
+ "reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
+ "reference": "6bf9fbf66193f61d90c2381b75eb1fa0202fd314",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/client-common": "^1.9 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\Plugin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "PSR-6 Cache plugin for HTTPlug",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "cache",
+ "http",
+ "httplug",
+ "plugin"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/cache-plugin/issues",
+ "source": "https://github.com/php-http/cache-plugin/tree/1.8.0"
+ },
+ "time": "2023-04-28T10:56:55+00:00"
+ },
+ {
+ "name": "php-http/client-common",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/client-common.git",
+ "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/880509727a447474d2a71b7d7fa5d268ddd3db4b",
+ "reference": "880509727a447474d2a71b7d7fa5d268ddd3db4b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/httplug": "^2.0",
+ "php-http/message": "^1.6",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.1",
+ "guzzlehttp/psr7": "^1.4",
+ "nyholm/psr7": "^1.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "phpspec/prophecy": "^1.10.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+ },
+ "suggest": {
+ "ext-json": "To detect JSON responses with the ContentTypePlugin",
+ "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+ "php-http/cache-plugin": "PSR-6 Cache plugin",
+ "php-http/logger-plugin": "PSR-3 Logger plugin",
+ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Common HTTP Client implementations and tools for HTTPlug",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "client",
+ "common",
+ "http",
+ "httplug"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/client-common/issues",
+ "source": "https://github.com/php-http/client-common/tree/2.7.0"
+ },
+ "time": "2023-05-17T06:46:59+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.19.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e",
+ "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "symfony/phpunit-bridge": "^6.2"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.19.1"
+ },
+ "time": "2023-07-11T07:02:26+00:00"
+ },
+ {
+ "name": "php-http/httplug",
+ "version": "2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/httplug.git",
+ "reference": "625ad742c360c8ac580fcc647a1541d29e257f67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/httplug/zipball/625ad742c360c8ac580fcc647a1541d29e257f67",
+ "reference": "625ad742c360c8ac580fcc647a1541d29e257f67",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/promise": "^1.1",
+ "psr/http-client": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu/"
+ }
+ ],
+ "description": "HTTPlug, the HTTP client abstraction for PHP",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "client",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/2.4.0"
+ },
+ "time": "2023-04-14T15:10:03+00:00"
+ },
+ {
+ "name": "php-http/message",
+ "version": "1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message.git",
+ "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message/zipball/47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+ "reference": "47a14338bf4ebd67d317bf1144253d7db4ab55fd",
+ "shasum": ""
+ },
+ "require": {
+ "clue/stream-filter": "^1.5",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.6",
+ "ext-zlib": "*",
+ "guzzlehttp/psr7": "^1.0 || ^2.0",
+ "laminas/laminas-diactoros": "^2.0 || ^3.0",
+ "php-http/message-factory": "^1.0.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "slim/slim": "^3.0"
+ },
+ "suggest": {
+ "ext-zlib": "Used with compressor/decompressor streams",
+ "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+ "laminas/laminas-diactoros": "Used with Diactoros Factories",
+ "slim/slim": "Used with Slim Framework PSR-7 implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/filters.php"
+ ],
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "HTTP Message related tools",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message/issues",
+ "source": "https://github.com/php-http/message/tree/1.16.0"
+ },
+ "time": "2023-05-17T06:43:38+00:00"
+ },
+ {
+ "name": "php-http/message-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message-factory.git",
+ "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+ "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Factory interfaces for PSR-7 HTTP Message",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message-factory/issues",
+ "source": "https://github.com/php-http/message-factory/tree/1.1.0"
+ },
+ "abandoned": "psr/http-factory",
+ "time": "2023-04-14T14:16:17+00:00"
+ },
+ {
+ "name": "php-http/multipart-stream-builder",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/multipart-stream-builder.git",
+ "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/f5938fd135d9fa442cc297dc98481805acfe2b6a",
+ "reference": "f5938fd135d9fa442cc297dc98481805acfe2b6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/discovery": "^1.15",
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.0",
+ "php-http/message": "^1.5",
+ "php-http/message-factory": "^1.0.2",
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\MultipartStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ }
+ ],
+ "description": "A builder class that help you create a multipart stream",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "multipart stream",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/multipart-stream-builder/issues",
+ "source": "https://github.com/php-http/multipart-stream-builder/tree/1.3.0"
+ },
+ "time": "2023-04-28T14:10:22+00:00"
+ },
+ {
+ "name": "php-http/promise",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/promise.git",
+ "reference": "44a67cb59f708f826f3bec35f22030b3edb90119"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/44a67cb59f708f826f3bec35f22030b3edb90119",
+ "reference": "44a67cb59f708f826f3bec35f22030b3edb90119",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+ "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joel Wurtz",
+ "email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Promise used for asynchronous HTTP requests",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.2.1"
+ },
+ "time": "2023-11-08T12:57:08+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:10:41+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+ "reference": "0d14a9f6d04d4ac38a8cea1171f4554e325dae92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/lock": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/var-dumper": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.3.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-10-31T08:09:35+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.4-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-23T14:45:45+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/a10f19f5198d589d5c33333cffe98dc9820332dd",
+ "reference": "a10f19f5198d589d5c33333cffe98dc9820332dd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v6.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-12T14:21:09+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "875e90aeea2777b6f135677f618529449334a612"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612",
+ "reference": "875e90aeea2777b6f135677f618529449334a612",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "42292d99c55abe617799667f454222c54c60e229"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229",
+ "reference": "42292d99c55abe617799667f454222c54c60e229",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-28T09:04:16+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.28.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.28-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-26T09:26:14+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
+ "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.4-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-23T14:45:45+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "13880a87790c76ef994c91e87efb96134522577a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/13880a87790c76ef994c91e87efb96134522577a",
+ "reference": "13880a87790c76ef994c91e87efb96134522577a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/intl": "^6.2",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.3.8"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-09T08:28:21+00:00"
+ }
+ ],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/changelog-generator/phpstan.neon b/changelog-generator/phpstan.neon
new file mode 100644
index 0000000000..a1fee9d3a7
--- /dev/null
+++ b/changelog-generator/phpstan.neon
@@ -0,0 +1,16 @@
+includes:
+ - ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
+ - ../vendor/phpstan/phpstan-nette/rules.neon
+ - ../vendor/phpstan/phpstan-phpunit/extension.neon
+ - ../vendor/phpstan/phpstan-phpunit/rules.neon
+ - ../vendor/phpstan/phpstan-strict-rules/rules.neon
+ - ../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ - run.php
+ ignoreErrors:
+ -
+ identifier: missingType.generics
diff --git a/changelog-generator/run.php b/changelog-generator/run.php
new file mode 100755
index 0000000000..fc709b521a
--- /dev/null
+++ b/changelog-generator/run.php
@@ -0,0 +1,157 @@
+#!/usr/bin/env php
+setName('run');
+ $this->addArgument('fromCommit', InputArgument::REQUIRED);
+ $this->addArgument('toCommit', InputArgument::REQUIRED);
+ $this->addOption('exclude-branch', null, InputOption::VALUE_REQUIRED);
+ $this->addOption('include-headings', null, InputOption::VALUE_NONE);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output)
+ {
+ $token = $_SERVER['GITHUB_TOKEN'];
+
+ $rateLimitPlugin = new RateLimitPlugin();
+ $httpBuilder = new Builder();
+ $httpBuilder->addPlugin($rateLimitPlugin);
+
+ $gitHubClient = new Client($httpBuilder);
+ $gitHubClient->authenticate($token, AuthMethod::ACCESS_TOKEN);
+ $rateLimitPlugin->setClient($gitHubClient);
+
+ /** @var Search $searchApi */
+ $searchApi = $gitHubClient->api('search');
+
+ $command = ['git', 'log', sprintf('%s..%s', $input->getArgument('fromCommit'), $input->getArgument('toCommit'))];
+ $excludeBranch = $input->getOption('exclude-branch');
+ if ($excludeBranch !== null) {
+ $command[] = '--not';
+ $command[] = $excludeBranch;
+ $command[] = '--no-merges';
+ }
+ $command[] = '--reverse';
+ $command[] = '--pretty=%H %s';
+
+ $commitLines = $this->exec($command);
+ $commits = array_map(static function (string $line): array {
+ [$hash, $message] = explode(' ', $line, 2);
+
+ return [
+ 'hash' => $hash,
+ 'message' => $message,
+ ];
+ }, explode("\n", $commitLines));
+
+ if ($input->getOption('include-headings') === true) {
+ $output->writeln(<<<'MARKDOWN'
+ Major new features 🚀
+ =====================
+
+ Bleeding edge 🔪
+ =====================
+
+ *
+
+ *If you want to see the shape of things to come and adopt bleeding edge features early, you can include this config file in your project's `phpstan.neon`:*
+
+ ```
+ includes:
+ - vendor/phpstan/phpstan/conf/bleedingEdge.neon
+ ```
+
+ *Of course, there are no backwards compatibility guarantees when you include this file. The behaviour and reported errors can change in minor versions with this file included. [Learn more](https://phpstan.org/blog/what-is-bleeding-edge)*
+
+ Improvements 🔧
+ =====================
+
+ Bugfixes 🐛
+ =====================
+
+ Function signature fixes 🤖
+ =======================
+
+ Internals 🔍
+ =====================
+
+
+ MARKDOWN);
+ }
+
+ foreach ($commits as $commit) {
+ $pullRequests = $searchApi->issues(sprintf('repo:phpstan/phpstan-src %s', $commit['hash']));
+ $issues = $searchApi->issues(sprintf('repo:phpstan/phpstan %s', $commit['hash']), 'created');
+ $items = array_merge($pullRequests['items'], $issues['items']);
+ $parenthesis = 'https://github.com/phpstan/phpstan-src/commit/' . $commit['hash'];
+ $thanks = null;
+ $issuesToReference = [];
+ foreach ($items as $responseItem) {
+ if (isset($responseItem['pull_request'])) {
+ $parenthesis = sprintf('[#%d](%s)', $responseItem['number'], 'https://github.com/phpstan/phpstan-src/pull/' . $responseItem['number']);
+ $thanks = $responseItem['user']['login'];
+ } else {
+ $issuesToReference[] = sprintf('#%d', $responseItem['number']);
+ }
+ }
+
+ $output->writeln(sprintf('* %s (%s)%s%s', $commit['message'], $parenthesis, count($issuesToReference) > 0 ? ', ' . implode(', ', $issuesToReference) : '', $thanks !== null ? sprintf(', thanks @%s!', $thanks) : ''));
+ }
+
+ return 0;
+ }
+
+ /**
+ * @param string[] $commandParts
+ */
+ private function exec(array $commandParts): string
+ {
+ $command = implode(' ', array_map(static fn (string $part): string => escapeshellarg($part), $commandParts));
+
+ exec($command, $outputLines, $statusCode);
+ $output = implode("\n", $outputLines);
+ if ($statusCode !== 0) {
+ throw new InvalidArgumentException(sprintf('Command %s failed: %s', $command, $output));
+ }
+
+ return $output;
+ }
+
+ };
+
+ $application = new Application();
+ $application->add($command);
+ $application->setDefaultCommand('run', true);
+ $application->setCatchExceptions(false);
+ $application->run();
+})();
diff --git a/changelog-generator/src/RateLimitPlugin.php b/changelog-generator/src/RateLimitPlugin.php
new file mode 100644
index 0000000000..fd724ab31f
--- /dev/null
+++ b/changelog-generator/src/RateLimitPlugin.php
@@ -0,0 +1,47 @@
+client = $client;
+ }
+
+ public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
+ {
+ $path = $request->getUri()->getPath();
+ if ($path === '/rate_limit') {
+ return $next($request);
+ }
+
+ /** @var RateLimit $api */
+ $api = $this->client->api('rate_limit');
+
+ /** @var RateLimitResource $resource */
+ $resource = $api->getResource('search');
+ if ($resource->getRemaining() < 10) {
+ $reset = $resource->getReset();
+ $sleepFor = $reset - time();
+ if ($sleepFor > 0) {
+ sleep($sleepFor);
+ }
+ }
+
+ return $next($request);
+ }
+
+}
diff --git a/codecov.yml b/codecov.yml
deleted file mode 100644
index 642803cbcd..0000000000
--- a/codecov.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-comment: false
-coverage:
- status:
- patch: off
diff --git a/compiler/bin/compile b/compiler/bin/compile
deleted file mode 100755
index e5f1ef6bb4..0000000000
--- a/compiler/bin/compile
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/usr/bin/env php
-add($compileCommand);
-$application->setDefaultCommand($compileCommand->getName(), true);
-$application->run();
diff --git a/compiler/bin/prepare b/compiler/bin/prepare
new file mode 100755
index 0000000000..b72543c452
--- /dev/null
+++ b/compiler/bin/prepare
@@ -0,0 +1,18 @@
+#!/usr/bin/env php
+add($prepareCommand);
+$application->setDefaultCommand($prepareCommand->getName(), true);
+$application->run();
diff --git a/compiler/build/box.json b/compiler/build/box.json
index 36e11f02a7..9f0b7ee6c1 100644
--- a/compiler/build/box.json
+++ b/compiler/build/box.json
@@ -7,11 +7,13 @@
"KevinGH\\Box\\Compactor\\PhpScoper"
],
"files": [
- "preload.php"
+ "preload.php",
+ "vendor/composer/installed.php"
],
"directories": [
"conf",
"src",
+ "resources",
"stubs"
],
"force-autodiscovery": true,
diff --git a/compiler/build/box.phar b/compiler/build/box.phar
old mode 100644
new mode 100755
index 70e1805692..402ceabdc4
Binary files a/compiler/build/box.phar and b/compiler/build/box.phar differ
diff --git a/compiler/build/resign.php b/compiler/build/resign.php
new file mode 100644
index 0000000000..01b7228962
--- /dev/null
+++ b/compiler/build/resign.php
@@ -0,0 +1,15 @@
+updateTimestamps(new \DateTimeImmutable('2017-10-11 08:58:00'));
+$util->save($file, \Phar::SHA512);
diff --git a/compiler/build/scoper.inc.php b/compiler/build/scoper.inc.php
index fdd07820e9..0d0008d341 100644
--- a/compiler/build/scoper.inc.php
+++ b/compiler/build/scoper.inc.php
@@ -3,15 +3,24 @@
require_once __DIR__ . '/../vendor/autoload.php';
$stubs = [
- '../../src/Reflection/SignatureMap/functionMap.php',
- '../../src/Reflection/SignatureMap/functionMap_php74delta.php',
- '../../src/Reflection/SignatureMap/functionMetadata.php',
+ '../../resources/functionMap.php',
+ '../../resources/functionMap_php74delta.php',
+ '../../resources/functionMap_php80delta.php',
+ '../../resources/functionMetadata.php',
'../../vendor/hoa/consistency/Prelude.php',
+ '../../vendor/composer/InstalledVersions.php',
+ '../../vendor/composer/installed.php',
];
$stubFinder = \Isolated\Symfony\Component\Finder\Finder::create();
foreach ($stubFinder->files()->name('*.php')->in([
'../../stubs',
'../../vendor/jetbrains/phpstorm-stubs',
+ '../../vendor/phpstan/php-8-stubs/stubs',
+ '../../vendor/symfony/polyfill-php80',
+ '../../vendor/symfony/polyfill-php81',
+ '../../vendor/symfony/polyfill-mbstring',
+ '../../vendor/symfony/polyfill-intl-normalizer',
+ '../../vendor/symfony/polyfill-intl-grapheme',
]) as $file) {
if ($file->getPathName() === '../../vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php') {
continue;
@@ -19,10 +28,21 @@
$stubs[] = $file->getPathName();
}
+if ($_SERVER['PHAR_CHECKSUM'] ?? false) {
+ $prefix = '_PHPStan_checksum';
+} else {
+ exec('git rev-parse --short HEAD', $gitCommitOutputLines, $gitExitCode);
+ if ($gitExitCode !== 0) {
+ die('Could not get Git commit');
+ }
+
+ $prefix = sprintf('_PHPStan_%s', $gitCommitOutputLines[0]);
+}
+
return [
- 'prefix' => null,
+ 'prefix' => $prefix,
'finders' => [],
- 'files-whitelist' => $stubs,
+ 'exclude-files' => $stubs,
'patchers' => [
function (string $filePath, string $prefix, string $content): string {
if ($filePath !== 'bin/phpstan') {
@@ -30,6 +50,12 @@ function (string $filePath, string $prefix, string $content): string {
}
return str_replace('__DIR__ . \'/..', '\'phar://phpstan.phar', $content);
},
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'bin/phpstan') {
+ return $content;
+ }
+ return str_replace(sprintf('%s\\\\__PHPSTAN_RUNNING__', $prefix), '__PHPSTAN_RUNNING__', $content);
+ },
function (string $filePath, string $prefix, string $content): string {
if ($filePath !== 'vendor/nette/di/src/DI/Compiler.php') {
return $content;
@@ -37,7 +63,7 @@ function (string $filePath, string $prefix, string $content): string {
return str_replace('|Nette\\\\DI\\\\Statement', sprintf('|\\\\%s\\\\Nette\\\\DI\\\\Statement', $prefix), $content);
},
function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'vendor/nette/di/src/DI/Config/DefinitionSchema.php') {
+ if ($filePath !== 'vendor/nette/di/src/DI/Extensions/DefinitionSchema.php') {
return $content;
}
$content = str_replace(
@@ -70,22 +96,6 @@ function (string $filePath, string $prefix, string $content): string {
return $content;
},
- function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'src/Testing/TestCase.php') {
- return $content;
- }
- return str_replace(sprintf('\\%s\\PHPUnit\\Framework\\TestCase', $prefix), '\\PHPUnit\\Framework\\TestCase', $content);
- },
- function (string $filePath, string $prefix, string $content): string {
- if ($filePath !== 'src/Testing/LevelsTestCase.php') {
- return $content;
- }
- return str_replace(
- [sprintf('\\%s\\PHPUnit\\Framework\\AssertionFailedError', $prefix), sprintf('\\%s\\PHPUnit\\Framework\\TestCase', $prefix)],
- ['\\PHPUnit\\Framework\\AssertionFailedError', '\\PHPUnit\\Framework\\TestCase'],
- $content
- );
- },
function (string $filePath, string $prefix, string $content): string {
if (strpos($filePath, 'src/') !== 0) {
return $content;
@@ -150,14 +160,23 @@ function (string $filePath, string $prefix, string $content): string {
},
function (string $filePath, string $prefix, string $content): string {
if (!in_array($filePath, [
+ 'bin/phpstan',
'src/Testing/TestCaseSourceLocatorFactory.php',
- 'src/Testing/TestCase.php',
+ 'src/Testing/PHPStanTestCase.php',
+ 'vendor/ondrejmirtes/better-reflection/src/SourceLocator/Type/ComposerSourceLocator.php',
], true)) {
return $content;
}
return str_replace(sprintf('%s\\Composer\\Autoload\\ClassLoader', $prefix), 'Composer\\Autoload\\ClassLoader', $content);
},
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'src/Internal/ComposerHelper.php') {
+ return $content;
+ }
+
+ return str_replace(sprintf('%s\\Composer\\InstalledVersions', $prefix), 'Composer\\InstalledVersions', $content);
+ },
function (string $filePath, string $prefix, string $content): string {
if ($filePath !== 'vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php') {
return $content;
@@ -167,10 +186,81 @@ function (string $filePath, string $prefix, string $content): string {
return $content;
},
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'vendor/phpstan/php-8-stubs/Php8StubsMap.php') {
+ return $content;
+ }
+
+ $content = str_replace('\'' . $prefix . '\\\\', '\'', $content);
+
+ return $content;
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'vendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php') {
+ return $content;
+ }
+
+ return str_replace('Core/Core_d.php', 'Core/Core_d.stub', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'vendor/ondrejmirtes/better-reflection/src/SourceLocator/SourceStubber/PhpStormStubsSourceStubber.php') {
+ return $content;
+ }
+
+ return str_replace(sprintf('\'%s\\\\JetBrains\\\\', $prefix), '\'JetBrains\\\\', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (!str_starts_with($filePath, 'vendor/nikic/php-parser/lib')) {
+ return $content;
+ }
+
+ return str_replace(sprintf('use %s\\PhpParser;', $prefix), 'use PhpParser;', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (!str_starts_with($filePath, 'vendor/nikic/php-parser/lib')) {
+ return $content;
+ }
+
+ return str_replace([
+ sprintf('\\%s', $prefix),
+ sprintf('\\\\%s', $prefix),
+ ], '', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (!str_starts_with($filePath, 'vendor/ondrejmirtes/better-reflection')) {
+ return $content;
+ }
+
+ return str_replace(sprintf('%s\\PropertyHookType', $prefix), 'PropertyHookType', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if (
+ $filePath !== 'vendor/nette/utils/src/Utils/Strings.php'
+ && $filePath !== 'vendor/nette/utils/src/Utils/Arrays.php'
+ ) {
+ return $content;
+ }
+
+ return str_replace('#[\\JetBrains\\PhpStorm\\Language(\'RegExp\')] ', '', $content);
+ },
+ function (string $filePath, string $prefix, string $content): string {
+ if ($filePath !== 'vendor/fidry/cpu-core-counter/src/Finder/WindowsRegistryLogicalFinder.php') {
+ return $content;
+ }
+ return str_replace(sprintf('%s\\\\reg query', $prefix), 'reg query', $content);
+ },
],
- 'whitelist' => [
- 'PHPStan\*',
- 'PhpParser\*',
- 'Hoa\*',
+ 'exclude-namespaces' => [
+ 'PHPStan',
+ 'PHPUnit',
+ 'PhpParser',
+ 'Hoa',
+ 'Symfony\Polyfill\Php80',
+ 'Symfony\Polyfill\Php81',
+ 'Symfony\Polyfill\Mbstring',
+ 'Symfony\Polyfill\Intl\Normalizer',
+ 'Symfony\Polyfill\Intl\Grapheme',
],
+ 'expose-global-functions' => false,
+ 'expose-global-classes' => false,
];
diff --git a/compiler/composer.json b/compiler/composer.json
index 8c1a449eb6..4da1b08076 100644
--- a/compiler/composer.json
+++ b/compiler/composer.json
@@ -4,12 +4,13 @@
"description": "PHAR Compiler for PHPStan",
"license": ["MIT"],
"require": {
- "php": "^7.1",
+ "php": "^8.0",
"nette/neon": "^3.0.0",
- "symfony/console": "^4.1",
- "symfony/process": "^4.1",
- "symfony/filesystem": "^4.1",
- "symfony/finder": "^5.0"
+ "seld/phar-utils": "^1.2",
+ "symfony/console": "^6.0.0",
+ "symfony/filesystem": "^6.0.0",
+ "symfony/finder": "^6.0.0",
+ "symfony/process": "^6.0.0"
},
"autoload": {
"psr-4": {
@@ -22,7 +23,16 @@
}
},
"require-dev": {
- "phpunit/phpunit": "^8.4",
- "phpstan/phpstan-phpunit": "^0.12.8"
- }
+ "phpunit/phpunit": "^9.5.1",
+ "phpstan/phpstan-phpunit": "^1.0"
+ },
+ "config": {
+ "platform": {
+ "php": "8.0.99"
+ },
+ "platform-check": false,
+ "sort-packages": true
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true
}
diff --git a/compiler/composer.lock b/compiler/composer.lock
new file mode 100644
index 0000000000..d970a7b6f7
--- /dev/null
+++ b/compiler/composer.lock
@@ -0,0 +1,2817 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "7caab5611acadb20806eaeca4e294e98",
+ "packages": [
+ {
+ "name": "nette/neon",
+ "version": "v3.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/neon.git",
+ "reference": "372d945c156ee7f35c953339fb164538339e6283"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/neon/zipball/372d945c156ee7f35c953339fb164538339e6283",
+ "reference": "372d945c156ee7f35c953339fb164538339e6283",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=8.0 <8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "bin": [
+ "bin/neon-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
+ "homepage": "https://ne-on.org/",
+ "keywords": [
+ "export",
+ "import",
+ "neon",
+ "nette",
+ "yaml"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/neon/issues",
+ "source": "https://github.com/nette/neon/tree/v3.4.0"
+ },
+ "time": "2023-01-13T03:08:29+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "seld/phar-utils",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/phar-utils.git",
+ "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
+ "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Seld\\PharUtils\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "PHAR file format utilities, for when PHP phars you up",
+ "keywords": [
+ "phar"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/phar-utils/issues",
+ "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1"
+ },
+ "time": "2022-08-31T10:31:18+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c3ebc83d031b71c39da318ca8b7a07ecc67507ed",
+ "reference": "c3ebc83d031b71c39da318ca8b7a07ecc67507ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.4|^6.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0",
+ "symfony/dependency-injection": "^5.4|^6.0",
+ "symfony/event-dispatcher": "^5.4|^6.0",
+ "symfony/lock": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0",
+ "symfony/var-dumper": "^5.4|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.0.19"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:36:10+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+ "reference": "3d49eec03fda1f0fc19b7349fbbe55ebc1004214",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v6.0.19"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-20T17:44:14+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/5cc9cac6586fc0c28cd173780ca696e419fefa11",
+ "reference": "5cc9cac6586fc0c28cd173780ca696e419fefa11",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.0.19"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-20T17:44:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a",
+ "reference": "5bbc823adecdae860bb64756d639ecfec17b050a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354",
+ "reference": "511a08c03c1960e08a883f4cffcacd219b758354",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.27.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-11-03T14:55:06+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "2114fd60f26a296cc403a7939ab91478475a33d4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/2114fd60f26a296cc403a7939ab91478475a33d4",
+ "reference": "2114fd60f26a296cc403a7939ab91478475a33d4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v6.0.19"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:36:10+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "psr/container": "^2.0"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-05-30T19:17:58+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v6.0.19",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "reference": "d9e72497367c23e08bf94176d2be45b00a9d232a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^5.4|^6.0",
+ "symfony/http-client": "^5.4|^6.0",
+ "symfony/translation-contracts": "^2.0|^3.0",
+ "symfony/var-exporter": "^5.4|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v6.0.19"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-01-01T08:36:10+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9 || ^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.16 || ^1",
+ "phpstan/phpstan": "^1.4",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "vimeo/psalm": "^4.30 || ^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:15:36+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-03-08T13:26:56+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.17.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1"
+ },
+ "time": "2023-08-13T19:53:39+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ },
+ "time": "2021-07-20T11:28:43+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.10.15",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/762c4dac4da6f8756eebb80e528c3a47855da9bd",
+ "reference": "762c4dac4da6f8756eebb80e528c3a47855da9bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-05-09T15:28:01+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-phpunit",
+ "version": "1.3.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-phpunit.git",
+ "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d8bdab0218c5eb0964338d24a8511b65e9c94fa5",
+ "reference": "d8bdab0218c5eb0964338d24a8511b65e9c94fa5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.10"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<7.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.13.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon",
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPUnit extensions and rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-phpunit/issues",
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.13"
+ },
+ "time": "2023-05-26T11:05:59+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.27",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/b0a88255cb70d52653d80c890bd7f38740ea50d1",
+ "reference": "b0a88255cb70d52653d80c890bd7f38740ea50d1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.15",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.27"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-07-26T13:44:30+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "810500e92855eba8a7a5319ae913be2da6f957b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/810500e92855eba8a7a5319ae913be2da6f957b0",
+ "reference": "810500e92855eba8a7a5319ae913be2da6f957b0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.13",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.5",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^3.2",
+ "sebastian/version": "^3.0.2"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.11"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-19T07:10:56+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:41:17+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-07T05:35:17+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T06:03:37+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bde739e7565280bda77be70044ac1047bc007e34"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34",
+ "reference": "bde739e7565280bda77be70044ac1047bc007e34",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-08-02T09:26:13+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:07:39+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13:03+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": [],
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.0"
+ },
+ "platform-dev": [],
+ "platform-overrides": {
+ "php": "8.0.99"
+ },
+ "plugin-api-version": "2.3.0"
+}
diff --git a/compiler/patches/Consistency.diff b/compiler/patches/Consistency.diff
deleted file mode 100644
index 7b279857ed..0000000000
--- a/compiler/patches/Consistency.diff
+++ /dev/null
@@ -1,45 +0,0 @@
---- ../vendor/hoa/consistency/Consistency.php 2017-05-02 14:18:12.000000000 +0200
-+++ ../vendor/hoa/consistency/Consistency2.php 2020-05-05 08:28:35.000000000 +0200
-@@ -319,42 +319,6 @@
- $define('STREAM_CRYPTO_METHOD_ANY_CLIENT', 63);
- }
-
--if (!function_exists('curry')) {
-- /**
-- * Curry.
-- * Example:
-- * $c = curry('str_replace', …, …, 'foobar');
-- * var_dump($c('foo', 'baz')); // bazbar
-- * $c = curry('str_replace', 'foo', 'baz', …);
-- * var_dump($c('foobarbaz')); // bazbarbaz
-- * Nested curries also work:
-- * $c1 = curry('str_replace', …, …, 'foobar');
-- * $c2 = curry($c1, 'foo', …);
-- * var_dump($c2('baz')); // bazbar
-- * Obviously, as the first argument is a callable, we can combine this with
-- * \Hoa\Consistency\Xcallable ;-).
-- * The “…” character is the HORIZONTAL ELLIPSIS Unicode character (Unicode:
-- * 2026, UTF-8: E2 80 A6).
-- *
-- * @param mixed $callable Callable (two parts).
-- * @param ... ... Arguments.
-- * @return \Closure
-- */
-- function curry($callable)
-- {
-- $arguments = func_get_args();
-- array_shift($arguments);
-- $ii = array_keys($arguments, …, true);
--
-- return function () use ($callable, $arguments, $ii) {
-- return call_user_func_array(
-- $callable,
-- array_replace($arguments, array_combine($ii, func_get_args()))
-- );
-- };
-- }
--}
--
- /**
- * Flex entity.
- */
diff --git a/compiler/patches/Wrapper.diff b/compiler/patches/Wrapper.diff
deleted file mode 100644
index b07c9b0b3b..0000000000
--- a/compiler/patches/Wrapper.diff
+++ /dev/null
@@ -1,27 +0,0 @@
---- ../vendor/hoa/protocol/Wrapper.php 2017-01-14 13:26:10.000000000 +0100
-+++ ../vendor/hoa/protocol/Wrapper2.php 2020-05-05 08:39:18.000000000 +0200
-@@ -582,24 +582,3 @@
- stream_wrapper_register('hoa', Wrapper::class);
-
- }
--
--namespace
--{
--
--/**
-- * Alias of `Hoa\Protocol::resolve` method.
-- *
-- * @param string $path Path to resolve.
-- * @param bool $exists If `true`, try to find the first that exists,
-- * else return the first solution.
-- * @param bool $unfold Return all solutions instead of one.
-- * @return mixed
-- */
--if (!function_exists('resolve')) {
-- function resolve($path, $exists = true, $unfold = false)
-- {
-- return Hoa\Protocol::getInstance()->resolve($path, $exists, $unfold);
-- }
--}
--
--}
diff --git a/compiler/patches/stubs/PDO/PDO.stub.patch b/compiler/patches/stubs/PDO/PDO.stub.patch
deleted file mode 100644
index 089aa13d21..0000000000
--- a/compiler/patches/stubs/PDO/PDO.stub.patch
+++ /dev/null
@@ -1,43 +0,0 @@
---- PDO.stub 2019-12-05 17:56:26.000000000 +0100
-+++ PDO2.stub 2020-05-26 14:16:32.000000000 +0200
-@@ -268,7 +268,6 @@
- * As PDO::FETCH_INTO but object is provided as a serialized string.
- * Available since PHP 5.1.0. Since PHP 5.3.0 the class constructor is never called if this
- * flag is set.
-- * @since 5.1 Available
- * @link https://php.net/manual/en/pdo.constants.php#pdo.constants.fetch-serialize
- */
- const FETCH_SERIALIZE = 524288;
-@@ -727,7 +726,7 @@
- *
- * Note, this constant can only be used in the driver_options array when constructing a new database handle.
- *
-- * @since 5.5.21 and 5.6.5
-+ * @since 5.5.21
- * @link https://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-multi-statements
- */
- const MYSQL_ATTR_MULTI_STATEMENTS = 1015;
-@@ -747,6 +746,7 @@
- */
- const PGSQL_ASSOC = 1;
- const PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT = 1000;
-+ const PGSQL_ATTR_DISABLE_PREPARES = 1000;
- const PGSQL_BAD_RESPONSE = 5;
- const PGSQL_BOTH = 3;
- const PGSQL_TRANSACTION_IDLE = 0;
-@@ -839,6 +839,15 @@
- */
- const SQLITE_ATTR_EXTENDED_RESULT_CODES = 2;
-
-+ const FB_ATTR_DATE_FORMAT = 1;
-+ const FB_ATTR_TIME_FORMAT = 2;
-+ const FB_ATTR_TIMESTAMP_FORMAT = 3;
-+
-+ const OCI_ATTR_ACTION = 1;
-+ const OCI_ATTR_CLIENT_INFO = 2;
-+ const OCI_ATTR_CLIENT_IDENTIFIER = 3;
-+ const OCI_ATTR_MODULE = 4;
-+
- /**
- * (PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
- * Creates a PDO instance representing a connection to a database
diff --git a/compiler/src/Console/CompileCommand.php b/compiler/src/Console/CompileCommand.php
deleted file mode 100644
index b988135557..0000000000
--- a/compiler/src/Console/CompileCommand.php
+++ /dev/null
@@ -1,215 +0,0 @@
-filesystem = $filesystem;
- $this->processFactory = $processFactory;
- $this->dataDir = $dataDir;
- $this->buildDir = $buildDir;
- }
-
- protected function configure(): void
- {
- $this->setName('phpstan:compile')
- ->setDescription('Compile PHAR');
- }
-
- protected function execute(InputInterface $input, OutputInterface $output): int
- {
- $this->processFactory->setOutput($output);
-
- $this->buildPreloadScript();
- $this->deleteUnnecessaryVendorCode();
- $this->patchFile(
- $output,
- 'vendor/hoa/consistency/Consistency.php',
- 'compiler/patches/Consistency.diff'
- );
- $this->patchFile(
- $output,
- 'vendor/hoa/protocol/Wrapper.php',
- 'compiler/patches/Wrapper.diff'
- );
- $this->fixComposerJson($this->buildDir);
- $this->renamePhpStormStubs();
- $this->patchPhpStormStubs($output);
- $this->transformSource();
-
- $this->processFactory->create(['php', 'box.phar', 'compile', '--no-parallel'], $this->dataDir);
-
- return 0;
- }
-
- private function fixComposerJson(string $buildDir): void
- {
- $json = json_decode($this->filesystem->read($buildDir . '/composer.json'), true);
-
- unset($json['replace']);
- $json['name'] = 'phpstan/phpstan';
- $json['require']['php'] = '^7.1';
-
- // simplify autoload (remove not packed build directory]
- $json['autoload']['psr-4']['PHPStan\\'] = 'src/';
-
- $encodedJson = json_encode($json, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
- if ($encodedJson === false) {
- throw new \Exception('json_encode() was not successful.');
- }
-
- $this->filesystem->write($buildDir . '/composer.json', $encodedJson);
- }
-
- private function renamePhpStormStubs(): void
- {
- $directory = $this->buildDir . '/vendor/jetbrains/phpstorm-stubs';
- if (!is_dir($directory)) {
- return;
- }
-
- $stubFinder = \Symfony\Component\Finder\Finder::create();
- $stubsMapPath = $directory . '/PhpStormStubsMap.php';
- foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
- $path = $stubFile->getPathname();
- if ($path === $stubsMapPath) {
- continue;
- }
-
- $renameSuccess = rename(
- $path,
- dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub'
- );
- if ($renameSuccess === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not rename %s', $path));
- }
- }
-
- $stubsMapContents = file_get_contents($stubsMapPath);
- if ($stubsMapContents === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
- }
-
- $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
-
- $putSuccess = file_put_contents($directory . '/PhpStormStubsMap.php', $stubsMapContents);
- if ($putSuccess === false) {
- throw new \PHPStan\ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
- }
- }
-
- private function patchPhpStormStubs(OutputInterface $output): void
- {
- $stubFinder = \Symfony\Component\Finder\Finder::create();
- $stubsDirectory = __DIR__ . '/../../../vendor/jetbrains/phpstorm-stubs';
- foreach ($stubFinder->files()->name('*.patch')->in(__DIR__ . '/../../patches/stubs') as $patchFile) {
- $absolutePatchPath = $patchFile->getPathname();
- $patchPath = $patchFile->getRelativePathname();
- $stubPath = realpath($stubsDirectory . '/' . dirname($patchPath) . '/' . basename($patchPath, '.patch'));
- if ($stubPath === false) {
- $output->writeln(sprintf('Stub %s not found.', $stubPath));
- continue;
- }
- $this->patchFile($output, $stubPath, $absolutePatchPath);
- }
- }
-
- private function buildPreloadScript(): void
- {
- $vendorDir = $this->buildDir . '/vendor';
- if (!is_dir($vendorDir . '/nikic/php-parser/lib/PhpParser')) {
- return;
- }
-
- $preloadScript = $this->buildDir . '/preload.php';
- $template = <<<'php'
-files()->name('*.php')->in([
- $vendorDir . '/nikic/php-parser/lib/PhpParser',
- $vendorDir . '/phpstan/phpdoc-parser/src',
- ]) as $phpFile) {
- $realPath = $phpFile->getRealPath();
- if ($realPath === false) {
- return;
- }
- $path = substr($realPath, strlen($root));
- $output .= 'require_once __DIR__ . ' . var_export($path, true) . ';' . "\n";
- }
-
- file_put_contents($preloadScript, sprintf($template, $output));
- }
-
- private function deleteUnnecessaryVendorCode(): void
- {
- $vendorDir = $this->buildDir . '/vendor';
- if (!is_dir($vendorDir . '/nikic/php-parser')) {
- return;
- }
-
- @unlink($vendorDir . '/nikic/php-parser/grammar/rebuildParsers.php');
- @unlink($vendorDir . '/nikic/php-parser/bin/php-parse');
- }
-
- private function patchFile(OutputInterface $output, string $originalFile, string $patchFile): void
- {
- exec(sprintf(
- 'patch -d %s %s %s',
- escapeshellarg($this->buildDir),
- escapeshellarg($originalFile),
- escapeshellarg($patchFile)
- ), $outputLines, $exitCode);
- if ($exitCode === 0) {
- return;
- }
-
- $output->writeln(sprintf('Patching failed: %s', implode("\n", $outputLines)));
- }
-
- private function transformSource(): void
- {
- exec(escapeshellarg(__DIR__ . '/../../../bin/transform-source.php'), $outputLines, $exitCode);
- if ($exitCode === 0) {
- return;
- }
-
- throw new \PHPStan\ShouldNotHappenException(implode("\n", $outputLines));
- }
-
-}
diff --git a/compiler/src/Console/PrepareCommand.php b/compiler/src/Console/PrepareCommand.php
new file mode 100644
index 0000000000..9dbc3e3192
--- /dev/null
+++ b/compiler/src/Console/PrepareCommand.php
@@ -0,0 +1,231 @@
+setName('prepare')
+ ->setDescription('Prepare PHAR');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $this->buildPreloadScript();
+ $this->deleteUnnecessaryVendorCode();
+ $this->fixComposerJson($this->buildDir);
+ $this->renamePhpStormStubs();
+ $this->renamePhp8Stubs();
+ $this->transformSource();
+ return 0;
+ }
+
+ private function fixComposerJson(string $buildDir): void
+ {
+ $json = json_decode($this->filesystem->read($buildDir . '/composer.json'), true);
+
+ unset($json['replace']['phpstan/phpstan']);
+ $json['name'] = 'phpstan/phpstan';
+ $json['require']['php'] = '^7.4|^8.0';
+
+ // simplify autoload (remove not packed build directory]
+ $json['autoload']['psr-4']['PHPStan\\'] = 'src/';
+
+ $encodedJson = json_encode($json, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT);
+ if ($encodedJson === false) {
+ throw new Exception('json_encode() was not successful.');
+ }
+
+ $this->filesystem->write($buildDir . '/composer.json', $encodedJson);
+ }
+
+ private function renamePhpStormStubs(): void
+ {
+ $directory = $this->buildDir . '/vendor/jetbrains/phpstorm-stubs';
+ if (!is_dir($directory)) {
+ return;
+ }
+
+ $stubFinder = Finder::create();
+ $stubsMapPath = realpath($directory . '/PhpStormStubsMap.php');
+ if ($stubsMapPath === false) {
+ throw new Exception('realpath() failed');
+ }
+ foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
+ $path = $stubFile->getPathname();
+ if ($path === $stubsMapPath) {
+ continue;
+ }
+
+ $renameSuccess = rename(
+ $path,
+ dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub',
+ );
+ if ($renameSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not rename %s', $path));
+ }
+ }
+
+ $stubsMapContents = file_get_contents($stubsMapPath);
+ if ($stubsMapContents === false) {
+ throw new ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
+ }
+
+ $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
+
+ $putSuccess = file_put_contents($stubsMapPath, $stubsMapContents);
+ if ($putSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
+ }
+ }
+
+ private function renamePhp8Stubs(): void
+ {
+ $directory = $this->buildDir . '/vendor/phpstan/php-8-stubs/stubs';
+ if (!is_dir($directory)) {
+ return;
+ }
+
+ $stubFinder = Finder::create();
+ $stubsMapPath = $directory . '/../Php8StubsMap.php';
+ foreach ($stubFinder->files()->name('*.php')->in($directory) as $stubFile) {
+ $path = $stubFile->getPathname();
+ if ($path === $stubsMapPath) {
+ continue;
+ }
+
+ $renameSuccess = rename(
+ $path,
+ dirname($path) . '/' . $stubFile->getBasename('.php') . '.stub',
+ );
+ if ($renameSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not rename %s', $path));
+ }
+ }
+
+ $stubsMapContents = file_get_contents($stubsMapPath);
+ if ($stubsMapContents === false) {
+ throw new ShouldNotHappenException(sprintf('Could not read %s', $stubsMapPath));
+ }
+
+ $stubsMapContents = str_replace('.php\',', '.stub\',', $stubsMapContents);
+
+ $putSuccess = file_put_contents($stubsMapPath, $stubsMapContents);
+ if ($putSuccess === false) {
+ throw new ShouldNotHappenException(sprintf('Could not write %s', $stubsMapPath));
+ }
+ }
+
+ private function buildPreloadScript(): void
+ {
+ $vendorDir = $this->buildDir . '/vendor';
+ if (!is_dir($vendorDir . '/nikic/php-parser/lib/PhpParser')) {
+ return;
+ }
+
+ $preloadScript = $this->buildDir . '/preload.php';
+ $template = <<<'php'
+files()->name('*.php')->in([
+ $this->buildDir . '/src',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser',
+ $vendorDir . '/phpstan/phpdoc-parser/src',
+ ])->exclude([
+ 'Testing',
+ ])->sortByName() as $phpFile) {
+ $realPath = $phpFile->getRealPath();
+ if ($realPath === false) {
+ return;
+ }
+ if (in_array($realPath, [
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ArrayItem.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Expr/ClosureUse.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/DeclareDeclare.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/Encapsed.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/EncapsedStringPart.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/PropertyProperty.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/StaticVar.php',
+ $vendorDir . '/nikic/php-parser/lib/PhpParser/Node/Stmt/UseUse.php',
+ ], true)) {
+ continue;
+ }
+ $path = substr($realPath, strlen($root));
+ $output .= 'require_once __DIR__ . ' . var_export($path, true) . ';' . "\n";
+ }
+
+ file_put_contents($preloadScript, sprintf($template, $output));
+ }
+
+ private function deleteUnnecessaryVendorCode(): void
+ {
+ $vendorDir = $this->buildDir . '/vendor';
+ if (!is_dir($vendorDir . '/nikic/php-parser')) {
+ return;
+ }
+
+ @unlink($vendorDir . '/nikic/php-parser/grammar/rebuildParsers.php');
+ @unlink($vendorDir . '/nikic/php-parser/bin/php-parse');
+ }
+
+ private function transformSource(): void
+ {
+ chdir(__DIR__ . '/../../..');
+ exec(escapeshellarg(__DIR__ . '/../../../vendor/bin/simple-downgrade') . ' downgrade -c ' . escapeshellarg('build/downgrade.php') . ' 7.2', $outputLines, $exitCode);
+ if ($exitCode === 0) {
+ return;
+ }
+
+ throw new ShouldNotHappenException(implode("\n", $outputLines));
+ }
+
+}
diff --git a/compiler/src/Filesystem/SymfonyFilesystem.php b/compiler/src/Filesystem/SymfonyFilesystem.php
index 7946e92626..e74d01fd74 100644
--- a/compiler/src/Filesystem/SymfonyFilesystem.php
+++ b/compiler/src/Filesystem/SymfonyFilesystem.php
@@ -2,15 +2,15 @@
namespace PHPStan\Compiler\Filesystem;
+use RuntimeException;
+use function file_get_contents;
+use function file_put_contents;
+
final class SymfonyFilesystem implements Filesystem
{
- /** @var \Symfony\Component\Filesystem\Filesystem */
- private $filesystem;
-
- public function __construct(\Symfony\Component\Filesystem\Filesystem $filesystem)
+ public function __construct(private \Symfony\Component\Filesystem\Filesystem $filesystem)
{
- $this->filesystem = $filesystem;
}
public function exists(string $dir): bool
@@ -32,7 +32,7 @@ public function read(string $file): string
{
$content = file_get_contents($file);
if ($content === false) {
- throw new \RuntimeException();
+ throw new RuntimeException();
}
return $content;
}
diff --git a/compiler/src/Process/DefaultProcessFactory.php b/compiler/src/Process/DefaultProcessFactory.php
deleted file mode 100644
index 3f4a09a6b1..0000000000
--- a/compiler/src/Process/DefaultProcessFactory.php
+++ /dev/null
@@ -1,34 +0,0 @@
-output = new NullOutput();
- }
-
- /**
- * @param string[] $command
- * @param string $cwd
- * @return \PHPStan\Compiler\Process\Process
- */
- public function create(array $command, string $cwd): Process
- {
- return new SymfonyProcess($command, $cwd, $this->output);
- }
-
- public function setOutput(OutputInterface $output): void
- {
- $this->output = $output;
- }
-
-}
diff --git a/compiler/src/Process/Process.php b/compiler/src/Process/Process.php
deleted file mode 100644
index 1bf5d1f25d..0000000000
--- a/compiler/src/Process/Process.php
+++ /dev/null
@@ -1,13 +0,0 @@
-
- */
- public function getProcess(): \Symfony\Component\Process\Process;
-
-}
diff --git a/compiler/src/Process/ProcessFactory.php b/compiler/src/Process/ProcessFactory.php
deleted file mode 100644
index f892601f73..0000000000
--- a/compiler/src/Process/ProcessFactory.php
+++ /dev/null
@@ -1,19 +0,0 @@
- */
- private $process;
-
- /**
- * @param string[] $command
- * @param string $cwd
- * @param \Symfony\Component\Console\Output\OutputInterface $output
- */
- public function __construct(array $command, string $cwd, OutputInterface $output)
- {
- $this->process = (new \Symfony\Component\Process\Process($command, $cwd, null, null, null))
- ->mustRun(static function (string $type, string $buffer) use ($output): void {
- $output->write($buffer);
- });
- }
-
- /**
- * @return \Symfony\Component\Process\Process
- */
- public function getProcess(): \Symfony\Component\Process\Process
- {
- return $this->process;
- }
-
-}
diff --git a/compiler/tests/.phpunit.result.cache b/compiler/tests/.phpunit.result.cache
index 4cf5b2c855..136029df2b 100644
--- a/compiler/tests/.phpunit.result.cache
+++ b/compiler/tests/.phpunit.result.cache
@@ -1 +1 @@
-C:37:"PHPUnit\Runner\DefaultTestResultCache":636:{a:2:{s:7:"defects";a:0:{}s:5:"times";a:8:{s:56:"PHPStan\Compiler\Console\CompileCommandTest::testCommand";d:0.053;s:61:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testExists";d:0.01;s:61:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testRemove";d:0;s:60:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testMkdir";d:0;s:59:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testRead";d:0;s:60:"PHPStan\Compiler\Filesystem\SymfonyFilesystemTest::testWrite";d:0.008;s:62:"PHPStan\Compiler\Process\DefaultProcessFactoryTest::testCreate";d:0.058;s:59:"PHPStan\Compiler\Process\SymfonyProcessTest::testGetProcess";d:0.01;}}}
\ No newline at end of file
+{"version":1,"defects":[],"times":{"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testExists":0.014,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testRemove":0,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testMkdir":0,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testRead":0,"PHPStan\\Compiler\\Filesystem\\SymfonyFilesystemTest::testWrite":0}}
\ No newline at end of file
diff --git a/compiler/tests/Console/CompileCommandTest.php b/compiler/tests/Console/CompileCommandTest.php
deleted file mode 100644
index e40d86d696..0000000000
--- a/compiler/tests/Console/CompileCommandTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-createMock(Filesystem::class);
- $filesystem->expects(self::once())->method('read')->with('bar/composer.json')->willReturn('{"name":"phpstan/phpstan-src","replace":{"phpstan/phpstan": "self.version"},"require":{"php":"^7.4"},"require-dev":1,"autoload-dev":2,"autoload":{"psr-4":{"PHPStan\\\\":[3]}}}');
- $filesystem->expects(self::once())->method('write')->with('bar/composer.json', <<createMock(Process::class);
-
- $processFactory = $this->createMock(ProcessFactory::class);
- $processFactory->expects(self::at(0))->method('setOutput');
- $processFactory->expects(self::at(1))->method('create')->with(['php', 'box.phar', 'compile', '--no-parallel'], 'foo')->willReturn($process);
-
- $application = new Application();
- $application->add(new CompileCommand($filesystem, $processFactory, 'foo', 'bar'));
-
- $command = $application->find('phpstan:compile');
- $commandTester = new CommandTester($command);
- $exitCode = $commandTester->execute([
- 'command' => $command->getName(),
- ]);
-
- self::assertSame(0, $exitCode);
- }
-
-}
diff --git a/compiler/tests/Filesystem/SymfonyFilesystemTest.php b/compiler/tests/Filesystem/SymfonyFilesystemTest.php
index 0d21aff557..5a0f486441 100644
--- a/compiler/tests/Filesystem/SymfonyFilesystemTest.php
+++ b/compiler/tests/Filesystem/SymfonyFilesystemTest.php
@@ -3,13 +3,15 @@
namespace PHPStan\Compiler\Filesystem;
use PHPUnit\Framework\TestCase;
+use Symfony\Component\Filesystem\Filesystem;
+use function unlink;
final class SymfonyFilesystemTest extends TestCase
{
public function testExists(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$inner->expects(self::once())->method('exists')->with('foo')->willReturn(true);
self::assertTrue((new SymfonyFilesystem($inner))->exists('foo'));
@@ -17,7 +19,7 @@ public function testExists(): void
public function testRemove(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$inner->expects(self::once())->method('remove')->with('foo')->willReturn(true);
(new SymfonyFilesystem($inner))->remove('foo');
@@ -25,7 +27,7 @@ public function testRemove(): void
public function testMkdir(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$inner->expects(self::once())->method('mkdir')->with('foo')->willReturn(true);
(new SymfonyFilesystem($inner))->mkdir('foo');
@@ -33,7 +35,7 @@ public function testMkdir(): void
public function testRead(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
$content = (new SymfonyFilesystem($inner))->read(__DIR__ . '/data/composer.json');
self::assertSame("{}\n", $content);
@@ -41,7 +43,7 @@ public function testRead(): void
public function testWrite(): void
{
- $inner = $this->createMock(\Symfony\Component\Filesystem\Filesystem::class);
+ $inner = $this->createMock(Filesystem::class);
@unlink(__DIR__ . '/data/test.json');
(new SymfonyFilesystem($inner))->write(__DIR__ . '/data/test.json', "{}\n");
diff --git a/compiler/tests/Process/DefaultProcessFactoryTest.php b/compiler/tests/Process/DefaultProcessFactoryTest.php
deleted file mode 100644
index 31756e8f18..0000000000
--- a/compiler/tests/Process/DefaultProcessFactoryTest.php
+++ /dev/null
@@ -1,24 +0,0 @@
-createMock(OutputInterface::class);
- $output->expects(self::once())->method('write');
-
- $factory = new DefaultProcessFactory();
- $factory->setOutput($output);
-
- $process = $factory->create(['ls'], __DIR__)->getProcess();
- self::assertSame('\'ls\'', $process->getCommandLine());
- self::assertSame(__DIR__, $process->getWorkingDirectory());
- }
-
-}
diff --git a/compiler/tests/Process/SymfonyProcessTest.php b/compiler/tests/Process/SymfonyProcessTest.php
deleted file mode 100644
index 8124ba1c96..0000000000
--- a/compiler/tests/Process/SymfonyProcessTest.php
+++ /dev/null
@@ -1,21 +0,0 @@
-createMock(OutputInterface::class);
- $output->expects(self::once())->method('write');
-
- $process = (new SymfonyProcess(['ls'], __DIR__, $output))->getProcess();
- self::assertSame('\'ls\'', $process->getCommandLine());
- self::assertSame(__DIR__, $process->getWorkingDirectory());
- }
-
-}
diff --git a/composer.json b/composer.json
index 7050160940..3a585da23c 100644
--- a/composer.json
+++ b/composer.json
@@ -5,57 +5,122 @@
"MIT"
],
"require": {
- "php": "^7.4",
+ "php": "^8.1",
+ "composer-runtime-api": "^2.0",
"clue/ndjson-react": "^1.0",
- "composer/xdebug-handler": "^1.3.0",
+ "composer/ca-bundle": "^1.2",
+ "composer/semver": "^3.4",
+ "composer/xdebug-handler": "^3.0.3",
+ "fidry/cpu-core-counter": "^1.2",
"hoa/compiler": "3.17.08.08",
"hoa/exception": "^1.0",
- "hoa/regex": "1.17.01.13",
- "jean85/pretty-package-versions": "^1.0.3",
- "jetbrains/phpstorm-stubs": "2019.3",
+ "hoa/file": "1.17.07.11",
+ "jetbrains/phpstorm-stubs": "dev-master#b22fb017543bb7147e3bcc53f08fb13a48aff994",
"nette/bootstrap": "^3.0",
- "nette/di": "^3.0",
- "nette/finder": "^2.5",
- "nette/neon": "^3.0",
- "nette/schema": "^1.0",
- "nette/utils": "^3.1.1",
- "nikic/php-parser": "^4.5.0",
- "ondram/ci-detector": "^3.1",
- "ondrejmirtes/better-reflection": "^4.3.9",
- "phpdocumentor/type-resolver": "1.0.1",
- "phpstan/phpdoc-parser": "^0.4.8",
- "react/child-process": "^0.6.1",
- "react/event-loop": "^1.1",
+ "nette/di": "^3.1.4",
+ "nette/neon": "3.3.4",
+ "nette/php-generator": "3.6.9",
+ "nette/schema": "^1.2.2",
+ "nette/utils": "^3.2.5",
+ "nikic/php-parser": "^5.4.0",
+ "ondram/ci-detector": "^3.4.0",
+ "ondrejmirtes/better-reflection": "6.57.0.0",
+ "phpstan/php-8-stubs": "0.4.12",
+ "phpstan/phpdoc-parser": "2.1.0",
+ "psr/http-message": "^1.1",
+ "react/async": "^3",
+ "react/child-process": "^0.7",
+ "react/dns": "^1.10",
+ "react/event-loop": "^1.2",
+ "react/http": "^1.1",
+ "react/promise": "^3.2",
"react/socket": "^1.3",
"react/stream": "^1.1",
- "symfony/console": "^4.3",
- "symfony/finder": "^4.3",
- "symfony/service-contracts": "1.1.8"
+ "symfony/console": "^5.4.3",
+ "symfony/finder": "^5.4.3",
+ "symfony/polyfill-intl-grapheme": "^1.23",
+ "symfony/polyfill-intl-normalizer": "^1.23",
+ "symfony/polyfill-mbstring": "^1.23",
+ "symfony/polyfill-php80": "^1.23",
+ "symfony/polyfill-php81": "^1.27",
+ "symfony/process": "^5.4.3",
+ "symfony/service-contracts": "^2.5.0",
+ "symfony/string": "^5.4.3"
},
"replace": {
- "phpstan/phpstan": "self.version"
+ "phpstan/phpstan": "2.1.x",
+ "symfony/polyfill-php73": "*"
},
"require-dev": {
- "brianium/paratest": "^2.0",
- "ergebnis/composer-normalize": "^2.0.2",
- "nategood/httpful": "^0.2.20",
- "phing/phing": "^2.16.0",
+ "brianium/paratest": "^6.5",
+ "cweagans/composer-patches": "^1.7.3",
+ "ondrejmirtes/simple-downgrader": "^2.0",
"php-parallel-lint/php-parallel-lint": "^1.2.0",
- "phpstan/phpstan-deprecation-rules": "^0.12.3",
- "phpstan/phpstan-php-parser": "^0.12",
- "phpstan/phpstan-phpunit": "^0.12",
- "phpstan/phpstan-strict-rules": "^0.12",
- "phpunit/phpunit": "^7.5.18"
+ "phpstan/phpstan-deprecation-rules": "^2.0.2",
+ "phpstan/phpstan-nette": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "shipmonk/composer-dependency-analyser": "^1.5",
+ "shipmonk/name-collision-detector": "^2.0"
},
"config": {
"platform": {
- "php": "7.4.6"
+ "php": "8.1.99"
},
- "sort-packages": true
+ "platform-check": false,
+ "sort-packages": true,
+ "allow-plugins": {
+ "cweagans/composer-patches": true
+ }
},
"extra": {
- "branch-alias": {
- "dev-master": "0.12-dev"
+ "composer-exit-on-patch-failure": true,
+ "patches": {
+ "composer/ca-bundle": [
+ "patches/cloudflare-ca.patch"
+ ],
+ "hoa/exception": [
+ "patches/Idle.patch"
+ ],
+ "hoa/file": [
+ "patches/File.patch",
+ "patches/Read.patch"
+ ],
+ "hoa/iterator": [
+ "patches/Buffer.patch",
+ "patches/Lookahead.patch"
+ ],
+ "hoa/compiler": [
+ "patches/HoaException.patch",
+ "patches/Invocation.patch",
+ "patches/Rule.patch",
+ "patches/Lexer.patch",
+ "patches/TreeNode.patch"
+ ],
+ "hoa/consistency": [
+ "patches/Consistency.patch"
+ ],
+ "hoa/protocol": [
+ "patches/Node.patch",
+ "patches/Wrapper.patch"
+ ],
+ "hoa/stream": [
+ "patches/Stream.patch"
+ ],
+ "jetbrains/phpstorm-stubs": [
+ "patches/PDO.patch",
+ "patches/ReflectionProperty.patch",
+ "patches/SessionHandler.patch",
+ "patches/xmlreader.patch",
+ "patches/dom_c.patch"
+ ],
+ "nette/di": [
+ "patches/DependencyChecker.patch"
+ ],
+ "react/http": [
+ "patches/Sender.patch"
+ ]
}
},
"autoload": {
@@ -63,7 +128,8 @@
"PHPStan\\": [
"src/"
]
- }
+ },
+ "files": ["src/debugScope.php", "src/dumpType.php", "src/autoloadFunctions.php", "src/Testing/functions.php"]
},
"autoload-dev": {
"psr-4": {
@@ -76,6 +142,83 @@
"tests/PHPStan"
]
},
+ "repositories": [
+ {
+ "type": "package",
+ "package": {
+ "name": "nette/di",
+ "version": "v3.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/di.git",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/di/zipball/00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/neon": "^3.3 || ^4.0",
+ "nette/php-generator": "^3.5.4 || ^4.0",
+ "nette/robot-loader": "^3.2 || ~4.0.0",
+ "nette/schema": "^1.2",
+ "nette/utils": "^3.2.5 || ~4.0.0",
+ "php": "7.2 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "compiled",
+ "di",
+ "dic",
+ "factory",
+ "ioc",
+ "nette",
+ "static"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/di/issues",
+ "source": "https://github.com/nette/di/tree/v3.1.5"
+ },
+ "time": "2023-10-02T19:58:38+00:00"
+ }
+ }
+ ],
"minimum-stability": "dev",
"prefer-stable": true,
"bin": [
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000000..b304bec2cb
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,6465 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "a5aee6235dc8ddeac7b42ed53ce87902",
+ "packages": [
+ {
+ "name": "clue/ndjson-react",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/clue/reactphp-ndjson.git",
+ "reference": "392dc165fce93b5bb5c637b67e59619223c931b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0",
+ "reference": "392dc165fce93b5bb5c637b67e59619223c931b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3",
+ "react/stream": "^1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35",
+ "react/event-loop": "^1.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Clue\\React\\NDJson\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.",
+ "homepage": "https://github.com/clue/reactphp-ndjson",
+ "keywords": [
+ "NDJSON",
+ "json",
+ "jsonlines",
+ "newline",
+ "reactphp",
+ "streaming"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/reactphp-ndjson/issues",
+ "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-23T10:58:28+00:00"
+ },
+ {
+ "name": "composer/ca-bundle",
+ "version": "1.5.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/ca-bundle.git",
+ "reference": "f65c239c970e7f072f067ab78646e9f0b2935175"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/f65c239c970e7f072f067ab78646e9f0b2935175",
+ "reference": "f65c239c970e7f072f067ab78646e9f0b2935175",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^8 || ^9",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
+ "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\CaBundle\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be/"
+ }
+ ],
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+ "keywords": [
+ "cabundle",
+ "cacert",
+ "certificate",
+ "ssl",
+ "tls"
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/ca-bundle/issues",
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.6"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com/",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-06T14:30:56+00:00"
+ },
+ {
+ "name": "composer/pcre",
+ "version": "3.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/pcre.git",
+ "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/pcre/zipball/63aaeac21d7e775ff9bc9d45021e1745c97521c4",
+ "reference": "63aaeac21d7e775ff9bc9d45021e1745c97521c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<1.11.10"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11.10",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8 || ^9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Pcre\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be/"
+ }
+ ],
+ "description": "PCRE wrapping library that offers type-safe preg_* replacements.",
+ "keywords": [
+ "PCRE",
+ "preg",
+ "regex",
+ "regular expression"
+ ],
+ "support": {
+ "issues": "https://github.com/composer/pcre/issues",
+ "source": "https://github.com/composer/pcre/tree/3.3.1"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com/",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-08-27T18:44:43+00:00"
+ },
+ {
+ "name": "composer/semver",
+ "version": "3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.2 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.11",
+ "symfony/phpunit-bridge": "^3 || ^7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de/"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be/"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com",
+ "homepage": "http://robbast.nl/"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/semver/issues",
+ "source": "https://github.com/composer/semver/tree/3.4.3"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com/",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-19T14:15:21+00:00"
+ },
+ {
+ "name": "composer/xdebug-handler",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/xdebug-handler.git",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef",
+ "shasum": ""
+ },
+ "require": {
+ "composer/pcre": "^1 || ^2 || ^3",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Composer\\XdebugHandler\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "John Stevenson",
+ "email": "john-stevenson@blueyonder.co.uk"
+ }
+ ],
+ "description": "Restarts a process without Xdebug.",
+ "keywords": [
+ "Xdebug",
+ "performance"
+ ],
+ "support": {
+ "irc": "ircs://irc.libera.chat:6697/composer",
+ "issues": "https://github.com/composer/xdebug-handler/issues",
+ "source": "https://github.com/composer/xdebug-handler/tree/3.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com/",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-06T16:37:16+00:00"
+ },
+ {
+ "name": "evenement/evenement",
+ "version": "v3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/igorw/evenement.git",
+ "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc",
+ "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9 || ^6"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Evenement\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ }
+ ],
+ "description": "Événement is a very simple event dispatching library for PHP",
+ "keywords": [
+ "event-dispatcher",
+ "event-emitter"
+ ],
+ "support": {
+ "issues": "https://github.com/igorw/evenement/issues",
+ "source": "https://github.com/igorw/evenement/tree/v3.0.2"
+ },
+ "time": "2023-08-08T05:53:35+00:00"
+ },
+ {
+ "name": "fidry/cpu-core-counter",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theofidry/cpu-core-counter.git",
+ "reference": "8520451a140d3f46ac33042715115e290cf5785f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f",
+ "reference": "8520451a140d3f46ac33042715115e290cf5785f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "fidry/makefile": "^0.2.0",
+ "fidry/php-cs-fixer-config": "^1.1.2",
+ "phpstan/extension-installer": "^1.2.0",
+ "phpstan/phpstan": "^1.9.2",
+ "phpstan/phpstan-deprecation-rules": "^1.0.0",
+ "phpstan/phpstan-phpunit": "^1.2.2",
+ "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpunit/phpunit": "^8.5.31 || ^9.5.26",
+ "webmozarts/strict-phpunit": "^7.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Fidry\\CpuCoreCounter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Théo FIDRY",
+ "email": "theo.fidry@gmail.com"
+ }
+ ],
+ "description": "Tiny utility to get the number of CPU cores.",
+ "keywords": [
+ "CPU",
+ "core"
+ ],
+ "support": {
+ "issues": "https://github.com/theofidry/cpu-core-counter/issues",
+ "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theofidry",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-06T10:04:20+00:00"
+ },
+ {
+ "name": "fig/http-message-util",
+ "version": "1.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message-util.git",
+ "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765",
+ "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3 || ^7.0 || ^8.0"
+ },
+ "suggest": {
+ "psr/http-message": "The package containing the PSR-7 interfaces"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fig\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Utility classes and constants for use with PSR-7 (psr/http-message)",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/http-message-util/issues",
+ "source": "https://github.com/php-fig/http-message-util/tree/1.1.5"
+ },
+ "time": "2020-11-24T22:02:12+00:00"
+ },
+ {
+ "name": "hoa/compiler",
+ "version": "3.17.08.08",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Compiler.git",
+ "reference": "aa09caf0bf28adae6654ca6ee415ee2f522672de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Compiler/zipball/aa09caf0bf28adae6654ca6ee415ee2f522672de",
+ "reference": "aa09caf0bf28adae6654ca6ee415ee2f522672de",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/file": "~1.0",
+ "hoa/iterator": "~2.0",
+ "hoa/math": "~1.0",
+ "hoa/protocol": "~1.0",
+ "hoa/regex": "~1.0",
+ "hoa/visitor": "~2.0"
+ },
+ "require-dev": {
+ "hoa/json": "~2.0",
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Compiler\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Compiler library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "algebraic",
+ "ast",
+ "compiler",
+ "context-free",
+ "coverage",
+ "exhaustive",
+ "grammar",
+ "isotropic",
+ "language",
+ "lexer",
+ "library",
+ "ll1",
+ "llk",
+ "parser",
+ "pp",
+ "random",
+ "regular",
+ "rule",
+ "sampler",
+ "syntax",
+ "token",
+ "trace",
+ "uniform"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Compiler",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Compiler/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Compiler"
+ },
+ "abandoned": true,
+ "time": "2017-08-08T07:44:07+00:00"
+ },
+ {
+ "name": "hoa/consistency",
+ "version": "1.17.05.02",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Consistency.git",
+ "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Consistency/zipball/fd7d0adc82410507f332516faf655b6ed22e4c2f",
+ "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/exception": "~1.0",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "hoa/stream": "~1.0",
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Prelude.php"
+ ],
+ "psr-4": {
+ "Hoa\\Consistency\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Consistency library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "autoloader",
+ "callable",
+ "consistency",
+ "entity",
+ "flex",
+ "keyword",
+ "library"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Consistency",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Consistency/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Consistency"
+ },
+ "abandoned": true,
+ "time": "2017-05-02T12:18:12+00:00"
+ },
+ {
+ "name": "hoa/event",
+ "version": "1.17.01.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Event.git",
+ "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Event/zipball/6c0060dced212ffa3af0e34bb46624f990b29c54",
+ "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Event\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Event library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "event",
+ "library",
+ "listener",
+ "observer"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Event",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Event/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Event"
+ },
+ "abandoned": true,
+ "time": "2017-01-13T15:30:50+00:00"
+ },
+ {
+ "name": "hoa/exception",
+ "version": "1.17.01.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Exception.git",
+ "reference": "091727d46420a3d7468ef0595651488bfc3a458f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Exception/zipball/091727d46420a3d7468ef0595651488bfc3a458f",
+ "reference": "091727d46420a3d7468ef0595651488bfc3a458f",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/event": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Exception\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Exception library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "exception",
+ "library"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Exception",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Exception/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Exception"
+ },
+ "abandoned": true,
+ "time": "2017-01-16T07:53:27+00:00"
+ },
+ {
+ "name": "hoa/file",
+ "version": "1.17.07.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/File.git",
+ "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/File/zipball/35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
+ "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/event": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/iterator": "~2.0",
+ "hoa/stream": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\File\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\File library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "Socket",
+ "directory",
+ "file",
+ "finder",
+ "library",
+ "link",
+ "temporary"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/File",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/File/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/File"
+ },
+ "abandoned": true,
+ "time": "2017-07-11T07:42:15+00:00"
+ },
+ {
+ "name": "hoa/iterator",
+ "version": "2.17.01.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Iterator.git",
+ "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Iterator/zipball/d1120ba09cb4ccd049c86d10058ab94af245f0cc",
+ "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Iterator\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Iterator library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "iterator",
+ "library"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Iterator",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Iterator/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Iterator"
+ },
+ "abandoned": true,
+ "time": "2017-01-10T10:34:47+00:00"
+ },
+ {
+ "name": "hoa/math",
+ "version": "1.17.05.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Math.git",
+ "reference": "7150785d30f5d565704912116a462e9f5bc83a0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Math/zipball/7150785d30f5d565704912116a462e9f5bc83a0c",
+ "reference": "7150785d30f5d565704912116a462e9f5bc83a0c",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/compiler": "~3.0",
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/iterator": "~2.0",
+ "hoa/protocol": "~1.0",
+ "hoa/zformat": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Math\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Math library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "arrangement",
+ "combination",
+ "combinatorics",
+ "counting",
+ "library",
+ "math",
+ "permutation",
+ "sampler",
+ "set"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Math",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Math/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Math"
+ },
+ "abandoned": true,
+ "time": "2017-05-16T08:02:17+00:00"
+ },
+ {
+ "name": "hoa/protocol",
+ "version": "1.17.01.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Protocol.git",
+ "reference": "5c2cf972151c45f373230da170ea015deecf19e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Protocol/zipball/5c2cf972151c45f373230da170ea015deecf19e2",
+ "reference": "5c2cf972151c45f373230da170ea015deecf19e2",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "Wrapper.php"
+ ],
+ "psr-4": {
+ "Hoa\\Protocol\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Protocol library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "protocol",
+ "resource",
+ "stream",
+ "wrapper"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Protocol",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Protocol/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Protocol"
+ },
+ "abandoned": true,
+ "time": "2017-01-14T12:26:10+00:00"
+ },
+ {
+ "name": "hoa/regex",
+ "version": "1.17.01.13",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Regex.git",
+ "reference": "7e263a61b6fb45c1d03d8e5ef77668518abd5bec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Regex/zipball/7e263a61b6fb45c1d03d8e5ef77668518abd5bec",
+ "reference": "7e263a61b6fb45c1d03d8e5ef77668518abd5bec",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/math": "~1.0",
+ "hoa/protocol": "~1.0",
+ "hoa/ustring": "~4.0",
+ "hoa/visitor": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Regex\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Regex library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "compiler",
+ "library",
+ "regex"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Regex",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Regex/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Regex"
+ },
+ "abandoned": true,
+ "time": "2017-01-13T16:10:24+00:00"
+ },
+ {
+ "name": "hoa/stream",
+ "version": "1.17.02.21",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Stream.git",
+ "reference": "3293cfffca2de10525df51436adf88a559151d82"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Stream/zipball/3293cfffca2de10525df51436adf88a559151d82",
+ "reference": "3293cfffca2de10525df51436adf88a559151d82",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/event": "~1.0",
+ "hoa/exception": "~1.0",
+ "hoa/protocol": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Stream\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Stream library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "Context",
+ "bucket",
+ "composite",
+ "filter",
+ "in",
+ "library",
+ "out",
+ "protocol",
+ "stream",
+ "wrapper"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Stream",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Stream/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Stream"
+ },
+ "abandoned": true,
+ "time": "2017-02-21T16:01:06+00:00"
+ },
+ {
+ "name": "hoa/ustring",
+ "version": "4.17.01.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Ustring.git",
+ "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Ustring/zipball/e6326e2739178799b1fe3fdd92029f9517fa17a0",
+ "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "suggest": {
+ "ext-iconv": "ext/iconv must be present (or a third implementation) to use Hoa\\Ustring::transcode().",
+ "ext-intl": "To get a better Hoa\\Ustring::toAscii() and Hoa\\Ustring::compareTo()."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Ustring\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Ustring library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "search",
+ "string",
+ "unicode"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Ustring",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Ustring/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Ustring"
+ },
+ "abandoned": true,
+ "time": "2017-01-16T07:08:25+00:00"
+ },
+ {
+ "name": "hoa/visitor",
+ "version": "2.17.01.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Visitor.git",
+ "reference": "c18fe1cbac98ae449e0d56e87469103ba08f224a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Visitor/zipball/c18fe1cbac98ae449e0d56e87469103ba08f224a",
+ "reference": "c18fe1cbac98ae449e0d56e87469103ba08f224a",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0"
+ },
+ "require-dev": {
+ "hoa/test": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Visitor\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Visitor library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "structure",
+ "visit",
+ "visitor"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Visitor",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Visitor/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Visitor"
+ },
+ "abandoned": true,
+ "time": "2017-01-16T07:02:03+00:00"
+ },
+ {
+ "name": "hoa/zformat",
+ "version": "1.17.01.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hoaproject/Zformat.git",
+ "reference": "522c381a2a075d4b9dbb42eb4592dd09520e4ac2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hoaproject/Zformat/zipball/522c381a2a075d4b9dbb42eb4592dd09520e4ac2",
+ "reference": "522c381a2a075d4b9dbb42eb4592dd09520e4ac2",
+ "shasum": ""
+ },
+ "require": {
+ "hoa/consistency": "~1.0",
+ "hoa/exception": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Hoa\\Zformat\\": "."
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ivan Enderlin",
+ "email": "ivan.enderlin@hoa-project.net"
+ },
+ {
+ "name": "Hoa community",
+ "homepage": "https://hoa-project.net/"
+ }
+ ],
+ "description": "The Hoa\\Zformat library.",
+ "homepage": "https://hoa-project.net/",
+ "keywords": [
+ "library",
+ "parameter",
+ "zformat"
+ ],
+ "support": {
+ "docs": "https://central.hoa-project.net/Documentation/Library/Zformat",
+ "email": "support@hoa-project.net",
+ "forum": "https://users.hoa-project.net/",
+ "irc": "irc://chat.freenode.net/hoaproject",
+ "issues": "https://github.com/hoaproject/Zformat/issues",
+ "source": "https://central.hoa-project.net/Resource/Library/Zformat"
+ },
+ "abandoned": true,
+ "time": "2017-01-10T10:39:54+00:00"
+ },
+ {
+ "name": "jetbrains/phpstorm-stubs",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JetBrains/phpstorm-stubs.git",
+ "reference": "b22fb017543bb7147e3bcc53f08fb13a48aff994"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/JetBrains/phpstorm-stubs/zipball/b22fb017543bb7147e3bcc53f08fb13a48aff994",
+ "reference": "b22fb017543bb7147e3bcc53f08fb13a48aff994",
+ "shasum": ""
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v3.64.0",
+ "nikic/php-parser": "^v5.3.1",
+ "phpdocumentor/reflection-docblock": "^5.6.0",
+ "phpunit/phpunit": "^11.4.3"
+ },
+ "default-branch": true,
+ "type": "library",
+ "autoload": {
+ "files": [
+ "PhpStormStubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "PHP runtime & extensions header files for PhpStorm",
+ "homepage": "https://www.jetbrains.com/phpstorm",
+ "keywords": [
+ "autocomplete",
+ "code",
+ "inference",
+ "inspection",
+ "jetbrains",
+ "phpstorm",
+ "stubs",
+ "type"
+ ],
+ "support": {
+ "source": "https://github.com/JetBrains/phpstorm-stubs/tree/master"
+ },
+ "time": "2025-04-22T16:22:26+00:00"
+ },
+ {
+ "name": "nette/bootstrap",
+ "version": "v3.1.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/bootstrap.git",
+ "reference": "1a7965b4ee401ad0e3f673b9c016d2481afdc280"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/bootstrap/zipball/1a7965b4ee401ad0e3f673b9c016d2481afdc280",
+ "reference": "1a7965b4ee401ad0e3f673b9c016d2481afdc280",
+ "shasum": ""
+ },
+ "require": {
+ "nette/di": "^3.0.5",
+ "nette/utils": "^3.2.1 || ^4.0",
+ "php": ">=7.2 <8.3"
+ },
+ "conflict": {
+ "tracy/tracy": "<2.6"
+ },
+ "require-dev": {
+ "latte/latte": "^2.8",
+ "nette/application": "^3.1",
+ "nette/caching": "^3.0",
+ "nette/database": "^3.0",
+ "nette/forms": "^3.0",
+ "nette/http": "^3.0",
+ "nette/mail": "^3.0",
+ "nette/robot-loader": "^3.0",
+ "nette/safe-stream": "^2.2",
+ "nette/security": "^3.0",
+ "nette/tester": "^2.0",
+ "phpstan/phpstan-nette": "^0.12",
+ "tracy/tracy": "^2.6"
+ },
+ "suggest": {
+ "nette/robot-loader": "to use Configurator::createRobotLoader()",
+ "tracy/tracy": "to use Configurator::enableTracy()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "bootstrapping",
+ "configurator",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/bootstrap/issues",
+ "source": "https://github.com/nette/bootstrap/tree/v3.1.4"
+ },
+ "time": "2022-12-14T15:23:02+00:00"
+ },
+ {
+ "name": "nette/di",
+ "version": "v3.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/di.git",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/di/zipball/00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "reference": "00ea0afa643b3b4383a5cd1a322656c989ade498",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/neon": "^3.3 || ^4.0",
+ "nette/php-generator": "^3.5.4 || ^4.0",
+ "nette/robot-loader": "^3.2 || ~4.0.0",
+ "nette/schema": "^1.2",
+ "nette/utils": "^3.2.5 || ~4.0.0",
+ "php": "7.2 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP features.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "compiled",
+ "di",
+ "dic",
+ "factory",
+ "ioc",
+ "nette",
+ "static"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/di/issues",
+ "source": "https://github.com/nette/di/tree/v3.1.5"
+ },
+ "time": "2023-10-02T19:58:38+00:00"
+ },
+ {
+ "name": "nette/finder",
+ "version": "v2.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/finder.git",
+ "reference": "991aefb42860abeab8e003970c3809a9d83cb932"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/finder/zipball/991aefb42860abeab8e003970c3809a9d83cb932",
+ "reference": "991aefb42860abeab8e003970c3809a9d83cb932",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.4 || ^3.0",
+ "php": ">=7.1"
+ },
+ "conflict": {
+ "nette/nette": "<2.2"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.6-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🔍 Nette Finder: find files and directories with an intuitive API.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "filesystem",
+ "glob",
+ "iterator",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/finder/issues",
+ "source": "https://github.com/nette/finder/tree/v2.6.0"
+ },
+ "time": "2022-10-13T01:31:15+00:00"
+ },
+ {
+ "name": "nette/neon",
+ "version": "v3.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/neon.git",
+ "reference": "bb88bf3a54dd21bf4dbddb5cd525d7b0c61b7cda"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/neon/zipball/bb88bf3a54dd21bf4dbddb5cd525d7b0c61b7cda",
+ "reference": "bb88bf3a54dd21bf4dbddb5cd525d7b0c61b7cda",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "7.1 - 8.4"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.7"
+ },
+ "bin": [
+ "bin/neon-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
+ "homepage": "https://ne-on.org/",
+ "keywords": [
+ "export",
+ "import",
+ "neon",
+ "nette",
+ "yaml"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/neon/issues",
+ "source": "https://github.com/nette/neon/tree/v3.3.4"
+ },
+ "time": "2024-10-04T22:17:24+00:00"
+ },
+ {
+ "name": "nette/php-generator",
+ "version": "v3.6.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/php-generator.git",
+ "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/php-generator/zipball/d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6",
+ "reference": "d31782f7bd2ae84ad06f863391ec3fb77ca4d0a6",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^3.1.2",
+ "php": ">=7.2 <8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "nikic/php-parser": "^4.13",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.8"
+ },
+ "suggest": {
+ "nikic/php-parser": "to use ClassType::withBodiesFrom() & GlobalFunction::withBodyFrom()"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.1 features.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "code",
+ "nette",
+ "php",
+ "scaffolding"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/php-generator/issues",
+ "source": "https://github.com/nette/php-generator/tree/v3.6.9"
+ },
+ "time": "2022-10-04T11:49:47+00:00"
+ },
+ {
+ "name": "nette/robot-loader",
+ "version": "v3.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/robot-loader.git",
+ "reference": "e2adc334cb958164c050f485d99c44c430f51fe2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/robot-loader/zipball/e2adc334cb958164c050f485d99c44c430f51fe2",
+ "reference": "e2adc334cb958164c050f485d99c44c430f51fe2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "nette/finder": "^2.5 || ^3.0",
+ "nette/utils": "^3.0",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "nette/tester": "^2.0",
+ "phpstan/phpstan": "^0.12",
+ "tracy/tracy": "^2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍀 Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "autoload",
+ "class",
+ "interface",
+ "nette",
+ "trait"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/robot-loader/issues",
+ "source": "https://github.com/nette/robot-loader/tree/v3.4.1"
+ },
+ "time": "2021-08-25T15:53:54+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
+ "php": "7.1 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.3 || ^2.4",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.2.5"
+ },
+ "time": "2023-10-05T20:37:59+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v3.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2 <8.4"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "~2.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+ "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v3.2.10"
+ },
+ "time": "2023-07-30T15:38:18+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494",
+ "reference": "447a020a1f875a434d62f2a401f53b82a396e494",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0"
+ },
+ "time": "2024-12-30T11:07:19+00:00"
+ },
+ {
+ "name": "ondram/ci-detector",
+ "version": "3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/OndraM/ci-detector.git",
+ "reference": "594e61252843b68998bddd48078c5058fe9028bd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/OndraM/ci-detector/zipball/594e61252843b68998bddd48078c5058fe9028bd",
+ "reference": "594e61252843b68998bddd48078c5058fe9028bd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.2",
+ "lmc/coding-standard": "^1.3 || ^2.0",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpstan/extension-installer": "^1.0.3",
+ "phpstan/phpstan": "^0.12.0",
+ "phpstan/phpstan-phpunit": "^0.12.1",
+ "phpunit/phpunit": "^7.1 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "OndraM\\CiDetector\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ondřej Machulda",
+ "email": "ondrej.machulda@gmail.com"
+ }
+ ],
+ "description": "Detect continuous integration environment and provide unified access to properties of current build",
+ "keywords": [
+ "CircleCI",
+ "Codeship",
+ "Wercker",
+ "adapter",
+ "appveyor",
+ "aws",
+ "aws codebuild",
+ "bamboo",
+ "bitbucket",
+ "buddy",
+ "ci-info",
+ "codebuild",
+ "continuous integration",
+ "continuousphp",
+ "drone",
+ "github",
+ "gitlab",
+ "interface",
+ "jenkins",
+ "teamcity",
+ "travis"
+ ],
+ "support": {
+ "issues": "https://github.com/OndraM/ci-detector/issues",
+ "source": "https://github.com/OndraM/ci-detector/tree/main"
+ },
+ "time": "2020-09-04T11:21:14+00:00"
+ },
+ {
+ "name": "ondrejmirtes/better-reflection",
+ "version": "6.57.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ondrejmirtes/BetterReflection.git",
+ "reference": "dcc22b90a63497f3450dd5eed62197bc46937297"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ondrejmirtes/BetterReflection/zipball/dcc22b90a63497f3450dd5eed62197bc46937297",
+ "reference": "dcc22b90a63497f3450dd5eed62197bc46937297",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "jetbrains/phpstorm-stubs": "dev-master#dfcad4524db603bd20bdec3aab1a31c5f5128ea3",
+ "nikic/php-parser": "^5.4.0",
+ "php": "^7.4 || ^8.0"
+ },
+ "conflict": {
+ "thecodingmachine/safe": "<1.1.3"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12.0.0",
+ "phpstan/phpstan": "^1.10.60",
+ "phpstan/phpstan-phpunit": "^1.3.16",
+ "phpunit/phpunit": "^11.5.7",
+ "rector/rector": "1.2.10"
+ },
+ "suggest": {
+ "composer/composer": "Required to use the ComposerSourceLocator"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\BetterReflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "James Titcumb",
+ "email": "james@asgrim.com",
+ "homepage": "https://github.com/asgrim"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ },
+ {
+ "name": "Gary Hockin",
+ "email": "gary@roave.com",
+ "homepage": "https://github.com/geeh"
+ },
+ {
+ "name": "Jaroslav Hanslík",
+ "email": "kukulich@kukulich.cz",
+ "homepage": "https://github.com/kukulich"
+ }
+ ],
+ "description": "Better Reflection - an improved code reflection API",
+ "support": {
+ "source": "https://github.com/ondrejmirtes/BetterReflection/tree/6.57.0.0"
+ },
+ "time": "2025-02-12T21:16:38+00:00"
+ },
+ {
+ "name": "phpstan/php-8-stubs",
+ "version": "0.4.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/php-8-stubs.git",
+ "reference": "d8f8290313e4fd1b4840c553a8492eff31ad54eb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/php-8-stubs/zipball/d8f8290313e4fd1b4840c553a8492eff31ad54eb",
+ "reference": "d8f8290313e4fd1b4840c553a8492eff31ad54eb",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Php8StubsMap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT",
+ "PHP-3.01"
+ ],
+ "description": "PHP stubs extracted from php-src",
+ "support": {
+ "issues": "https://github.com/phpstan/php-8-stubs/issues",
+ "source": "https://github.com/phpstan/php-8-stubs/tree/0.4.12"
+ },
+ "time": "2025-04-15T00:22:00+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
+ "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0"
+ },
+ "time": "2025-02-19T13:28:12+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea",
+ "reference": "513e0666f7216c7459170d56df27dfcefe1689ea",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/1.1.2"
+ },
+ "time": "2021-11-05T16:50:12+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+ "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/1.1"
+ },
+ "time": "2023-04-04T09:50:52+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376",
+ "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/2.0.0"
+ },
+ "time": "2021-07-14T16:41:46+00:00"
+ },
+ {
+ "name": "react/async",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/async.git",
+ "reference": "bc3ef672b33e95bf814fe8377731e46888ed4b54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/async/zipball/bc3ef672b33e95bf814fe8377731e46888ed4b54",
+ "reference": "bc3ef672b33e95bf814fe8377731e46888ed4b54",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.0 || ^2.8 || ^1.2.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "1.10.39 || 1.4.10",
+ "phpunit/phpunit": "^9.6 || ^7.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async utilities for ReactPHP",
+ "keywords": [
+ "async",
+ "reactphp"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/async/issues",
+ "source": "https://github.com/reactphp/async/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2023-11-22T16:21:11+00:00"
+ },
+ {
+ "name": "react/cache",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/cache.git",
+ "reference": "d47c472b64aa5608225f47965a484b75c7817d5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b",
+ "reference": "d47c472b64aa5608225f47965a484b75c7817d5b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "react/promise": "^3.0 || ^2.0 || ^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async, Promise-based cache interface for ReactPHP",
+ "keywords": [
+ "cache",
+ "caching",
+ "promise",
+ "reactphp"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/cache/issues",
+ "source": "https://github.com/reactphp/cache/tree/v1.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2022-11-30T15:59:55+00:00"
+ },
+ {
+ "name": "react/child-process",
+ "version": "0.7.x-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/child-process.git",
+ "reference": "ce2654d21d2a749e0a6142d00432e65ba003a2d9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/child-process/zipball/ce2654d21d2a749e0a6142d00432e65ba003a2d9",
+ "reference": "ce2654d21d2a749e0a6142d00432e65ba003a2d9",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.0",
+ "react/event-loop": "^1.2",
+ "react/stream": "^1.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/socket": "^1.16",
+ "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0"
+ },
+ "default-branch": true,
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\ChildProcess\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Event-driven library for executing child processes with ReactPHP.",
+ "keywords": [
+ "event-driven",
+ "process",
+ "reactphp"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/child-process/issues",
+ "source": "https://github.com/reactphp/child-process/tree/0.7.x"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-08-04T20:30:51+00:00"
+ },
+ {
+ "name": "react/dns",
+ "version": "v1.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/dns.git",
+ "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
+ "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "react/cache": "^1.0 || ^0.6 || ^0.5",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.7 || ^1.2.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.3 || ^3 || ^2",
+ "react/promise-timer": "^1.11"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Dns\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async DNS resolver for ReactPHP",
+ "keywords": [
+ "async",
+ "dns",
+ "dns-resolver",
+ "reactphp"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/dns/issues",
+ "source": "https://github.com/reactphp/dns/tree/v1.13.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-06-13T14:18:03+00:00"
+ },
+ {
+ "name": "react/event-loop",
+ "version": "v1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/event-loop.git",
+ "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+ "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+ },
+ "suggest": {
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\EventLoop\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
+ "keywords": [
+ "asynchronous",
+ "event-loop"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/event-loop/issues",
+ "source": "https://github.com/reactphp/event-loop/tree/v1.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2023-11-13T13:48:05+00:00"
+ },
+ {
+ "name": "react/http",
+ "version": "v1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/http.git",
+ "reference": "8111281ee57f22b7194f5dba225e609ba7ce4d20"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/http/zipball/8111281ee57f22b7194f5dba225e609ba7ce4d20",
+ "reference": "8111281ee57f22b7194f5dba225e609ba7ce4d20",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "fig/http-message-util": "^1.1",
+ "php": ">=5.3.0",
+ "psr/http-message": "^1.0",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3 || ^2.3 || ^1.2.1",
+ "react/socket": "^1.12",
+ "react/stream": "^1.2"
+ },
+ "require-dev": {
+ "clue/http-proxy-react": "^1.8",
+ "clue/reactphp-ssh-proxy": "^1.4",
+ "clue/socks-react": "^1.4",
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4 || ^3 || ^2",
+ "react/promise-stream": "^1.4",
+ "react/promise-timer": "^1.9"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Http\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP",
+ "keywords": [
+ "async",
+ "client",
+ "event-driven",
+ "http",
+ "http client",
+ "http server",
+ "https",
+ "psr-7",
+ "reactphp",
+ "server",
+ "streaming"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/http/issues",
+ "source": "https://github.com/reactphp/http/tree/v1.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-03-27T17:20:46+00:00"
+ },
+ {
+ "name": "react/promise",
+ "version": "v3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "8a164643313c71354582dc850b42b33fa12a4b63"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/8a164643313c71354582dc850b42b33fa12a4b63",
+ "reference": "8a164643313c71354582dc850b42b33fa12a4b63",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "1.10.39 || 1.4.10",
+ "phpunit/phpunit": "^9.6 || ^7.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "React\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+ "keywords": [
+ "promise",
+ "promises"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/promise/issues",
+ "source": "https://github.com/reactphp/promise/tree/v3.2.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-05-24T10:39:05+00:00"
+ },
+ {
+ "name": "react/socket",
+ "version": "v1.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/socket.git",
+ "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
+ "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.0",
+ "react/dns": "^1.13",
+ "react/event-loop": "^1.2",
+ "react/promise": "^3.2 || ^2.6 || ^1.2.1",
+ "react/stream": "^1.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36",
+ "react/async": "^4.3 || ^3.3 || ^2",
+ "react/promise-stream": "^1.4",
+ "react/promise-timer": "^1.11"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Socket\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
+ "keywords": [
+ "Connection",
+ "Socket",
+ "async",
+ "reactphp",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/socket/issues",
+ "source": "https://github.com/reactphp/socket/tree/v1.16.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-07-26T10:38:09+00:00"
+ },
+ {
+ "name": "react/stream",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/stream.git",
+ "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d",
+ "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d",
+ "shasum": ""
+ },
+ "require": {
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.8",
+ "react/event-loop": "^1.2"
+ },
+ "require-dev": {
+ "clue/stream-filter": "~1.2",
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "React\\Stream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
+ }
+ ],
+ "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
+ "keywords": [
+ "event-driven",
+ "io",
+ "non-blocking",
+ "pipe",
+ "reactphp",
+ "readable",
+ "stream",
+ "writable"
+ ],
+ "support": {
+ "issues": "https://github.com/reactphp/stream/issues",
+ "source": "https://github.com/reactphp/stream/tree/v1.4.0"
+ },
+ "funding": [
+ {
+ "url": "https://opencollective.com/reactphp",
+ "type": "open_collective"
+ }
+ ],
+ "time": "2024-06-11T12:45:25+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.4.47",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
+ "reference": "c4ba980ca61a9eb18ee6bcc73f28e475852bb1ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.16",
+ "symfony/service-contracts": "^1.1|^2|^3",
+ "symfony/string": "^5.1|^6.0"
+ },
+ "conflict": {
+ "psr/log": ">=3",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2",
+ "symfony/config": "^4.4|^5.0|^6.0",
+ "symfony/dependency-injection": "^4.4|^5.0|^6.0",
+ "symfony/event-dispatcher": "^4.4|^5.0|^6.0",
+ "symfony/lock": "^4.4|^5.0|^6.0",
+ "symfony/process": "^4.4|^5.0|^6.0",
+ "symfony/var-dumper": "^4.4|^5.0|^6.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v5.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-06T11:30:55+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:32:20+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.4.45",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "63741784cd7b9967975eec610b256eed3ede022b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/63741784cd7b9967975eec610b256eed3ede022b",
+ "reference": "63741784cd7b9967975eec610b256eed3ede022b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1|^3",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v5.4.45"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-28T13:32:08+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v5.4.40",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/deedcb3bb4669cae2148bc920eafd2b16dc7c046",
+ "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v5.4.40"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-31T14:33:22+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.5.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f37b419f7aea2e9abf10abd261832cace12e3300"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f37b419f7aea2e9abf10abd261832cace12e3300",
+ "reference": "f37b419f7aea2e9abf10abd261832cace12e3300",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.1",
+ "symfony/deprecation-contracts": "^2.1|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "2.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v2.5.4"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:11:13+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.4.47",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "136ca7d72f72b599f2631aca474a4f8e26719799"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/136ca7d72f72b599f2631aca474a4f8e26719799",
+ "reference": "136ca7d72f72b599f2631aca474a4f8e26719799",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "conflict": {
+ "symfony/translation-contracts": ">=3.0"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0|^6.0",
+ "symfony/http-client": "^4.4|^5.0|^6.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0|^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v5.4.47"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-10T20:33:58+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "brianium/paratest",
+ "version": "v6.6.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paratestphp/paratest.git",
+ "reference": "f2d781bb9136cda2f5e73ee778049e80ba681cf6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/f2d781bb9136cda2f5e73ee778049e80ba681cf6",
+ "reference": "f2d781bb9136cda2f5e73ee778049e80ba681cf6",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-simplexml": "*",
+ "jean85/pretty-package-versions": "^2.0.5",
+ "php": "^7.3 || ^8.0",
+ "phpunit/php-code-coverage": "^9.2.16",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-timer": "^5.0.3",
+ "phpunit/phpunit": "^9.5.23",
+ "sebastian/environment": "^5.1.4",
+ "symfony/console": "^5.4.9 || ^6.1.2",
+ "symfony/polyfill-php80": "^v1.26.0",
+ "symfony/process": "^5.4.8 || ^6.1.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^9.0.0",
+ "ext-pcov": "*",
+ "ext-posix": "*",
+ "infection/infection": "^0.26.13",
+ "malukenho/mcbumpface": "^1.1.5",
+ "squizlabs/php_codesniffer": "^3.7.1",
+ "symfony/filesystem": "^5.4.9 || ^6.1.0",
+ "vimeo/psalm": "^4.26.0"
+ },
+ "bin": [
+ "bin/paratest",
+ "bin/paratest.bat",
+ "bin/paratest_for_phpstorm"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParaTest\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Scaturro",
+ "email": "scaturrob@gmail.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Filippo Tessarotto",
+ "email": "zoeslam@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Parallel testing for PHP",
+ "homepage": "https://github.com/paratestphp/paratest",
+ "keywords": [
+ "concurrent",
+ "parallel",
+ "phpunit",
+ "testing"
+ ],
+ "support": {
+ "issues": "https://github.com/paratestphp/paratest/issues",
+ "source": "https://github.com/paratestphp/paratest/tree/v6.6.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/Slamdunk",
+ "type": "github"
+ },
+ {
+ "url": "https://paypal.me/filippotessarotto",
+ "type": "paypal"
+ }
+ ],
+ "time": "2022-08-25T05:44:14+00:00"
+ },
+ {
+ "name": "cweagans/composer-patches",
+ "version": "1.7.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/cweagans/composer-patches.git",
+ "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+ "reference": "e190d4466fe2b103a55467dfa83fc2fecfcaf2db",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0 || ^2.0",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "composer/composer": "~1.0 || ~2.0",
+ "phpunit/phpunit": "~4.6"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "cweagans\\Composer\\Patches"
+ },
+ "autoload": {
+ "psr-4": {
+ "cweagans\\Composer\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Cameron Eagans",
+ "email": "me@cweagans.net"
+ }
+ ],
+ "description": "Provides a way to patch Composer packages.",
+ "support": {
+ "issues": "https://github.com/cweagans/composer-patches/issues",
+ "source": "https://github.com/cweagans/composer-patches/tree/1.7.3"
+ },
+ "time": "2022-12-20T22:53:13+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
+ {
+ "name": "jean85/pretty-package-versions",
+ "version": "2.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Jean85/pretty-package-versions.git",
+ "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af",
+ "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.0.0",
+ "php": "^7.1|^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.17",
+ "jean85/composer-provided-replaced-stub-package": "^1.0",
+ "phpstan/phpstan": "^0.12.66",
+ "phpunit/phpunit": "^7.5|^8.5|^9.4",
+ "vimeo/psalm": "^4.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Jean85\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alessandro Lai",
+ "email": "alessandro.lai85@gmail.com"
+ }
+ ],
+ "description": "A library to get pretty versions strings of installed dependencies",
+ "keywords": [
+ "composer",
+ "package",
+ "release",
+ "versions"
+ ],
+ "support": {
+ "issues": "https://github.com/Jean85/pretty-package-versions/issues",
+ "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5"
+ },
+ "time": "2021-10-08T21:21:46+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.13.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c",
+ "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-29T12:36:36+00:00"
+ },
+ {
+ "name": "ondrejmirtes/simple-downgrader",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ondrejmirtes/simple-downgrader.git",
+ "reference": "fb8b7833034f0396d5e4518ed090e3d099b7d9bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ondrejmirtes/simple-downgrader/zipball/fb8b7833034f0396d5e4518ed090e3d099b7d9bc",
+ "reference": "fb8b7833034f0396d5e4518ed090e3d099b7d9bc",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^3.2.5",
+ "nikic/php-parser": "^5.3.0",
+ "php": "^7.4|^8.0",
+ "phpstan/phpdoc-parser": "^2.0",
+ "symfony/console": "^5.4",
+ "symfony/finder": "^5.4"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpstan/phpstan": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "bin": [
+ "bin/simple-downgrade"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "SimpleDowngrader\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Simple Downgrader",
+ "support": {
+ "issues": "https://github.com/ondrejmirtes/simple-downgrader/issues",
+ "source": "https://github.com/ondrejmirtes/simple-downgrader/tree/2.0.0"
+ },
+ "time": "2024-10-09T14:55:47+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "php-parallel-lint/php-parallel-lint",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
+ "reference": "6db563514f27e19595a19f45a4bf757b6401194e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6db563514f27e19595a19f45a4bf757b6401194e",
+ "reference": "6db563514f27e19595a19f45a4bf757b6401194e",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=5.3.0"
+ },
+ "replace": {
+ "grogy/php-parallel-lint": "*",
+ "jakub-onderka/php-parallel-lint": "*"
+ },
+ "require-dev": {
+ "nette/tester": "^1.3 || ^2.0",
+ "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
+ "squizlabs/php_codesniffer": "^3.6"
+ },
+ "suggest": {
+ "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+ },
+ "bin": [
+ "parallel-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "./src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "ahoj@jakubonderka.cz"
+ }
+ ],
+ "description": "This tool checks the syntax of PHP files about 20x faster than serial check.",
+ "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+ "keywords": [
+ "lint",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
+ "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.4.0"
+ },
+ "time": "2024-03-27T12:14:49+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-deprecation-rules",
+ "version": "2.0.x-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-deprecation-rules.git",
+ "reference": "15f1d89bd70d9d05c9c99f7698ab8724e5a8431b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/15f1d89bd70d9d05c9c99f7698ab8724e5a8431b",
+ "reference": "15f1d89bd70d9d05c9c99f7698ab8724e5a8431b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.1.13"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "default-branch": true,
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues",
+ "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.x"
+ },
+ "time": "2025-04-19T16:06:02+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-nette",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-nette.git",
+ "reference": "cacb6983bbdf44d5c3a7222e5ca74f61f8531806"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-nette/zipball/cacb6983bbdf44d5c3a7222e5ca74f61f8531806",
+ "reference": "cacb6983bbdf44d5c3a7222e5ca74f61f8531806",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.0"
+ },
+ "conflict": {
+ "nette/application": "<2.3.0",
+ "nette/component-model": "<2.3.0",
+ "nette/di": "<2.3.0",
+ "nette/forms": "<2.3.0",
+ "nette/http": "<2.3.0",
+ "nette/utils": "<2.3.0"
+ },
+ "require-dev": {
+ "nette/application": "^3.0",
+ "nette/di": "^3.1.10",
+ "nette/forms": "^3.0",
+ "nette/utils": "^2.3.0 || ^3.0.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon",
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Nette Framework class reflection extension for PHPStan",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-nette/issues",
+ "source": "https://github.com/phpstan/phpstan-nette/tree/2.0.0"
+ },
+ "time": "2024-10-26T16:03:48+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-phpunit",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-phpunit.git",
+ "reference": "3cc855474263ad6220dfa49167cbea34ca1dd300"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/3cc855474263ad6220dfa49167cbea34ca1dd300",
+ "reference": "3cc855474263ad6220dfa49167cbea34ca1dd300",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<7.0"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon",
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPUnit extensions and rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-phpunit/issues",
+ "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.0"
+ },
+ "time": "2024-10-14T03:16:27+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-strict-rules",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-strict-rules.git",
+ "reference": "a4a6a08bd4a461e516b9c3b8fdbf0f1883b34158"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/a4a6a08bd4a461e516b9c3b8fdbf0f1883b34158",
+ "reference": "a4a6a08bd4a461e516b9c3b8fdbf0f1883b34158",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.0"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Extra strict and opinionated rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.0"
+ },
+ "time": "2024-10-26T16:04:33+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.32",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "9.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-22T04:23:01+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.23",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95",
+ "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.5.0 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.13.1",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.6",
+ "sebastian/global-state": "^5.0.7",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
+ "sebastian/version": "^3.0.2"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.23"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-05-02T06:40:34+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:27:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:41:17+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:19:30+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:30:58+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:33:00+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:35:11+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:20:34+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:07:39+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-14T16:00:52+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13:03+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "shipmonk/composer-dependency-analyser",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/shipmonk-rnd/composer-dependency-analyser.git",
+ "reference": "bca862b2830a453734aee048eb0cdab82e5c9da3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/shipmonk-rnd/composer-dependency-analyser/zipball/bca862b2830a453734aee048eb0cdab82e5c9da3",
+ "reference": "bca862b2830a453734aee048eb0cdab82e5c9da3",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "editorconfig-checker/editorconfig-checker": "^10.3.0",
+ "ergebnis/composer-normalize": "^2.19",
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "phpcompatibility/php-compatibility": "^9.3",
+ "phpstan/phpstan": "^1.10.63",
+ "phpstan/phpstan-phpunit": "^1.1.1",
+ "phpstan/phpstan-strict-rules": "^1.2.3",
+ "phpunit/phpunit": "^8.5.28 || ^9.5.20",
+ "shipmonk/name-collision-detector": "^2.0.0",
+ "slevomat/coding-standard": "^8.0.1"
+ },
+ "bin": [
+ "bin/composer-dependency-analyser"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ShipMonk\\ComposerDependencyAnalyser\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Fast detection of composer dependency issues (dead dependencies, shadow dependencies, misplaced dependencies)",
+ "keywords": [
+ "analyser",
+ "composer",
+ "composer dependency",
+ "dead code",
+ "dead dependency",
+ "detector",
+ "dev",
+ "misplaced dependency",
+ "shadow dependency",
+ "static analysis",
+ "unused code",
+ "unused dependency"
+ ],
+ "support": {
+ "issues": "https://github.com/shipmonk-rnd/composer-dependency-analyser/issues",
+ "source": "https://github.com/shipmonk-rnd/composer-dependency-analyser/tree/1.7.0"
+ },
+ "time": "2024-08-08T08:12:32+00:00"
+ },
+ {
+ "name": "shipmonk/name-collision-detector",
+ "version": "2.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/shipmonk-rnd/name-collision-detector.git",
+ "reference": "e8c8267a9a3774450b64f4cbf0bb035108e78f07"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/shipmonk-rnd/name-collision-detector/zipball/e8c8267a9a3774450b64f4cbf0bb035108e78f07",
+ "reference": "e8c8267a9a3774450b64f4cbf0bb035108e78f07",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nette/schema": "^1.1.0",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "editorconfig-checker/editorconfig-checker": "^10.3.0",
+ "ergebnis/composer-normalize": "^2.19",
+ "phpstan/phpstan": "^1.8.7",
+ "phpstan/phpstan-phpunit": "^1.1.1",
+ "phpstan/phpstan-strict-rules": "^1.2.3",
+ "phpunit/phpunit": "^8.5.28 || ^9.5.20",
+ "shipmonk/composer-dependency-analyser": "^1.0.0",
+ "slevomat/coding-standard": "^8.0.1"
+ },
+ "bin": [
+ "bin/detect-collisions"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ShipMonk\\NameCollision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Simple tool to find ambiguous classes or any other name duplicates within your project.",
+ "keywords": [
+ "ambiguous",
+ "autoload",
+ "autoloading",
+ "classname",
+ "collision",
+ "namespace"
+ ],
+ "support": {
+ "issues": "https://github.com/shipmonk-rnd/name-collision-detector/issues",
+ "source": "https://github.com/shipmonk-rnd/name-collision-detector/tree/2.1.1"
+ },
+ "time": "2024-03-01T13:26:32+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:36:25+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": {
+ "jetbrains/phpstorm-stubs": 20
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1",
+ "composer-runtime-api": "^2.0"
+ },
+ "platform-dev": {},
+ "platform-overrides": {
+ "php": "8.1.99"
+ },
+ "plugin-api-version": "2.6.0"
+}
diff --git a/conf/bleedingEdge.neon b/conf/bleedingEdge.neon
index f3f31c8c80..22487e357c 100644
--- a/conf/bleedingEdge.neon
+++ b/conf/bleedingEdge.neon
@@ -1,5 +1,8 @@
parameters:
featureToggles:
- closureUsesThis: true
- randomIntParameters: true
- nullCoalesce: true
+ bleedingEdge: true
+ checkParameterCastableToNumberFunctions: true
+ skipCheckGenericClasses!: []
+ stricterFunctionMap: true
+ reportPreciseLineForUnusedFunctionParameter: true
+ internalTag: true
diff --git a/conf/config.level0.neon b/conf/config.level0.neon
index ac7867bb3b..24b19d99bf 100644
--- a/conf/config.level0.neon
+++ b/conf/config.level0.neon
@@ -1,93 +1,198 @@
parameters:
customRulesetUsed: false
- missingClosureNativeReturnCheckObjectTypehint: false
-
-conditionalTags:
- PHPStan\Rules\Functions\ClosureUsesThisRule:
- phpstan.rules.rule: %featureToggles.closureUsesThis%
- PHPStan\Rules\Missing\MissingClosureNativeReturnTypehintRule:
- phpstan.rules.rule: %checkMissingClosureNativeReturnTypehintRule%
-
-parametersSchema:
- missingClosureNativeReturnCheckObjectTypehint: bool()
rules:
+ - PHPStan\Rules\Api\ApiInstanceofRule
+ - PHPStan\Rules\Api\ApiInstanceofTypeRule
+ - PHPStan\Rules\Api\ApiInstantiationRule
+ - PHPStan\Rules\Api\ApiClassConstFetchRule
+ - PHPStan\Rules\Api\ApiClassExtendsRule
+ - PHPStan\Rules\Api\ApiClassImplementsRule
+ - PHPStan\Rules\Api\ApiInterfaceExtendsRule
+ - PHPStan\Rules\Api\ApiMethodCallRule
+ - PHPStan\Rules\Api\ApiStaticCallRule
+ - PHPStan\Rules\Api\ApiTraitUseRule
+ - PHPStan\Rules\Api\GetTemplateTypeRule
+ - PHPStan\Rules\Api\NodeConnectingVisitorAttributesRule
+ - PHPStan\Rules\Api\OldPhpParser4ClassRule
+ - PHPStan\Rules\Api\PhpStanNamespaceIn3rdPartyPackageRule
+ - PHPStan\Rules\Api\RuntimeReflectionInstantiationRule
+ - PHPStan\Rules\Api\RuntimeReflectionFunctionRule
- PHPStan\Rules\Arrays\DuplicateKeysInLiteralArraysRule
- PHPStan\Rules\Arrays\OffsetAccessWithoutDimForReadingRule
- - PHPStan\Rules\Classes\ClassConstantDeclarationRule
+ - PHPStan\Rules\Cast\UnsetCastRule
+ - PHPStan\Rules\Classes\AllowedSubTypesRule
+ - PHPStan\Rules\Classes\ClassAttributesRule
+ - PHPStan\Rules\Classes\ClassConstantAttributesRule
- PHPStan\Rules\Classes\ClassConstantRule
- - PHPStan\Rules\Classes\ExistingClassesInClassImplementsRule
- - PHPStan\Rules\Classes\ExistingClassesInInterfaceExtendsRule
- - PHPStan\Rules\Classes\ExistingClassInClassExtendsRule
- - PHPStan\Rules\Classes\ExistingClassInTraitUseRule
- - PHPStan\Rules\Classes\InstantiationRule
+ - PHPStan\Rules\Classes\DuplicateDeclarationRule
+ - PHPStan\Rules\Classes\EnumSanityRule
+ - PHPStan\Rules\Classes\InstantiationCallableRule
+ - PHPStan\Rules\Classes\InvalidPromotedPropertiesRule
+ - PHPStan\Rules\Classes\LocalTypeAliasesRule
+ - PHPStan\Rules\Classes\LocalTypeTraitUseAliasesRule
+ - PHPStan\Rules\Classes\LocalTypeTraitAliasesRule
- PHPStan\Rules\Classes\NewStaticRule
- - PHPStan\Rules\Functions\CallToFunctionParametersRule
+ - PHPStan\Rules\Classes\NonClassAttributeClassRule
+ - PHPStan\Rules\Classes\ReadOnlyClassRule
+ - PHPStan\Rules\Classes\TraitAttributeClassRule
+ - PHPStan\Rules\Constants\ClassAsClassConstantRule
+ - PHPStan\Rules\Constants\DynamicClassConstantFetchRule
+ - PHPStan\Rules\Constants\FinalConstantRule
+ - PHPStan\Rules\Constants\MagicConstantContextRule
+ - PHPStan\Rules\Constants\NativeTypedClassConstantRule
+ - PHPStan\Rules\Constants\FinalPrivateConstantRule
+ - PHPStan\Rules\EnumCases\EnumCaseAttributesRule
+ - PHPStan\Rules\Exceptions\NoncapturingCatchRule
+ - PHPStan\Rules\Exceptions\ThrowExpressionRule
+ - PHPStan\Rules\Functions\ArrowFunctionAttributesRule
+ - PHPStan\Rules\Functions\ArrowFunctionReturnNullsafeByRefRule
+ - PHPStan\Rules\Functions\ClosureAttributesRule
+ - PHPStan\Rules\Functions\DefineParametersRule
- PHPStan\Rules\Functions\ExistingClassesInArrowFunctionTypehintsRule
+ - PHPStan\Rules\Functions\CallToFunctionParametersRule
- PHPStan\Rules\Functions\ExistingClassesInClosureTypehintsRule
- PHPStan\Rules\Functions\ExistingClassesInTypehintsRule
+ - PHPStan\Rules\Functions\FunctionAttributesRule
- PHPStan\Rules\Functions\InnerFunctionRule
+ - PHPStan\Rules\Functions\InvalidLexicalVariablesInClosureUseRule
+ - PHPStan\Rules\Functions\ParamAttributesRule
+ - PHPStan\Rules\Functions\PrintfArrayParametersRule
- PHPStan\Rules\Functions\PrintfParametersRule
+ - PHPStan\Rules\Functions\RedefinedParametersRule
+ - PHPStan\Rules\Functions\ReturnNullsafeByRefRule
+ - PHPStan\Rules\Ignore\IgnoreParseErrorRule
+ - PHPStan\Rules\Functions\VariadicParametersDeclarationRule
+ - PHPStan\Rules\Keywords\ContinueBreakInLoopRule
+ - PHPStan\Rules\Keywords\DeclareStrictTypesRule
- PHPStan\Rules\Methods\AbstractMethodInNonAbstractClassRule
+ - PHPStan\Rules\Methods\AbstractPrivateMethodRule
+ - PHPStan\Rules\Methods\CallMethodsRule
+ - PHPStan\Rules\Methods\CallStaticMethodsRule
+ - PHPStan\Rules\Methods\ConsistentConstructorRule
+ - PHPStan\Rules\Methods\ConstructorReturnTypeRule
- PHPStan\Rules\Methods\ExistingClassesInTypehintsRule
+ - PHPStan\Rules\Methods\FinalPrivateMethodRule
+ - PHPStan\Rules\Methods\MethodCallableRule
+ - PHPStan\Rules\Methods\MethodVisibilityInInterfaceRule
+ - PHPStan\Rules\Methods\MissingMagicSerializationMethodsRule
- PHPStan\Rules\Methods\MissingMethodImplementationRule
+ - PHPStan\Rules\Methods\MethodAttributesRule
+ - PHPStan\Rules\Methods\StaticMethodCallableRule
+ - PHPStan\Rules\Names\UsedNamesRule
+ - PHPStan\Rules\Operators\InvalidAssignVarRule
+ - PHPStan\Rules\Operators\InvalidIncDecOperationRule
- PHPStan\Rules\Properties\AccessPropertiesInAssignRule
- PHPStan\Rules\Properties\AccessStaticPropertiesInAssignRule
- - PHPStan\Rules\Variables\ThisVariableRule
+ - PHPStan\Rules\Properties\ExistingClassesInPropertyHookTypehintsRule
+ - PHPStan\Rules\Properties\InvalidCallablePropertyTypeRule
+ - PHPStan\Rules\Properties\MissingReadOnlyPropertyAssignRule
+ - PHPStan\Rules\Properties\MissingReadOnlyByPhpDocPropertyAssignRule
+ - PHPStan\Rules\Properties\PropertiesInInterfaceRule
+ - PHPStan\Rules\Properties\PropertyAssignRefRule
+ - PHPStan\Rules\Properties\PropertyAttributesRule
+ - PHPStan\Rules\Properties\PropertyHookAttributesRule
+ - PHPStan\Rules\Properties\PropertyInClassRule
+ - PHPStan\Rules\Properties\ReadOnlyPropertyRule
+ - PHPStan\Rules\Properties\ReadOnlyByPhpDocPropertyRule
+ - PHPStan\Rules\Regexp\RegularExpressionPatternRule
+ - PHPStan\Rules\Traits\ConflictingTraitConstantsRule
+ - PHPStan\Rules\Traits\ConstantsInTraitsRule
+ - PHPStan\Rules\Traits\TraitAttributesRule
+ - PHPStan\Rules\Types\InvalidTypesInUnionRule
- PHPStan\Rules\Variables\UnsetRule
+ - PHPStan\Rules\Whitespace\FileWhitespaceRule
+
+conditionalTags:
+ PHPStan\Rules\InternalTag\RestrictedInternalClassConstantUsageExtension:
+ phpstan.restrictedClassConstantUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\InternalTag\RestrictedInternalClassNameUsageExtension:
+ phpstan.restrictedClassNameUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\InternalTag\RestrictedInternalFunctionUsageExtension:
+ phpstan.restrictedFunctionUsageExtension: %featureToggles.internalTag%
services:
+ -
+ class: PHPStan\Rules\Classes\ExistingClassInClassExtendsRule
+ tags:
+ - phpstan.rules.rule
+ arguments:
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Classes\ExistingClassesInClassImplementsRule
+ tags:
+ - phpstan.rules.rule
+ arguments:
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Classes\ExistingClassesInEnumImplementsRule
+ tags:
+ - phpstan.rules.rule
+ arguments:
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
-
class: PHPStan\Rules\Classes\ExistingClassInInstanceOfRule
tags:
- phpstan.rules.rule
arguments:
checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Exceptions\CaughtExceptionExistenceRule
+ class: PHPStan\Rules\Classes\ExistingClassesInInterfaceExtendsRule
tags:
- phpstan.rules.rule
arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Functions\CallToNonExistentFunctionRule
+ class: PHPStan\Rules\Classes\ExistingClassInTraitUseRule
tags:
- phpstan.rules.rule
arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Functions\ClosureUsesThisRule
+ class: PHPStan\Rules\Classes\InstantiationRule
+ tags:
+ - phpstan.rules.rule
+ arguments:
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Methods\CallMethodsRule
+ class: PHPStan\Rules\Exceptions\CaughtExceptionExistenceRule
tags:
- phpstan.rules.rule
arguments:
- checkFunctionNameCase: %checkFunctionNameCase%
- reportMagicMethods: %reportMagicMethods%
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Methods\CallStaticMethodsRule
+ class: PHPStan\Rules\Functions\CallToNonExistentFunctionRule
tags:
- phpstan.rules.rule
arguments:
checkFunctionNameCase: %checkFunctionNameCase%
- reportMagicMethods: %reportMagicMethods%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Methods\OverridingMethodRule
+ class: PHPStan\Rules\Constants\OverridingConstantRule
arguments:
checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Missing\MissingClosureNativeReturnTypehintRule
+ class: PHPStan\Rules\Methods\OverridingMethodRule
arguments:
- checkObjectTypehint: %missingClosureNativeReturnCheckObjectTypehint%
+ checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
+ checkMissingOverrideMethodAttribute: %checkMissingOverrideMethodAttribute%
+ tags:
+ - phpstan.rules.rule
+
-
class: PHPStan\Rules\Missing\MissingReturnRule
@@ -103,6 +208,7 @@ services:
- phpstan.rules.rule
arguments:
checkFunctionNameCase: %checkFunctionNameCase%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
class: PHPStan\Rules\Namespaces\ExistingNamesInUseRule
@@ -110,33 +216,52 @@ services:
- phpstan.rules.rule
arguments:
checkFunctionNameCase: %checkFunctionNameCase%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Properties\AccessPropertiesRule
+ tags:
+ - phpstan.rules.rule
-
- class: PHPStan\Rules\Operators\InvalidIncDecOperationRule
+ class: PHPStan\Rules\Properties\AccessStaticPropertiesRule
tags:
- phpstan.rules.rule
arguments:
- checkThisOnly: %checkThisOnly%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Properties\AccessPropertiesRule
+ class: PHPStan\Rules\Properties\ExistingClassesInPropertiesRule
tags:
- phpstan.rules.rule
arguments:
- reportMagicProperties: %reportMagicProperties%
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ checkThisOnly: %checkThisOnly%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
- class: PHPStan\Rules\Properties\AccessStaticPropertiesRule
+ class: PHPStan\Rules\Functions\FunctionCallableRule
+ arguments:
+ checkFunctionNameCase: %checkFunctionNameCase%
+ reportMaybes: %reportMaybes%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Properties\ExistingClassesInPropertiesRule
+ class: PHPStan\Rules\Properties\OverridingPropertyRule
+ arguments:
+ checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
+ reportMaybes: %reportMaybesInPropertyPhpDocTypes%
tags:
- phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Properties\SetPropertyHookParameterRule
arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
- checkThisOnly: %checkThisOnly%
+ checkPhpDocMethodSignatures: %checkPhpDocMethodSignatures%
+ checkMissingTypehints: %checkMissingTypehints%
+ tags:
+ - phpstan.rules.rule
-
class: PHPStan\Rules\Properties\WritingToReadOnlyPropertiesRule
@@ -168,13 +293,17 @@ services:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Variables\DefinedVariableInAnonymousFunctionUseRule
+ class: PHPStan\Rules\Keywords\RequireFileExistsRule
arguments:
- checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
+ currentWorkingDirectory: %currentWorkingDirectory%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Regexp\RegularExpressionPatternRule
- tags:
- - phpstan.rules.rule
+ class: PHPStan\Rules\InternalTag\RestrictedInternalClassConstantUsageExtension
+
+ -
+ class: PHPStan\Rules\InternalTag\RestrictedInternalClassNameUsageExtension
+
+ -
+ class: PHPStan\Rules\InternalTag\RestrictedInternalFunctionUsageExtension
diff --git a/conf/config.level1.neon b/conf/config.level1.neon
index 2499484180..a1e3872d6b 100644
--- a/conf/config.level1.neon
+++ b/conf/config.level1.neon
@@ -7,17 +7,17 @@ parameters:
reportMagicMethods: true
reportMagicProperties: true
-
-conditionalTags:
- PHPStan\Rules\Variables\VariableCertaintyNullCoalesceRule:
- phpstan.rules.rule: %featureToggles.nullCoalesce%
-
rules:
- PHPStan\Rules\Classes\UnusedConstructorParametersRule
- - PHPStan\Rules\Constants\ConstantRule
- PHPStan\Rules\Functions\UnusedClosureUsesRule
- - PHPStan\Rules\Variables\VariableCertaintyInIssetRule
+ - PHPStan\Rules\Variables\EmptyRule
+ - PHPStan\Rules\Variables\IssetRule
+ - PHPStan\Rules\Variables\NullCoalesceRule
services:
-
- class: PHPStan\Rules\Variables\VariableCertaintyNullCoalesceRule
+ class: PHPStan\Rules\Constants\ConstantRule
+ tags:
+ - phpstan.rules.rule
+ arguments:
+ discoveringSymbolsTip: %tips.discoveringSymbols%
diff --git a/conf/config.level10.neon b/conf/config.level10.neon
new file mode 100644
index 0000000000..5d052692c9
--- /dev/null
+++ b/conf/config.level10.neon
@@ -0,0 +1,5 @@
+includes:
+ - config.level9.neon
+
+parameters:
+ checkImplicitMixed: true
diff --git a/conf/config.level2.neon b/conf/config.level2.neon
index 9ff871b3d4..51214ea554 100644
--- a/conf/config.level2.neon
+++ b/conf/config.level2.neon
@@ -11,44 +11,114 @@ rules:
- PHPStan\Rules\Cast\InvalidCastRule
- PHPStan\Rules\Cast\InvalidPartOfEncapsedStringRule
- PHPStan\Rules\Cast\PrintRule
+ - PHPStan\Rules\Classes\AccessPrivateConstantThroughStaticRule
+ - PHPStan\Rules\Classes\MethodTagRule
+ - PHPStan\Rules\Classes\MethodTagTraitRule
+ - PHPStan\Rules\Classes\MethodTagTraitUseRule
+ - PHPStan\Rules\Classes\PropertyTagRule
+ - PHPStan\Rules\Classes\PropertyTagTraitRule
+ - PHPStan\Rules\Classes\PropertyTagTraitUseRule
+ - PHPStan\Rules\Classes\MixinTraitRule
+ - PHPStan\Rules\Classes\MixinTraitUseRule
+ - PHPStan\Rules\Comparison\UsageOfVoidMatchExpressionRule
+ - PHPStan\Rules\Constants\ValueAssignedToClassConstantRule
- PHPStan\Rules\Functions\IncompatibleDefaultParameterTypeRule
+ - PHPStan\Rules\Functions\IncompatibleArrowFunctionDefaultParameterTypeRule
+ - PHPStan\Rules\Functions\IncompatibleClosureDefaultParameterTypeRule
- PHPStan\Rules\Generics\ClassAncestorsRule
- PHPStan\Rules\Generics\ClassTemplateTypeRule
+ - PHPStan\Rules\Generics\EnumAncestorsRule
+ - PHPStan\Rules\Generics\EnumTemplateTypeRule
- PHPStan\Rules\Generics\FunctionTemplateTypeRule
- PHPStan\Rules\Generics\FunctionSignatureVarianceRule
- PHPStan\Rules\Generics\InterfaceAncestorsRule
- PHPStan\Rules\Generics\InterfaceTemplateTypeRule
- PHPStan\Rules\Generics\MethodTemplateTypeRule
+ - PHPStan\Rules\Generics\MethodTagTemplateTypeRule
+ - PHPStan\Rules\Generics\MethodTagTemplateTypeTraitRule
- PHPStan\Rules\Generics\MethodSignatureVarianceRule
+ - PHPStan\Rules\Generics\PropertyVarianceRule
- PHPStan\Rules\Generics\TraitTemplateTypeRule
+ - PHPStan\Rules\Generics\UsedTraitsRule
+ - PHPStan\Rules\Methods\CallPrivateMethodThroughStaticRule
- PHPStan\Rules\Methods\IncompatibleDefaultParameterTypeRule
- PHPStan\Rules\Operators\InvalidBinaryOperationRule
- - PHPStan\Rules\Operators\InvalidUnaryOperationRule
- PHPStan\Rules\Operators\InvalidComparisonOperationRule
+ - PHPStan\Rules\Operators\InvalidUnaryOperationRule
+ - PHPStan\Rules\PhpDoc\FunctionConditionalReturnTypeRule
+ - PHPStan\Rules\PhpDoc\MethodConditionalReturnTypeRule
+ - PHPStan\Rules\PhpDoc\FunctionAssertRule
+ - PHPStan\Rules\PhpDoc\MethodAssertRule
+ - PHPStan\Rules\PhpDoc\IncompatibleSelfOutTypeRule
+ - PHPStan\Rules\PhpDoc\IncompatibleClassConstantPhpDocTypeRule
- PHPStan\Rules\PhpDoc\IncompatiblePhpDocTypeRule
+ - PHPStan\Rules\PhpDoc\IncompatiblePropertyHookPhpDocTypeRule
- PHPStan\Rules\PhpDoc\IncompatiblePropertyPhpDocTypeRule
- - PHPStan\Rules\PhpDoc\InvalidPhpDocTagValueRule
- - PHPStan\Rules\PhpDoc\InvalidPHPStanDocTagRule
- PHPStan\Rules\PhpDoc\InvalidThrowsPhpDocValueRule
+ - PHPStan\Rules\PhpDoc\IncompatibleParamImmediatelyInvokedCallableRule
+ - PHPStan\Rules\PhpDoc\VarTagChangedExpressionTypeRule
- PHPStan\Rules\PhpDoc\WrongVariableNameInVarTagRule
+ - PHPStan\Rules\Properties\AccessPrivatePropertyThroughStaticRule
+ - PHPStan\Rules\Classes\RequireImplementsRule
+ - PHPStan\Rules\Classes\RequireExtendsRule
+ - PHPStan\Rules\PhpDoc\RequireImplementsDefinitionClassRule
+ - PHPStan\Rules\PhpDoc\RequireExtendsDefinitionClassRule
+ - PHPStan\Rules\PhpDoc\RequireExtendsDefinitionTraitRule
+ - PHPStan\Rules\Pure\PureFunctionRule
+ - PHPStan\Rules\Pure\PureMethodRule
+
+conditionalTags:
+ PHPStan\Rules\InternalTag\RestrictedInternalPropertyUsageExtension:
+ phpstan.restrictedPropertyUsageExtension: %featureToggles.internalTag%
+ PHPStan\Rules\InternalTag\RestrictedInternalMethodUsageExtension:
+ phpstan.restrictedMethodUsageExtension: %featureToggles.internalTag%
services:
-
class: PHPStan\Rules\Classes\MixinRule
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\PhpDoc\RequireExtendsCheck
+ arguments:
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\PhpDoc\RequireImplementsDefinitionTraitRule
arguments:
checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
tags:
- phpstan.rules.rule
+
-
class: PHPStan\Rules\Functions\CallCallablesRule
arguments:
reportMaybes: %reportMaybes%
tags:
- phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\PhpDoc\InvalidPhpDocTagValueRule
+ tags:
+ - phpstan.rules.rule
-
class: PHPStan\Rules\PhpDoc\InvalidPhpDocVarTagTypeRule
arguments:
checkClassCaseSensitivity: %checkClassCaseSensitivity%
checkMissingVarTagTypehint: %checkMissingVarTagTypehint%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
tags:
- phpstan.rules.rule
+ -
+ class: PHPStan\Rules\PhpDoc\InvalidPHPStanDocTagRule
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\InternalTag\RestrictedInternalPropertyUsageExtension
+
+ -
+ class: PHPStan\Rules\InternalTag\RestrictedInternalMethodUsageExtension
diff --git a/conf/config.level3.neon b/conf/config.level3.neon
index afe67c44f9..4e5f80c5ef 100644
--- a/conf/config.level3.neon
+++ b/conf/config.level3.neon
@@ -2,19 +2,29 @@ includes:
- config.level2.neon
rules:
- - PHPStan\Rules\Arrays\AppendedArrayItemTypeRule
+ - PHPStan\Rules\Arrays\ArrayDestructuringRule
+ - PHPStan\Rules\Arrays\ArrayUnpackingRule
- PHPStan\Rules\Arrays\IterableInForeachRule
- PHPStan\Rules\Arrays\OffsetAccessAssignmentRule
- PHPStan\Rules\Arrays\OffsetAccessAssignOpRule
- PHPStan\Rules\Arrays\OffsetAccessValueAssignmentRule
- PHPStan\Rules\Arrays\UnpackIterableInArrayRule
+ - PHPStan\Rules\Exceptions\ThrowExprTypeRule
- PHPStan\Rules\Functions\ArrowFunctionReturnTypeRule
- PHPStan\Rules\Functions\ClosureReturnTypeRule
+ - PHPStan\Rules\Functions\ReturnTypeRule
- PHPStan\Rules\Generators\YieldTypeRule
- PHPStan\Rules\Methods\ReturnTypeRule
- PHPStan\Rules\Properties\DefaultValueTypesAssignedToPropertiesRule
+ - PHPStan\Rules\Properties\GetNonVirtualPropertyHookReadRule
+ - PHPStan\Rules\Properties\ReadOnlyPropertyAssignRule
+ - PHPStan\Rules\Properties\ReadOnlyByPhpDocPropertyAssignRule
+ - PHPStan\Rules\Properties\ReadOnlyPropertyAssignRefRule
+ - PHPStan\Rules\Properties\ReadOnlyByPhpDocPropertyAssignRefRule
+ - PHPStan\Rules\Properties\SetNonVirtualPropertyHookAssignRule
- PHPStan\Rules\Properties\TypesAssignedToPropertiesRule
- - PHPStan\Rules\Variables\ThrowTypeRule
+ - PHPStan\Rules\Variables\ParameterOutAssignedTypeRule
+ - PHPStan\Rules\Variables\ParameterOutExecutionEndTypeRule
- PHPStan\Rules\Variables\VariableCloningRule
parameters:
@@ -22,37 +32,47 @@ parameters:
services:
-
- class: PHPStan\Rules\Arrays\AppendedArrayKeyTypeRule
+ class: PHPStan\Rules\Arrays\InvalidKeyInArrayDimFetchRule
arguments:
- checkUnionTypes: %checkUnionTypes%
+ reportMaybes: %reportMaybes%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Arrays\InvalidKeyInArrayDimFetchRule
+ class: PHPStan\Rules\Arrays\InvalidKeyInArrayItemRule
arguments:
reportMaybes: %reportMaybes%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Arrays\InvalidKeyInArrayItemRule
+ class: PHPStan\Rules\Arrays\NonexistentOffsetInArrayDimFetchRule
arguments:
reportMaybes: %reportMaybes%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Arrays\NonexistentOffsetInArrayDimFetchRule
+ class: PHPStan\Rules\Exceptions\ThrowsVoidFunctionWithExplicitThrowPointRule
arguments:
- reportMaybes: %reportMaybes%
+ exceptionTypeResolver: @exceptionTypeResolver
+ missingCheckedExceptionInThrows: %exceptions.check.missingCheckedExceptionInThrows%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Exceptions\ThrowsVoidMethodWithExplicitThrowPointRule
+ arguments:
+ exceptionTypeResolver: @exceptionTypeResolver
+ missingCheckedExceptionInThrows: %exceptions.check.missingCheckedExceptionInThrows%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Functions\ReturnTypeRule
+ class: PHPStan\Rules\Exceptions\ThrowsVoidPropertyHookWithExplicitThrowPointRule
arguments:
- functionReflector: @betterReflectionFunctionReflector
+ exceptionTypeResolver: @exceptionTypeResolver
+ missingCheckedExceptionInThrows: %exceptions.check.missingCheckedExceptionInThrows%
tags:
- phpstan.rules.rule
diff --git a/conf/config.level4.neon b/conf/config.level4.neon
index a879768acd..b026238cfb 100644
--- a/conf/config.level4.neon
+++ b/conf/config.level4.neon
@@ -3,29 +3,47 @@ includes:
rules:
- PHPStan\Rules\Arrays\DeadForeachRule
- - PHPStan\Rules\Comparison\NumberComparisonOperatorsConstantConditionRule
+ - PHPStan\Rules\DeadCode\CallToConstructorStatementWithoutImpurePointsRule
+ - PHPStan\Rules\DeadCode\CallToFunctionStatementWithoutImpurePointsRule
+ - PHPStan\Rules\DeadCode\CallToMethodStatementWithoutImpurePointsRule
+ - PHPStan\Rules\DeadCode\CallToStaticMethodStatementWithoutImpurePointsRule
- PHPStan\Rules\DeadCode\NoopRule
- PHPStan\Rules\DeadCode\UnreachableStatementRule
- - PHPStan\Rules\Exceptions\DeadCatchRule
- - PHPStan\Rules\Functions\CallToFunctionStamentWithoutSideEffectsRule
- - PHPStan\Rules\Methods\CallToMethodStamentWithoutSideEffectsRule
- - PHPStan\Rules\Methods\CallToStaticMethodStamentWithoutSideEffectsRule
+ - PHPStan\Rules\DeadCode\UnusedPrivateConstantRule
+ - PHPStan\Rules\DeadCode\UnusedPrivateMethodRule
+ - PHPStan\Rules\Exceptions\OverwrittenExitPointByFinallyRule
+ - PHPStan\Rules\Functions\CallToFunctionStatementWithoutSideEffectsRule
+ - PHPStan\Rules\Functions\UselessFunctionReturnValueRule
+ - PHPStan\Rules\Methods\CallToConstructorStatementWithoutSideEffectsRule
+ - PHPStan\Rules\Methods\CallToMethodStatementWithoutSideEffectsRule
+ - PHPStan\Rules\Methods\CallToStaticMethodStatementWithoutSideEffectsRule
+ - PHPStan\Rules\Methods\NullsafeMethodCallRule
- PHPStan\Rules\TooWideTypehints\TooWideArrowFunctionReturnTypehintRule
- PHPStan\Rules\TooWideTypehints\TooWideClosureReturnTypehintRule
- PHPStan\Rules\TooWideTypehints\TooWideFunctionReturnTypehintRule
+ - PHPStan\Rules\TooWideTypehints\TooWideFunctionParameterOutTypeRule
+ - PHPStan\Rules\TooWideTypehints\TooWideMethodParameterOutTypeRule
+ - PHPStan\Rules\TooWideTypehints\TooWidePropertyTypeRule
+ - PHPStan\Rules\Traits\NotAnalysedTraitRule
conditionalTags:
- PHPStan\Rules\Variables\IssetRule:
- phpstan.rules.rule: %featureToggles.nullCoalesce%
- PHPStan\Rules\Variables\NullCoalesceRule:
- phpstan.rules.rule: %featureToggles.nullCoalesce%
+ PHPStan\Rules\Exceptions\TooWideFunctionThrowTypeRule:
+ phpstan.rules.rule: %exceptions.check.tooWideThrowType%
+ PHPStan\Rules\Exceptions\TooWideMethodThrowTypeRule:
+ phpstan.rules.rule: %exceptions.check.tooWideThrowType%
+ PHPStan\Rules\Exceptions\TooWidePropertyHookThrowTypeRule:
+ phpstan.rules.rule: %exceptions.check.tooWideThrowType%
+
+parameters:
+ checkAdvancedIsset: true
services:
-
class: PHPStan\Rules\Classes\ImpossibleInstanceOfRule
arguments:
- checkAlwaysTrueInstanceof: %checkAlwaysTrueInstanceof%
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
@@ -33,6 +51,8 @@ services:
class: PHPStan\Rules\Comparison\BooleanAndConstantConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
@@ -40,6 +60,8 @@ services:
class: PHPStan\Rules\Comparison\BooleanOrConstantConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
@@ -47,6 +69,60 @@ services:
class: PHPStan\Rules\Comparison\BooleanNotConstantConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\DeadCode\ConstructorWithoutImpurePointsCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\PossiblyPureNewCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\FunctionWithoutImpurePointsCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\PossiblyPureFuncCallCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\MethodWithoutImpurePointsCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\PossiblyPureMethodCallCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\PossiblyPureStaticCallCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\DeadCode\UnusedPrivatePropertyRule
+ arguments:
+ alwaysWrittenTags: %propertyAlwaysWrittenTags%
+ alwaysReadTags: %propertyAlwaysReadTags%
+ checkUninitializedProperties: %checkUninitializedProperties%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Comparison\DoWhileLoopConstantConditionRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
@@ -54,6 +130,8 @@ services:
class: PHPStan\Rules\Comparison\ElseIfConstantConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
@@ -61,37 +139,77 @@ services:
class: PHPStan\Rules\Comparison\IfConstantConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
-
class: PHPStan\Rules\Comparison\ImpossibleCheckTypeFunctionCallRule
arguments:
- checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
-
class: PHPStan\Rules\Comparison\ImpossibleCheckTypeMethodCallRule
arguments:
- checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
-
class: PHPStan\Rules\Comparison\ImpossibleCheckTypeStaticMethodCallRule
arguments:
- checkAlwaysTrueCheckTypeFunctionCall: %checkAlwaysTrueCheckTypeFunctionCall%
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Comparison\LogicalXorConstantConditionRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Comparison\MatchExpressionRule
+ arguments:
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Comparison\NumberComparisonOperatorsConstantConditionRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
-
class: PHPStan\Rules\Comparison\StrictComparisonOfDifferentTypesRule
arguments:
- checkAlwaysTrueStrictComparison: %checkAlwaysTrueStrictComparison%
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Comparison\ConstantLooseComparisonRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ reportAlwaysTrueInLastCondition: %reportAlwaysTrueInLastCondition%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
@@ -99,23 +217,35 @@ services:
class: PHPStan\Rules\Comparison\TernaryOperatorConstantConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Comparison\UnreachableIfBranchesRule
+ class: PHPStan\Rules\Comparison\WhileLoopAlwaysFalseConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Comparison\UnreachableTernaryElseBranchRule
+ class: PHPStan\Rules\Comparison\WhileLoopAlwaysTrueConditionRule
arguments:
treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
tags:
- phpstan.rules.rule
+ -
+ class: PHPStan\Rules\Exceptions\TooWideFunctionThrowTypeRule
+
+ -
+ class: PHPStan\Rules\Exceptions\TooWideMethodThrowTypeRule
+
+ -
+ class: PHPStan\Rules\Exceptions\TooWidePropertyHookThrowTypeRule
+
-
class: PHPStan\Rules\TooWideTypehints\TooWideMethodReturnTypehintRule
arguments:
@@ -124,7 +254,24 @@ services:
- phpstan.rules.rule
-
- class: PHPStan\Rules\Variables\IssetRule
+ class: PHPStan\Rules\Properties\NullsafePropertyFetchRule
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Traits\TraitDeclarationCollector
+ tags:
+ - phpstan.collector
-
- class: PHPStan\Rules\Variables\NullCoalesceRule
+ class: PHPStan\Rules\Traits\TraitUseCollector
+ tags:
+ - phpstan.collector
+
+ -
+ class: PHPStan\Rules\Exceptions\CatchWithUnthrownExceptionRule
+ arguments:
+ exceptionTypeResolver: @exceptionTypeResolver
+ reportUncheckedExceptionDeadCatch: %exceptions.reportUncheckedExceptionDeadCatch%
+ tags:
+ - phpstan.rules.rule
diff --git a/conf/config.level5.neon b/conf/config.level5.neon
index a80147786e..fd3835fbf1 100644
--- a/conf/config.level5.neon
+++ b/conf/config.level5.neon
@@ -1,17 +1,44 @@
includes:
- config.level4.neon
-conditionalTags:
- PHPStan\Rules\Functions\RandomIntParametersRule:
- phpstan.rules.rule: %featureToggles.randomIntParameters%
-
parameters:
checkFunctionArgumentTypes: true
checkArgumentsPassedByReference: true
+conditionalTags:
+ PHPStan\Rules\Functions\ParameterCastableToNumberRule:
+ phpstan.rules.rule: %featureToggles.checkParameterCastableToNumberFunctions%
+
+rules:
+ - PHPStan\Rules\DateTimeInstantiationRule
+ - PHPStan\Rules\Functions\CallUserFuncRule
+ - PHPStan\Rules\Functions\ParameterCastableToStringRule
+ - PHPStan\Rules\Functions\ImplodeParameterCastableToStringRule
+ - PHPStan\Rules\Functions\SortParameterCastableToStringRule
+ - PHPStan\Rules\Regexp\RegularExpressionQuotingRule
services:
-
class: PHPStan\Rules\Functions\RandomIntParametersRule
arguments:
reportMaybes: %reportMaybes%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Functions\ArrayFilterRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+
+ -
+ class: PHPStan\Rules\Functions\ArrayValuesRule
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+ tags:
+ - phpstan.rules.rule
+ -
+ class: PHPStan\Rules\Functions\ParameterCastableToNumberRule
diff --git a/conf/config.level6.neon b/conf/config.level6.neon
index 4fdeb19345..25214e97dd 100644
--- a/conf/config.level6.neon
+++ b/conf/config.level6.neon
@@ -2,14 +2,14 @@ includes:
- config.level5.neon
parameters:
- checkGenericClassInNonGenericObjectType: true
- checkMissingIterableValueType: true
checkMissingVarTagTypehint: true
checkMissingTypehints: true
rules:
+ - PHPStan\Rules\Constants\MissingClassConstantTypehintRule
- PHPStan\Rules\Functions\MissingFunctionParameterTypehintRule
- PHPStan\Rules\Functions\MissingFunctionReturnTypehintRule
- PHPStan\Rules\Methods\MissingMethodParameterTypehintRule
- PHPStan\Rules\Methods\MissingMethodReturnTypehintRule
+ - PHPStan\Rules\Methods\MissingMethodSelfOutTypeRule
- PHPStan\Rules\Properties\MissingPropertyTypehintRule
diff --git a/conf/config.level9.neon b/conf/config.level9.neon
new file mode 100644
index 0000000000..efb3e30ffa
--- /dev/null
+++ b/conf/config.level9.neon
@@ -0,0 +1,5 @@
+includes:
+ - config.level8.neon
+
+parameters:
+ checkExplicitMixed: true
diff --git a/conf/config.levelmax.neon b/conf/config.levelmax.neon
index 789cb34109..ce4c43f2f7 100644
--- a/conf/config.levelmax.neon
+++ b/conf/config.levelmax.neon
@@ -1,2 +1,2 @@
includes:
- - config.level8.neon
+ - config.level10.neon
diff --git a/conf/config.neon b/conf/config.neon
index 937b9633cb..a0083d7753 100644
--- a/conf/config.neon
+++ b/conf/config.neon
@@ -1,102 +1,152 @@
+includes:
+ - parametersSchema.neon
+
parameters:
- bootstrap: null
- bootstrapFiles: []
- excludes_analyse: []
- autoload_directories: []
- autoload_files: []
+ bootstrapFiles:
+ - ../stubs/runtime/ReflectionUnionType.php
+ - ../stubs/runtime/ReflectionAttribute.php
+ - ../stubs/runtime/Attribute.php
+ - ../stubs/runtime/ReflectionIntersectionType.php
+ excludePaths: []
level: null
paths: []
+ exceptions:
+ implicitThrows: true
+ reportUncheckedExceptionDeadCatch: true
+ uncheckedExceptionRegexes: []
+ uncheckedExceptionClasses: []
+ checkedExceptionRegexes: []
+ checkedExceptionClasses: []
+ check:
+ missingCheckedExceptionInThrows: false
+ tooWideThrowType: true
featureToggles:
- disableRuntimeReflectionProvider: false
- closureUsesThis: false
- randomIntParameters: false
- nullCoalesce: false
+ bleedingEdge: false
+ checkParameterCastableToNumberFunctions: false
+ skipCheckGenericClasses: []
+ stricterFunctionMap: false
+ reportPreciseLineForUnusedFunctionParameter: false
+ internalTag: false
fileExtensions:
- php
- checkAlwaysTrueCheckTypeFunctionCall: false
- checkAlwaysTrueInstanceof: false
- checkAlwaysTrueStrictComparison: false
+ checkAdvancedIsset: false
+ reportAlwaysTrueInLastCondition: false
checkClassCaseSensitivity: false
checkExplicitMixed: false
+ checkImplicitMixed: false
checkFunctionArgumentTypes: false
checkFunctionNameCase: false
- checkGenericClassInNonGenericObjectType: false
- checkMissingIterableValueType: false
+ checkInternalClassCaseSensitivity: false
+ checkMissingCallableSignature: false
checkMissingVarTagTypehint: false
checkArgumentsPassedByReference: false
checkMaybeUndefinedVariables: false
checkNullables: false
checkThisOnly: true
checkUnionTypes: false
+ checkBenevolentUnionTypes: false
checkExplicitMixedMissingReturn: false
checkPhpDocMissingReturn: false
checkPhpDocMethodSignatures: false
checkExtraArguments: false
- checkMissingClosureNativeReturnTypehintRule: false
checkMissingTypehints: false
checkTooWideReturnTypesInProtectedAndPublicMethods: false
+ checkUninitializedProperties: false
+ checkDynamicProperties: false
+ strictRulesInstalled: false
+ deprecationRulesInstalled: false
inferPrivatePropertyTypeFromConstructor: false
reportMaybes: false
reportMaybesInMethodSignatures: false
+ reportMaybesInPropertyPhpDocTypes: false
reportStaticMethodSignatures: false
+ reportWrongPhpDocTypeInVarTag: false
+ reportAnyTypeWideningInVarTag: false
+ reportPossiblyNonexistentGeneralArrayOffset: false
+ reportPossiblyNonexistentConstantArrayOffset: false
+ checkMissingOverrideMethodAttribute: false
mixinExcludeClasses: []
scanFiles: []
scanDirectories: []
parallel:
jobSize: 20
- processTimeout: 60.0
+ processTimeout: 600.0
maximumNumberOfProcesses: 32
minimumNumberOfJobsPerProcess: 2
buffer: 134217728 # 128 MB
phpVersion: null
polluteScopeWithLoopInitialAssignments: true
polluteScopeWithAlwaysIterableForeach: true
- polluteCatchScopeWithTryAssignments: false
+ polluteScopeWithBlock: true
+ propertyAlwaysWrittenTags: []
+ propertyAlwaysReadTags: []
+ additionalConstructors: []
treatPhpDocTypesAsCertain: true
+ usePathConstantsAsConstantString: false
+ rememberPossiblyImpureFunctionValues: true
+ tips:
+ discoveringSymbols: true
+ treatPhpDocTypesAsCertain: true
tipsOfTheDay: true
reportMagicMethods: false
reportMagicProperties: false
ignoreErrors: []
internalErrorsCountLimit: 50
cache:
- nodesByFileCountMax: 512
- nodesByStringCountMax: 512
+ nodesByStringCountMax: 256
reportUnmatchedIgnoredErrors: true
- scopeClass: PHPStan\Analyser\MutatingScope
- typeAliases:
- scalar: 'int|float|string|bool'
- number: 'int|float'
+ typeAliases: []
universalObjectCratesClasses:
- stdClass
stubFiles:
- - ../stubs/ReflectionClass.stub
+ - ../stubs/ReflectionAttribute.stub
+ - ../stubs/ReflectionClassConstant.stub
+ - ../stubs/ReflectionFunctionAbstract.stub
+ - ../stubs/ReflectionMethod.stub
+ - ../stubs/ReflectionParameter.stub
+ - ../stubs/ReflectionProperty.stub
- ../stubs/iterable.stub
- ../stubs/ArrayObject.stub
- ../stubs/WeakReference.stub
- ../stubs/ext-ds.stub
+ - ../stubs/ImagickPixel.stub
- ../stubs/PDOStatement.stub
- - ../stubs/ReflectionFunctionAbstract.stub
- ../stubs/date.stub
+ - ../stubs/ibm_db2.stub
+ - ../stubs/mysqli.stub
- ../stubs/zip.stub
- ../stubs/dom.stub
- ../stubs/spl.stub
+ - ../stubs/SplObjectStorage.stub
+ - ../stubs/Exception.stub
+ - ../stubs/arrayFunctions.stub
+ - ../stubs/core.stub
+ - ../stubs/typeCheckingFunctions.stub
+ - ../stubs/Countable.stub
earlyTerminatingMethodCalls: []
earlyTerminatingFunctionCalls: []
- memoryLimitFile: %tmpDir%/.memory_limit
- staticReflectionClassNamePatterns:
- - '#^PhpParser\\#'
- - '#^PHPStan\\#'
- - '#^Hoa\\#'
+ resultCachePath: %tmpDir%/resultCache.php
+ resultCacheSkipIfOlderThanDays: 7
+ resultCacheChecksProjectExtensionFilesDependencies: false
dynamicConstantNames:
- ICONV_IMPL
- LIBXML_VERSION
- LIBXML_DOTTED_VERSION
+ - Memcached::HAVE_ENCODING
+ - Memcached::HAVE_IGBINARY
+ - Memcached::HAVE_JSON
+ - Memcached::HAVE_MSGPACK
+ - Memcached::HAVE_SASL
+ - Memcached::HAVE_SESSION
- PHP_VERSION
- PHP_MAJOR_VERSION
- PHP_MINOR_VERSION
- PHP_RELEASE_VERSION
- PHP_VERSION_ID
- PHP_EXTRA_VERSION
+ - PHP_WINDOWS_VERSION_MAJOR
+ - PHP_WINDOWS_VERSION_MINOR
+ - PHP_WINDOWS_VERSION_BUILD
- PHP_ZTS
- PHP_DEBUG
- PHP_MAXPATHLEN
@@ -127,144 +177,182 @@ parameters:
- PHP_CONFIG_FILE_SCAN_DIR
- PHP_SHLIB_SUFFIX
- PHP_FD_SETSIZE
+ - OPENSSL_VERSION_NUMBER
+ - ZEND_DEBUG_BUILD
+ - ZEND_THREAD_SAFE
+ - E_ALL # different on PHP 8.4
+ customRulesetUsed: null
+ editorUrl: null
+ editorUrlTitle: null
+ errorFormat: null
+ sysGetTempDir: ::sys_get_temp_dir()
+ sourceLocatorPlaygroundMode: false
+ pro:
+ dnsServers:
+ - '1.1.1.2'
+ tmpDir: %sysGetTempDir%/phpstan-fixer
+ __validate: true
+ parametersNotInvalidatingCache:
+ - [parameters, editorUrl]
+ - [parameters, editorUrlTitle]
+ - [parameters, errorFormat]
+ - [parameters, ignoreErrors]
+ - [parameters, reportUnmatchedIgnoredErrors]
+ - [parameters, tipsOfTheDay]
+ - [parameters, parallel]
+ - [parameters, internalErrorsCountLimit]
+ - [parameters, cache]
+ - [parameters, memoryLimitFile]
+ - [parameters, pro]
+ - parametersSchema
extensions:
rules: PHPStan\DependencyInjection\RulesExtension
conditionalTags: PHPStan\DependencyInjection\ConditionalTagsExtension
parametersSchema: PHPStan\DependencyInjection\ParametersSchemaExtension
-
-parametersSchema:
- bootstrap: schema(string(), nullable())
- bootstrapFiles: listOf(string())
- excludes_analyse: listOf(string())
- autoload_directories: listOf(string())
- autoload_files: listOf(string())
- level: schema(anyOf(int(), string()), nullable())
- paths: listOf(string())
- featureToggles: structure([
- disableRuntimeReflectionProvider: bool(),
- closureUsesThis: bool(),
- randomIntParameters: bool(),
- nullCoalesce: bool()
- ])
- fileExtensions: listOf(string())
- checkAlwaysTrueCheckTypeFunctionCall: bool()
- checkAlwaysTrueInstanceof: bool()
- checkAlwaysTrueStrictComparison: bool()
- checkClassCaseSensitivity: bool()
- checkExplicitMixed: bool()
- checkFunctionArgumentTypes: bool()
- checkFunctionNameCase: bool()
- checkGenericClassInNonGenericObjectType: bool()
- checkMissingIterableValueType: bool()
- checkMissingVarTagTypehint: bool()
- checkArgumentsPassedByReference: bool()
- checkMaybeUndefinedVariables: bool()
- checkNullables: bool()
- checkThisOnly: bool()
- checkUnionTypes: bool()
- checkExplicitMixedMissingReturn: bool()
- checkPhpDocMissingReturn: bool()
- checkPhpDocMethodSignatures: bool()
- checkExtraArguments: bool()
- checkMissingClosureNativeReturnTypehintRule: bool()
- checkMissingTypehints: bool()
- checkTooWideReturnTypesInProtectedAndPublicMethods: bool()
- inferPrivatePropertyTypeFromConstructor: bool()
- tipsOfTheDay: bool()
- reportMaybes: bool()
- reportMaybesInMethodSignatures: bool()
- reportStaticMethodSignatures: bool()
- parallel: structure([
- jobSize: int(),
- processTimeout: float(),
- maximumNumberOfProcesses: int(),
- minimumNumberOfJobsPerProcess: int(),
- buffer: int()
- ])
- phpVersion: schema(anyOf(schema(int(), min(70100), max(80000))), nullable())
- polluteScopeWithLoopInitialAssignments: bool()
- polluteScopeWithAlwaysIterableForeach: bool()
- polluteCatchScopeWithTryAssignments: bool()
- treatPhpDocTypesAsCertain: bool()
- reportMagicMethods: bool()
- reportMagicProperties: bool()
- ignoreErrors: listOf(
- anyOf(
- string(),
- structure([
- message: string()
- path: string()
- ]),
- structure([
- message: string()
- count: int()
- path: string()
- ]),
- structure([
- message: string()
- paths: listOf(string())
- ])
- )
- )
- internalErrorsCountLimit: int()
- cache: structure([
- nodesByFileCountMax: int()
- nodesByStringCountMax: int()
- ])
- reportUnmatchedIgnoredErrors: bool()
- scopeClass: string()
- typeAliases: arrayOf(string())
- universalObjectCratesClasses: listOf(string())
- stubFiles: listOf(string())
- earlyTerminatingMethodCalls: arrayOf(listOf(string()))
- earlyTerminatingFunctionCalls: listOf(string())
- memoryLimitFile: string()
- staticReflectionClassNamePatterns: listOf(string())
- dynamicConstantNames: listOf(string())
- customRulesetUsed: bool()
- rootDir: string()
- tmpDir: string()
- currentWorkingDirectory: string()
- cliArgumentsVariablesRegistered: bool()
- mixinExcludeClasses: listOf(string())
- scanFiles: listOf(string())
- scanDirectories: listOf(string())
-
- # irrelevant Nette parameters
- debugMode: bool()
- productionMode: bool()
- tempDir: string()
-
- # internal parameters only for DerivativeContainerFactory
- additionalConfigFiles: listOf(string())
- allCustomConfigFiles: listOf(string())
- analysedPaths: listOf(string())
- composerAutoloaderProjectPaths: listOf(string())
- analysedPathsFromConfig: listOf(string())
- usedLevel: string()
- cliAutoloadFile: schema(string(), nullable())
+ validateIgnoredErrors: PHPStan\DependencyInjection\ValidateIgnoredErrorsExtension
+ validateExcludePaths: PHPStan\DependencyInjection\ValidateExcludePathsExtension
+
+rules:
+ - PHPStan\Rules\Debug\DebugScopeRule
+ - PHPStan\Rules\Debug\DumpPhpDocTypeRule
+ - PHPStan\Rules\Debug\DumpTypeRule
+ - PHPStan\Rules\Debug\FileAssertRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedClassConstantUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedFunctionUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedFunctionCallableUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedMethodUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedMethodCallableUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedPropertyUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedStaticMethodUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedStaticMethodCallableUsageRule
+ - PHPStan\Rules\RestrictedUsage\RestrictedStaticPropertyUsageRule
+
+conditionalTags:
+ PHPStan\Rules\Exceptions\MissingCheckedExceptionInFunctionThrowsRule:
+ phpstan.rules.rule: %exceptions.check.missingCheckedExceptionInThrows%
+ PHPStan\Rules\Exceptions\MissingCheckedExceptionInMethodThrowsRule:
+ phpstan.rules.rule: %exceptions.check.missingCheckedExceptionInThrows%
+ PHPStan\Rules\Exceptions\MissingCheckedExceptionInPropertyHookThrowsRule:
+ phpstan.rules.rule: %exceptions.check.missingCheckedExceptionInThrows%
+ PHPStan\Rules\Properties\UninitializedPropertyRule:
+ phpstan.rules.rule: %checkUninitializedProperties%
services:
-
class: PhpParser\BuilderFactory
-
- class: PhpParser\Lexer\Emulative
+ class: PHPStan\Parser\LexerFactory
-
- class: PhpParser\NodeTraverser
- setup:
- - addVisitor(@PhpParser\NodeVisitor\NameResolver)
+ class: PhpParser\NodeVisitor\NameResolver
+ arguments:
+ options:
+ preserveOriginalNames: true
-
- class: PhpParser\NodeVisitor\NameResolver
+ class: PHPStan\Parser\AnonymousClassVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ArrayFilterArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ArrayFindArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ArrayMapArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ArrayWalkArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ClosureArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ClosureBindToVarVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ClosureBindArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\CurlSetOptArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ArrowFunctionArgVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\MagicConstantParamDefaultVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\NewAssignedToPropertyVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ParentStmtTypesVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\StandaloneThrowExprVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
-
- class: PhpParser\Parser\Php7
+ class: PHPStan\Parser\TryCatchTypeVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\LastConditionVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\TypeTraverserInstanceofVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\VariadicMethodsVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\VariadicFunctionsVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Node\Printer\ExprPrinter
-
- class: PhpParser\PrettyPrinter\Standard
+ class: PHPStan\Node\Printer\Printer
+ autowired:
+ - PHPStan\Node\Printer\Printer
-
class: PHPStan\Broker\AnonymousClassNameHelper
@@ -277,8 +365,24 @@ services:
-
class: PHPStan\Php\PhpVersionFactory
+ factory: @PHPStan\Php\PhpVersionFactoryFactory::create
+
+ -
+ class: PHPStan\Php\PhpVersionFactoryFactory
+ arguments:
+ phpVersion: %phpVersion%
+ composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
+
+ -
+ class: PHPStan\Php\ComposerPhpVersionFactory
+ arguments:
+ composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
+
+ -
+ class: PHPStan\PhpDocParser\ParserConfig
arguments:
- versionId: %phpVersion%
+ usedAttributes:
+ lines: true
-
class: PHPStan\PhpDocParser\Lexer\Lexer
@@ -292,6 +396,9 @@ services:
-
class: PHPStan\PhpDocParser\Parser\PhpDocParser
+ -
+ class: PHPStan\PhpDocParser\Printer\Printer
+
-
class: PHPStan\PhpDoc\PhpDocInheritanceResolver
@@ -304,13 +411,6 @@ services:
-
class: PHPStan\PhpDoc\ConstExprNodeResolver
- -
- class: PHPStan\PhpDoc\TypeAlias\TypeAliasesTypeNodeResolverExtension
- arguments:
- aliases: %typeAliases%
- tags:
- - phpstan.phpDoc.typeNodeResolverExtension
-
-
class: PHPStan\PhpDoc\TypeNodeResolver
@@ -323,8 +423,34 @@ services:
-
class: PHPStan\PhpDoc\StubValidator
+
+ -
+ class: PHPStan\PhpDoc\SocketSelectStubFilesExtension
+ tags:
+ - phpstan.stubFilesExtension
+
+ -
+ class: PHPStan\PhpDoc\DefaultStubFilesProvider
arguments:
stubFiles: %stubFiles%
+ composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
+ autowired:
+ - PHPStan\PhpDoc\StubFilesProvider
+
+ -
+ class: PHPStan\PhpDoc\JsonValidateStubFilesExtension
+ tags:
+ - phpstan.stubFilesExtension
+
+ -
+ class: PHPStan\PhpDoc\ReflectionClassStubFilesExtension
+ tags:
+ - phpstan.stubFilesExtension
+
+ -
+ class: PHPStan\PhpDoc\ReflectionEnumStubFilesExtension
+ tags:
+ - phpstan.stubFilesExtension
-
class: PHPStan\Analyser\Analyser
@@ -332,65 +458,132 @@ services:
internalErrorsCountLimit: %internalErrorsCountLimit%
-
- class: PHPStan\Analyser\FileAnalyser
+ class: PHPStan\Analyser\AnalyserResultFinalizer
arguments:
reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
-
- class: PHPStan\Analyser\IgnoredErrorHelper
+ class: PHPStan\Analyser\FileAnalyser
+ arguments:
+ parser: @defaultAnalysisParser
+
+ -
+ class: PHPStan\Analyser\IgnoreErrorExtensionProvider
+
+ -
+ class: PHPStan\Analyser\LocalIgnoresProcessor
+
+ -
+ class: PHPStan\Analyser\RuleErrorTransformer
+
+ -
+ class: PHPStan\Analyser\Ignore\IgnoredErrorHelper
arguments:
ignoreErrors: %ignoreErrors%
reportUnmatchedIgnoredErrors: %reportUnmatchedIgnoredErrors%
-
- class: PHPStan\Analyser\LazyScopeFactory
- arguments:
- scopeClass: %scopeClass%
+ class: PHPStan\Analyser\Ignore\IgnoreLexer
+
+ -
+ class: PHPStan\Analyser\LazyInternalScopeFactory
autowired:
- - PHPStan\Analyser\ScopeFactory
+ - PHPStan\Analyser\InternalScopeFactory
+
+ -
+ class: PHPStan\Analyser\ScopeFactory
-
class: PHPStan\Analyser\NodeScopeResolver
arguments:
- classReflector: @nodeScopeResolverClassReflector
+ parser: @defaultAnalysisParser
+ reflector: @nodeScopeResolverReflector
polluteScopeWithLoopInitialAssignments: %polluteScopeWithLoopInitialAssignments%
- polluteCatchScopeWithTryAssignments: %polluteCatchScopeWithTryAssignments%
polluteScopeWithAlwaysIterableForeach: %polluteScopeWithAlwaysIterableForeach%
+ polluteScopeWithBlock: %polluteScopeWithBlock%
earlyTerminatingMethodCalls: %earlyTerminatingMethodCalls%
earlyTerminatingFunctionCalls: %earlyTerminatingFunctionCalls%
+ implicitThrows: %exceptions.implicitThrows%
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ universalObjectCratesClasses: %universalObjectCratesClasses%
+ narrowMethodScopeFromConstructor: true
+
+ -
+ class: PHPStan\Analyser\ConstantResolver
+ factory: @PHPStan\Analyser\ConstantResolverFactory::create()
-
- class: PHPStan\Analyser\ResultCache\ResultCacheManager
+ class: PHPStan\Analyser\ConstantResolverFactory
+
+ -
+ implement: PHPStan\Analyser\ResultCache\ResultCacheManagerFactory
arguments:
- cacheFilePath: %tmpDir%/resultCache.php
- allCustomConfigFiles: %allCustomConfigFiles%
+ scanFileFinder: @fileFinderScan
+ cacheFilePath: %resultCachePath%
analysedPaths: %analysedPaths%
composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
- stubFiles: %stubFiles%
usedLevel: %usedLevel%
cliAutoloadFile: %cliAutoloadFile%
+ bootstrapFiles: %bootstrapFiles%
+ scanFiles: %scanFiles%
+ scanDirectories: %scanDirectories%
+ checkDependenciesOfProjectExtensionFiles: %resultCacheChecksProjectExtensionFilesDependencies%
+ parametersNotInvalidatingCache: %parametersNotInvalidatingCache%
+ skipResultCacheIfOlderThanDays: %resultCacheSkipIfOlderThanDays%
+
+ -
+ class: PHPStan\Analyser\ResultCache\ResultCacheClearer
+ arguments:
+ cacheFilePath: %resultCachePath%
+
+ -
+ class: PHPStan\Analyser\RicherScopeGetTypeHelper
-
class: PHPStan\Cache\Cache
arguments:
storage: @cacheStorage
+ -
+ class: PHPStan\Collectors\Registry
+ factory: @PHPStan\Collectors\RegistryFactory::create
+
+ -
+ class: PHPStan\Collectors\RegistryFactory
+
-
class: PHPStan\Command\AnalyseApplication
+
+ -
+ class: PHPStan\Command\AnalyserRunner
+
+ -
+ class: PHPStan\Command\FixerApplication
arguments:
- memoryLimitFile: %memoryLimitFile%
- internalErrorsCountLimit: %internalErrorsCountLimit%
+ analysedPaths: %analysedPaths%
+ currentWorkingDirectory: %currentWorkingDirectory%
+ proTmpDir: %pro.tmpDir%
+ dnsServers: %pro.dnsServers%
+ composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
+ allConfigFiles: %allConfigFiles%
+ cliAutoloadFile: %cliAutoloadFile%
+ bootstrapFiles: %bootstrapFiles%
+ editorUrl: %editorUrl%
+ usedLevel: %usedLevel%
-
- class: PHPStan\Command\IgnoredRegexValidator
+ class: PHPStan\Dependency\DependencyResolver
+
+ -
+ class: PHPStan\Dependency\ExportedNodeFetcher
arguments:
- parser: @regexParser
+ parser: @defaultAnalysisParser
-
- class: PHPStan\Dependency\DependencyDumper
+ class: PHPStan\Dependency\ExportedNodeResolver
-
- class: PHPStan\Dependency\DependencyResolver
+ class: PHPStan\Dependency\ExportedNodeVisitor
-
class: PHPStan\DependencyInjection\Container
@@ -412,8 +605,9 @@ services:
analysedPaths: %analysedPaths%
composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
analysedPathsFromConfig: %analysedPathsFromConfig%
- allCustomConfigFiles: %allCustomConfigFiles%
usedLevel: %usedLevel%
+ generateBaselineFile: %generateBaselineFile%
+ cliAutoloadFile: %cliAutoloadFile%
-
class: PHPStan\DependencyInjection\Reflection\ClassReflectionExtensionRegistryProvider
@@ -423,25 +617,77 @@ services:
class: PHPStan\DependencyInjection\Type\DynamicReturnTypeExtensionRegistryProvider
factory: PHPStan\DependencyInjection\Type\LazyDynamicReturnTypeExtensionRegistryProvider
+ -
+ class: PHPStan\DependencyInjection\Type\ParameterOutTypeExtensionProvider
+ factory: PHPStan\DependencyInjection\Type\LazyParameterOutTypeExtensionProvider
+
+ -
+ class: PHPStan\DependencyInjection\Type\ExpressionTypeResolverExtensionRegistryProvider
+ factory: PHPStan\DependencyInjection\Type\LazyExpressionTypeResolverExtensionRegistryProvider
+
-
class: PHPStan\DependencyInjection\Type\OperatorTypeSpecifyingExtensionRegistryProvider
factory: PHPStan\DependencyInjection\Type\LazyOperatorTypeSpecifyingExtensionRegistryProvider
+ -
+ class: PHPStan\DependencyInjection\Type\DynamicThrowTypeExtensionProvider
+ factory: PHPStan\DependencyInjection\Type\LazyDynamicThrowTypeExtensionProvider
+
+ -
+ class: PHPStan\DependencyInjection\Type\ParameterClosureTypeExtensionProvider
+ factory: PHPStan\DependencyInjection\Type\LazyParameterClosureTypeExtensionProvider
+
-
class: PHPStan\File\FileHelper
arguments:
workingDirectory: %currentWorkingDirectory%
-
- class: PHPStan\File\FileExcluder
+ class: PHPStan\File\FileExcluderFactory
arguments:
- analyseExcludes: %excludes_analyse%
- stubFiles: %stubFiles%
+ excludePaths: %excludePaths%
-
+ implement: PHPStan\File\FileExcluderRawFactory
+
+ fileExcluderAnalyse:
+ class: PHPStan\File\FileExcluder
+ factory: @PHPStan\File\FileExcluderFactory::createAnalyseFileExcluder()
+ autowired: false
+
+ fileExcluderScan:
+ class: PHPStan\File\FileExcluder
+ factory: @PHPStan\File\FileExcluderFactory::createScanFileExcluder()
+ autowired: false
+
+ fileFinderAnalyse:
+ class: PHPStan\File\FileFinder
+ arguments:
+ fileExcluder: @fileExcluderAnalyse
+ fileExtensions: %fileExtensions%
+ autowired: false
+
+ fileFinderScan:
class: PHPStan\File\FileFinder
arguments:
+ fileExcluder: @fileExcluderScan
fileExtensions: %fileExtensions%
+ autowired: false
+
+ -
+ class: PHPStan\File\FileMonitor
+ arguments:
+ fileFinder: @fileFinderAnalyse
+
+ -
+ class: PHPStan\Parser\DeclarePositionVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
+
+ -
+ class: PHPStan\Parser\ImmediatelyInvokedClosureVisitor
+ tags:
+ - phpstan.parser.richParserNodeVisitor
-
class: PHPStan\Parallel\ParallelAnalyser
@@ -456,19 +702,24 @@ services:
jobSize: %parallel.jobSize%
maximumNumberOfProcesses: %parallel.maximumNumberOfProcesses%
minimumNumberOfJobsPerProcess: %parallel.minimumNumberOfJobsPerProcess%
+ tags:
+ - phpstan.diagnoseExtension
-
- class: PHPStan\Parser\CachedParser
- arguments:
- originalParser: @directParser
- cachedNodesByFileCountMax: %cache.nodesByFileCountMax%
- cachedNodesByStringCountMax: %cache.nodesByStringCountMax%
+ class: PHPStan\Process\CpuCoreCounter
-
- class: PHPStan\Parser\FunctionCallStatementFinder
+ class: PHPStan\Reflection\AttributeReflectionFactory
-
implement: PHPStan\Reflection\FunctionReflectionFactory
+ arguments:
+ parser: @defaultAnalysisParser
+
+ -
+ class: PHPStan\Reflection\InitializerExprTypeResolver
+ arguments:
+ usePathConstantsAsConstantString: %usePathConstantsAsConstantString%
-
class: PHPStan\Reflection\Annotations\AnnotationsMethodsClassReflectionExtension
@@ -482,16 +733,15 @@ services:
-
class: PHPStan\Reflection\BetterReflection\SourceLocator\FileNodesFetcher
arguments:
- phpParser: @phpParserDecorator
-
- -
- class: PHPStan\Reflection\BetterReflection\SourceLocator\AutoloadSourceLocator
+ parser: @defaultAnalysisParser
-
class: PHPStan\Reflection\BetterReflection\SourceLocator\ComposerJsonAndInstalledJsonSourceLocatorMaker
-
- implement: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory
+ class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorFactory
+ arguments:
+ fileFinder: @fileFinderScan
-
class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedDirectorySourceLocatorRepository
@@ -506,27 +756,65 @@ services:
class: PHPStan\Reflection\BetterReflection\SourceLocator\OptimizedSingleFileSourceLocatorRepository
-
- class: PHPStan\Reflection\Mixin\MixinMethodsClassReflectionExtension
+ class: PHPStan\Reflection\BetterReflection\Type\AdapterReflectionEnumCaseDynamicReturnTypeExtension
+ arguments:
+ class: PHPStan\BetterReflection\Reflection\Adapter\ReflectionEnumBackedCase
tags:
- - phpstan.broker.methodsClassReflectionExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Reflection\BetterReflection\Type\AdapterReflectionEnumCaseDynamicReturnTypeExtension
+ arguments:
+ class: PHPStan\BetterReflection\Reflection\Adapter\ReflectionEnumUnitCase
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Reflection\BetterReflection\Type\AdapterReflectionEnumDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Reflection\ConstructorsHelper
+ arguments:
+ additionalConstructors: %additionalConstructors%
+
+ -
+ class: PHPStan\Reflection\RequireExtension\RequireExtendsMethodsClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\RequireExtension\RequireExtendsPropertiesClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\Mixin\MixinMethodsClassReflectionExtension
arguments:
mixinExcludeClasses: %mixinExcludeClasses%
-
class: PHPStan\Reflection\Mixin\MixinPropertiesClassReflectionExtension
- tags:
- - phpstan.broker.propertiesClassReflectionExtension
arguments:
mixinExcludeClasses: %mixinExcludeClasses%
-
class: PHPStan\Reflection\Php\PhpClassReflectionExtension
arguments:
+ parser: @defaultAnalysisParser
inferPrivatePropertyTypeFromConstructor: %inferPrivatePropertyTypeFromConstructor%
- universalObjectCratesClasses: %universalObjectCratesClasses%
-
implement: PHPStan\Reflection\Php\PhpMethodReflectionFactory
+ arguments:
+ parser: @defaultAnalysisParser
+
+ -
+ class: PHPStan\Reflection\Php\Soap\SoapClientMethodsClassReflectionExtension
+ tags:
+ - phpstan.broker.methodsClassReflectionExtension
+
+ -
+ class: PHPStan\Reflection\Php\EnumAllowedSubTypesClassReflectionExtension
+ tags:
+ - phpstan.broker.allowedSubTypesClassReflectionExtension
-
class: PHPStan\Reflection\Php\UniversalObjectCratesClassReflectionExtension
@@ -535,69 +823,211 @@ services:
arguments:
classes: %universalObjectCratesClasses%
+ -
+ class: PHPStan\Reflection\PHPStan\NativeReflectionEnumReturnDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ className: PHPStan\Reflection\ClassReflection
+ methodName: getNativeReflection
+
+ -
+ class: PHPStan\Reflection\PHPStan\NativeReflectionEnumReturnDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ className: PHPStan\Reflection\Php\BuiltinMethodReflection
+ methodName: getDeclaringClass
+
-
class: PHPStan\Reflection\ReflectionProvider\ReflectionProviderProvider
factory: PHPStan\Reflection\ReflectionProvider\LazyReflectionProviderProvider
-
class: PHPStan\Reflection\SignatureMap\NativeFunctionReflectionProvider
+ arguments:
+ reflector: @betterReflectionReflector
-
class: PHPStan\Reflection\SignatureMap\SignatureMapParser
-
- class: PHPStan\Reflection\SignatureMap\SignatureMapProvider
+ class: PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider
+ arguments:
+ stricterFunctionMap: %featureToggles.stricterFunctionMap%
+ autowired:
+ - PHPStan\Reflection\SignatureMap\FunctionSignatureMapProvider
-
- class: PHPStan\Rules\ClassCaseSensitivityCheck
+ class: PHPStan\Reflection\SignatureMap\Php8SignatureMapProvider
+ autowired:
+ - PHPStan\Reflection\SignatureMap\Php8SignatureMapProvider
-
- class: PHPStan\Rules\Comparison\ConstantConditionRuleHelper
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ class: PHPStan\Reflection\SignatureMap\SignatureMapProviderFactory
-
- class: PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper
- arguments:
- universalObjectCratesClasses: %universalObjectCratesClasses%
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ class: PHPStan\Reflection\SignatureMap\SignatureMapProvider
+ factory: @PHPStan\Reflection\SignatureMap\SignatureMapProviderFactory::create()
-
- class: PHPStan\Rules\FunctionCallParametersCheck
+ class: PHPStan\Rules\Api\ApiRuleHelper
+
+ -
+ class: PHPStan\Rules\AttributesCheck
arguments:
- checkArgumentTypes: %checkFunctionArgumentTypes%
- checkArgumentsPassedByReference: %checkArgumentsPassedByReference%
- checkExtraArguments: %checkExtraArguments%
- checkMissingTypehints: %checkMissingTypehints%
+ deprecationRulesInstalled: %deprecationRulesInstalled%
-
- class: PHPStan\Rules\FunctionDefinitionCheck
+ class: PHPStan\Rules\Arrays\NonexistentOffsetInArrayDimFetchCheck
arguments:
- checkClassCaseSensitivity: %checkClassCaseSensitivity%
- checkThisOnly: %checkThisOnly%
+ reportMaybes: %reportMaybes%
+ reportPossiblyNonexistentGeneralArrayOffset: %reportPossiblyNonexistentGeneralArrayOffset%
+ reportPossiblyNonexistentConstantArrayOffset: %reportPossiblyNonexistentConstantArrayOffset%
+
+ -
+ class: PHPStan\Rules\ClassNameCheck
+
+ -
+ class: PHPStan\Rules\ClassCaseSensitivityCheck
+ arguments:
+ checkInternalClassCaseSensitivity: %checkInternalClassCaseSensitivity%
+
+ -
+ class: PHPStan\Rules\ClassForbiddenNameCheck
+
+ -
+ class: PHPStan\Rules\Classes\LocalTypeAliasesCheck
+ arguments:
+ globalTypeAliases: %typeAliases%
+ checkMissingTypehints: %checkMissingTypehints%
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Classes\MethodTagCheck
+ arguments:
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ checkMissingTypehints: %checkMissingTypehints%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Classes\MixinCheck
+ arguments:
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ checkMissingTypehints: %checkMissingTypehints%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Classes\PropertyTagCheck
+ arguments:
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ checkMissingTypehints: %checkMissingTypehints%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+
+ -
+ class: PHPStan\Rules\Comparison\ConstantConditionRuleHelper
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+
+ -
+ class: PHPStan\Rules\Comparison\ImpossibleCheckTypeHelper
+ arguments:
+ universalObjectCratesClasses: %universalObjectCratesClasses%
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+
+ -
+ class: PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
+ arguments:
+ uncheckedExceptionRegexes: %exceptions.uncheckedExceptionRegexes%
+ uncheckedExceptionClasses: %exceptions.uncheckedExceptionClasses%
+ checkedExceptionRegexes: %exceptions.checkedExceptionRegexes%
+ checkedExceptionClasses: %exceptions.checkedExceptionClasses%
+ autowired:
+ - PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
+
+ -
+ class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInFunctionThrowsRule
+
+ -
+ class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInMethodThrowsRule
+
+ -
+ class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInPropertyHookThrowsRule
+
+ -
+ class: PHPStan\Rules\Exceptions\MissingCheckedExceptionInThrowsCheck
+ arguments:
+ exceptionTypeResolver: @exceptionTypeResolver
+
+ -
+ class: PHPStan\Rules\Exceptions\TooWideThrowTypeCheck
+ arguments:
+ implicitThrows: %exceptions.implicitThrows%
+
+ -
+ class: PHPStan\Rules\FunctionCallParametersCheck
+ arguments:
+ checkArgumentTypes: %checkFunctionArgumentTypes%
+ checkArgumentsPassedByReference: %checkArgumentsPassedByReference%
+ checkExtraArguments: %checkExtraArguments%
+ checkMissingTypehints: %checkMissingTypehints%
+
+ -
+ class: PHPStan\Rules\FunctionDefinitionCheck
+ arguments:
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+ checkThisOnly: %checkThisOnly%
-
class: PHPStan\Rules\FunctionReturnTypeCheck
+ -
+ class: PHPStan\Rules\ParameterCastableToStringCheck
+
+ -
+ class: PHPStan\Rules\Generics\CrossCheckInterfacesHelper
-
class: PHPStan\Rules\Generics\GenericAncestorsCheck
arguments:
- checkGenericClassInNonGenericObjectType: %checkGenericClassInNonGenericObjectType%
+ skipCheckGenericClasses: %featureToggles.skipCheckGenericClasses%
+ checkMissingTypehints: %checkMissingTypehints%
-
class: PHPStan\Rules\Generics\GenericObjectTypeCheck
+ -
+ class: PHPStan\Rules\Generics\MethodTagTemplateTypeCheck
+
-
class: PHPStan\Rules\Generics\TemplateTypeCheck
arguments:
checkClassCaseSensitivity: %checkClassCaseSensitivity%
- typeAliases: %typeAliases%
-
class: PHPStan\Rules\Generics\VarianceCheck
+ -
+ class: PHPStan\Rules\InternalTag\RestrictedInternalUsageHelper
+
-
class: PHPStan\Rules\IssetCheck
+ arguments:
+ checkAdvancedIsset: %checkAdvancedIsset%
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+
+ -
+ class: PHPStan\Rules\Methods\MethodCallCheck
+ arguments:
+ checkFunctionNameCase: %checkFunctionNameCase%
+ reportMagicMethods: %reportMagicMethods%
+
+ -
+ class: PHPStan\Rules\Methods\StaticMethodCallCheck
+ arguments:
+ checkFunctionNameCase: %checkFunctionNameCase%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
+ reportMagicMethods: %reportMagicMethods%
-
# checked as part of OverridingMethodRule
@@ -606,11 +1036,69 @@ services:
reportMaybes: %reportMaybesInMethodSignatures%
reportStatic: %reportStaticMethodSignatures%
+ -
+ class: PHPStan\Rules\Methods\MethodParameterComparisonHelper
+
+ -
+ class: PHPStan\Rules\Methods\MethodVisibilityComparisonHelper
+
-
class: PHPStan\Rules\MissingTypehintCheck
arguments:
- checkMissingIterableValueType: %checkMissingIterableValueType%
- checkGenericClassInNonGenericObjectType: %checkGenericClassInNonGenericObjectType%
+ checkMissingCallableSignature: %checkMissingCallableSignature%
+ skipCheckGenericClasses: %featureToggles.skipCheckGenericClasses%
+
+ -
+ class: PHPStan\Rules\NullsafeCheck
+
+ -
+ class: PHPStan\Rules\Constants\LazyAlwaysUsedClassConstantsExtensionProvider
+
+ -
+ class: PHPStan\Rules\Methods\LazyAlwaysUsedMethodExtensionProvider
+
+ -
+ class: PHPStan\Rules\PhpDoc\ConditionalReturnTypeRuleHelper
+
+ -
+ class: PHPStan\Rules\PhpDoc\AssertRuleHelper
+ arguments:
+ checkMissingTypehints: %checkMissingTypehints%
+ checkClassCaseSensitivity: %checkClassCaseSensitivity%
+
+ -
+ class: PHPStan\Rules\PhpDoc\UnresolvableTypeHelper
+
+ -
+ class: PHPStan\Rules\PhpDoc\GenericCallableRuleHelper
+
+ -
+ class: PHPStan\Rules\PhpDoc\IncompatiblePhpDocTypeCheck
+
+ -
+ class: PHPStan\Rules\PhpDoc\VarTagTypeRuleHelper
+ arguments:
+ checkTypeAgainstPhpDocType: %reportWrongPhpDocTypeInVarTag%
+ strictWideningCheck: %reportAnyTypeWideningInVarTag%
+
+ -
+ class: PHPStan\Rules\Playground\NeverRuleHelper
+
+ -
+ class: PHPStan\Rules\Properties\AccessPropertiesCheck
+ arguments:
+ reportMagicProperties: %reportMagicProperties%
+ checkDynamicProperties: %checkDynamicProperties%
+ -
+ class: PHPStan\Type\Php\BcMathNumberOperatorTypeSpecifyingExtension
+ tags:
+ - phpstan.broker.operatorTypeSpecifyingExtension
+
+ -
+ class: PHPStan\Rules\Properties\UninitializedPropertyRule
+
+ -
+ class: PHPStan\Rules\Properties\LazyReadWritePropertiesExtensionProvider
-
class: PHPStan\Rules\Properties\PropertyDescriptor
@@ -619,7 +1107,7 @@ services:
class: PHPStan\Rules\Properties\PropertyReflectionFinder
-
- class: PHPStan\Rules\RegistryFactory
+ class: PHPStan\Rules\Pure\FunctionPurityCheck
-
class: PHPStan\Rules\RuleLevelHelper
@@ -628,18 +1116,85 @@ services:
checkThisOnly: %checkThisOnly%
checkUnionTypes: %checkUnionTypes%
checkExplicitMixed: %checkExplicitMixed%
+ checkImplicitMixed: %checkImplicitMixed%
+ checkBenevolentUnionTypes: %checkBenevolentUnionTypes%
+ discoveringSymbolsTip: %tips.discoveringSymbols%
-
class: PHPStan\Rules\UnusedFunctionParametersCheck
+ arguments:
+ reportExactLine: %featureToggles.reportPreciseLineForUnusedFunctionParameter%
+
+ -
+ class: PHPStan\Rules\TooWideTypehints\TooWideParameterOutTypeCheck
-
class: PHPStan\Type\FileTypeMapper
+ arguments:
+ phpParser: @defaultAnalysisParser
+
+ stubFileTypeMapper:
+ class: PHPStan\Type\FileTypeMapper
+ arguments:
+ phpParser: @stubParser
+ autowired: false
+
+ -
+ class: PHPStan\Type\TypeAliasResolver
+ factory: PHPStan\Type\UsefulTypeAliasResolver
+ arguments:
+ globalTypeAliases: %typeAliases%
+
+ -
+ class: PHPStan\Type\TypeAliasResolverProvider
+ factory: PHPStan\Type\LazyTypeAliasResolverProvider
+
+ -
+ class: PHPStan\Type\BitwiseFlagHelper
+
+ -
+ class: PHPStan\Type\Php\AbsFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
class: PHPStan\Type\Php\ArgumentBasedFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
+ -
+ class: PHPStan\Type\Php\ArrayChangeKeyCaseFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayIntersectKeyFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayChunkFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayColumnHelper
+
+ -
+ class: PHPStan\Type\Php\ArrayColumnFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayCombineFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayCurrentDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
-
class: PHPStan\Type\Php\ArrayFillFunctionReturnTypeExtension
tags:
@@ -651,7 +1206,25 @@ services:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ArrayFilterFunctionReturnTypeReturnTypeExtension
+ class: PHPStan\Type\Php\ArrayFilterFunctionReturnTypeHelper
+
+ -
+ class: PHPStan\Type\Php\ArrayFilterFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayFlipFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayFindFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayFindKeyFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
@@ -681,193 +1254,558 @@ services:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ArrayMapFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\ArrayMapFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayMergeFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayNextDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayPopFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayRandFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayReduceFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayReplaceFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayReverseFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayShiftFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArraySliceFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArraySpliceFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArraySearchFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArraySearchFunctionTypeSpecifyingExtension
+ tags:
+ - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+
+ -
+ class: PHPStan\Type\Php\ArrayValuesFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ArraySumFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\AssertThrowTypeExtension
+ tags:
+ - phpstan.dynamicFunctionThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\BackedEnumFromMethodDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\Base64DecodeDynamicFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\BcMathStringOrNullReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ClosureBindDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ClosureBindToDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ClosureFromCallableDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\CompactFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+ arguments:
+ checkMaybeUndefinedVariables: %checkMaybeUndefinedVariables%
+
+ -
+ class: PHPStan\Type\Php\ConstantFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ConstantHelper
+
+ -
+ class: PHPStan\Type\Php\CountFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\CountCharsFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\CountFunctionTypeSpecifyingExtension
+ tags:
+ - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+
+ -
+ class: PHPStan\Type\Php\CurlGetinfoFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateFunctionReturnTypeHelper
+
+ -
+ class: PHPStan\Type\Php\DateFormatFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateFormatMethodReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateIntervalConstructorThrowTypeExtension
+ tags:
+ - phpstan.dynamicStaticMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateIntervalDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeCreateDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeModifyReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ dateTimeClass: DateTime
+
+ -
+ class: PHPStan\Type\Php\DateTimeModifyReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ arguments:
+ dateTimeClass: DateTimeImmutable
+
+ -
+ class: PHPStan\Type\Php\DateTimeConstructorThrowTypeExtension
+ tags:
+ - phpstan.dynamicStaticMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeModifyMethodThrowTypeExtension
+ tags:
+ - phpstan.dynamicMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeSubMethodThrowTypeExtension
+ tags:
+ - phpstan.dynamicMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DateTimeZoneConstructorThrowTypeExtension
+ tags:
+ - phpstan.dynamicStaticMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DsMapDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DsMapDynamicMethodThrowTypeExtension
+ tags:
+ - phpstan.dynamicMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DioStatDynamicFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ExplodeFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\FilterFunctionReturnTypeHelper
+
+ -
+ class: PHPStan\Type\Php\FilterInputDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\FilterVarDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\FilterVarArrayDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GetCalledClassDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GetClassDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GetDebugTypeFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GetDefinedVarsFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GettypeFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\GettimeofdayDynamicFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+ -
+ class: PHPStan\Type\Php\HashFunctionsReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\HighlightStringDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\IntdivThrowTypeExtension
+ tags:
+ - phpstan.dynamicFunctionThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\IniGetReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\JsonThrowTypeExtension
+ tags:
+ - phpstan.dynamicFunctionThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\OpenSslEncryptParameterOutTypeExtension
+ tags:
+ - phpstan.functionParameterOutTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ParseStrParameterOutTypeExtension
+ tags:
+ - phpstan.functionParameterOutTypeExtension
+
+ -
+ class: PHPStan\Type\Php\PregMatchTypeSpecifyingExtension
+ tags:
+ - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+
+ -
+ class: PHPStan\Type\Php\PregMatchParameterOutTypeExtension
+ tags:
+ - phpstan.functionParameterOutTypeExtension
+
+ -
+ class: PHPStan\Type\Php\PregReplaceCallbackClosureTypeExtension
+ tags:
+ - phpstan.functionParameterClosureTypeExtension
+
+ -
+ class: PHPStan\Type\Php\RegexArrayShapeMatcher
+
+ -
+ class: PHPStan\Type\Regex\RegexGroupParser
+
+ -
+ class: PHPStan\Type\Regex\RegexExpressionHelper
+
+ -
+ class: PHPStan\Type\Php\ReflectionClassConstructorThrowTypeExtension
+ tags:
+ - phpstan.dynamicStaticMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionFunctionConstructorThrowTypeExtension
+ tags:
+ - phpstan.dynamicStaticMethodThrowTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionMethodConstructorThrowTypeExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.dynamicStaticMethodThrowTypeExtension
-
- class: PHPStan\Type\Php\ArrayMergeFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\ReflectionPropertyConstructorThrowTypeExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.dynamicStaticMethodThrowTypeExtension
-
- class: PHPStan\Type\Php\ArrayPopFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\StrContainingTypeSpecifyingExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\ArrayReduceFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\SimpleXMLElementClassPropertyReflectionExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.broker.propertiesClassReflectionExtension
-
- class: PHPStan\Type\Php\ArrayShiftFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\SimpleXMLElementConstructorThrowTypeExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.dynamicStaticMethodThrowTypeExtension
-
- class: PHPStan\Type\Php\ArraySliceFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\StatDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\ArraySearchFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\MethodExistsTypeSpecifyingExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\ArrayValuesFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\PropertyExistsTypeSpecifyingExtension
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\Base64DecodeDynamicFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\MinMaxFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ClosureBindDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\NumberFormatFunctionDynamicReturnTypeExtension
tags:
- - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ClosureBindToDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\PathinfoFunctionDynamicReturnTypeExtension
tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ClosureFromCallableDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\PregFilterFunctionReturnTypeExtension
tags:
- - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\CountFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\PregSplitDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\CountFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\ReflectionClassIsSubclassOfTypeSpecifyingExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.typeSpecifier.methodTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\CurlInitReturnTypeExtension
+ class: PHPStan\Type\Php\ReplaceFunctionsDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\DsMapDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\ArrayPointerFunctionsDynamicReturnTypeExtension
tags:
- - phpstan.broker.dynamicMethodReturnTypeExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\DioStatDynamicFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\LtrimFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ExplodeFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\MbFunctionsReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\FilterVarDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\MbConvertEncodingFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\GetCalledClassDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\MbSubstituteCharacterDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\GetClassDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\MbStrlenFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\GetParentClassDynamicFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\MicrotimeFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\GettimeofdayDynamicFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\HrtimeFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\SimpleXMLElementClassPropertyReflectionExtension
+ class: PHPStan\Type\Php\ImplodeFunctionReturnTypeExtension
tags:
- - phpstan.broker.propertiesClassReflectionExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\StatDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\NonEmptyStringFunctionsReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
- - phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\MethodExistsTypeSpecifyingExtension
+ class: PHPStan\Type\Php\SetTypeFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\PropertyExistsTypeSpecifyingExtension
+ class: PHPStan\Type\Php\StrCaseFunctionsReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\MinMaxFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\StrlenFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\PathinfoFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\StrIncrementDecrementFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ReplaceFunctionsDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\StrPadFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ArrayPointerFunctionsDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\StrRepeatFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\VarExportFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\SubstrDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\MbFunctionsReturnTypeExtension
+ class: PHPStan\Type\Php\ThrowableReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ParseUrlFunctionDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\MbConvertEncodingFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\TriggerErrorDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\MicrotimeFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\TrimFunctionDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\HrtimeFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\VersionCompareFunctionDynamicReturnTypeExtension
+ arguments:
+ configPhpVersion: %phpVersion%
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\ParseUrlFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\PowFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\VersionCompareFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\RoundFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
@@ -896,6 +1834,11 @@ services:
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ -
+ class: PHPStan\Type\Php\ClassImplementsFunctionReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
-
class: PHPStan\Type\Php\DefineConstantTypeSpecifyingExtension
tags:
@@ -907,116 +1850,170 @@ services:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\InArrayFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\FunctionExistsFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsIntFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\InArrayFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsFloatFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IsArrayFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsNullFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IsCallableFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsArrayFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IsIterableFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsBoolFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IsSubclassOfFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsCallableFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IteratorToArrayFunctionReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\IsCountableFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IsAFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsResourceFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\IsAFunctionTypeSpecifyingHelper
+
+ -
+ class: PHPStan\Type\Php\CtypeDigitFunctionTypeSpecifyingExtension
tags:
- phpstan.typeSpecifier.functionTypeSpecifyingExtension
-
- class: PHPStan\Type\Php\IsIterableFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\JsonThrowOnErrorDynamicReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\IsStringFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\TypeSpecifyingFunctionsDynamicReturnTypeExtension
+ arguments:
+ treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ universalObjectCratesClasses: %universalObjectCratesClasses%
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\IsSubclassOfFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\SimpleXMLElementAsXMLMethodReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\IsObjectFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\SimpleXMLElementXpathMethodReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\IsNumericFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\StrSplitFunctionReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\IsScalarFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\StrTokFunctionReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\IsAFunctionTypeSpecifyingExtension
+ class: PHPStan\Type\Php\SprintfFunctionDynamicReturnTypeExtension
tags:
- - phpstan.typeSpecifier.functionTypeSpecifyingExtension
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\JsonThrowOnErrorDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\SscanfFunctionDynamicReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\TypeSpecifyingFunctionsDynamicReturnTypeExtension
- arguments:
- treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+ class: PHPStan\Type\Php\StrvalFamilyFunctionReturnTypeExtension
tags:
- phpstan.broker.dynamicFunctionReturnTypeExtension
-
- class: PHPStan\Type\Php\SimpleXMLElementAsXMLMethodReturnTypeExtension
+ class: PHPStan\Type\Php\StrWordCountFunctionDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicFunctionReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\XMLReaderOpenReturnTypeExtension
tags:
- phpstan.broker.dynamicMethodReturnTypeExtension
+ - phpstan.broker.dynamicStaticMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\StrSplitFunctionReturnTypeExtension
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionClass
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\SprintfFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionClassConstant
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
-
- class: PHPStan\Type\Php\StrWordCountFunctionDynamicReturnTypeExtension
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionFunctionAbstract
tags:
- - phpstan.broker.dynamicFunctionReturnTypeExtension
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionParameter
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\ReflectionGetAttributesMethodReturnTypeExtension
+ arguments:
+ className: ReflectionProperty
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\Php\DatePeriodConstructorReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicStaticMethodReturnTypeExtension
+
+ -
+ class: PHPStan\Type\PHPStan\ClassNameUsageLocationCreateIdentifierDynamicReturnTypeExtension
+ tags:
+ - phpstan.broker.dynamicMethodReturnTypeExtension
+ -
+ class: PHPStan\Type\ClosureTypeFactory
+ arguments:
+ parser: @currentPhpVersionPhpParser
+
+ -
+ class: PHPStan\Type\Constant\OversizedArrayBuilder
+
+ -
+ class: PHPStan\Rules\Functions\PrintfHelper
+
+ exceptionTypeResolver:
+ class: PHPStan\Rules\Exceptions\ExceptionTypeResolver
+ factory: @PHPStan\Rules\Exceptions\DefaultExceptionTypeResolver
typeSpecifier:
class: PHPStan\Analyser\TypeSpecifier
@@ -1031,6 +2028,7 @@ services:
arguments:
currentWorkingDirectory: %currentWorkingDirectory%
analysedPaths: %analysedPaths%
+ fallbackRelativePathHelper: @parentDirectoryRelativePathHelper
simpleRelativePathHelper:
class: PHPStan\File\RelativePathHelper
@@ -1039,14 +2037,11 @@ services:
currentWorkingDirectory: %currentWorkingDirectory%
autowired: false
- broker:
- class: PHPStan\Broker\Broker
- factory: @brokerFactory::create
- autowired:
- - PHPStan\Broker\Broker
-
- brokerFactory:
- class: PHPStan\Broker\BrokerFactory
+ parentDirectoryRelativePathHelper:
+ class: PHPStan\File\ParentDirectoryRelativePathHelper
+ arguments:
+ parentDirectory: %currentWorkingDirectory%
+ autowired: false
cacheStorage:
class: PHPStan\Cache\FileCacheStorage
@@ -1054,33 +2049,69 @@ services:
directory: %tmpDir%/cache/PHPStan
autowired: no
- directParser:
- class: PHPStan\Parser\DirectParser
+ currentPhpVersionRichParser:
+ class: PHPStan\Parser\RichParser
+ arguments:
+ parser: @currentPhpVersionPhpParser
+ autowired: no
+
+ currentPhpVersionSimpleParser:
+ class: PHPStan\Parser\CleaningParser
+ arguments:
+ wrappedParser: @currentPhpVersionSimpleDirectParser
+ autowired: no
+
+ currentPhpVersionSimpleDirectParser:
+ class: PHPStan\Parser\SimpleParser
+ arguments:
+ parser: @currentPhpVersionPhpParser
autowired: no
+ defaultAnalysisParser:
+ class: PHPStan\Parser\CachedParser
+ arguments:
+ originalParser: @pathRoutingParser
+ cachedNodesByStringCountMax: %cache.nodesByStringCountMax%
+ autowired: false
+
phpParserDecorator:
class: PHPStan\Parser\PhpParserDecorator
arguments:
- wrappedParser: @PHPStan\Parser\Parser
- autowired: no
+ wrappedParser: @defaultAnalysisParser
+ autowired: false
+
+ currentPhpVersionLexer:
+ class: PhpParser\Lexer
+ factory: @PHPStan\Parser\LexerFactory::create()
+ autowired: false
+
+ currentPhpVersionPhpParser:
+ factory: @currentPhpVersionPhpParserFactory::create()
+ autowired: false
+
+ currentPhpVersionPhpParserFactory:
+ class: PHPStan\Parser\PhpParserFactory
+ arguments:
+ lexer: @currentPhpVersionLexer
+ autowired: false
registry:
- class: PHPStan\Rules\Registry
- factory: @PHPStan\Rules\RegistryFactory::create
+ class: PHPStan\Rules\LazyRegistry
+ autowired:
+ - PHPStan\Rules\Registry
stubPhpDocProvider:
class: PHPStan\PhpDoc\StubPhpDocProvider
arguments:
- stubFiles: %stubFiles%
+ parser: @stubParser
+ fileTypeMapper: @stubFileTypeMapper
# Reflection providers
reflectionProviderFactory:
class: PHPStan\Reflection\ReflectionProvider\ReflectionProviderFactory
arguments:
- runtimeReflectionProvider: @runtimeReflectionProvider
staticReflectionProvider: @betterReflectionProvider
- disableRuntimeReflectionProvider: %featureToggles.disableRuntimeReflectionProvider%
reflectionProvider:
factory: @PHPStan\Reflection\ReflectionProvider\ReflectionProviderFactory::create
@@ -1088,102 +2119,133 @@ services:
- PHPStan\Reflection\ReflectionProvider
betterReflectionSourceLocator:
- class: Roave\BetterReflection\SourceLocator\Type\SourceLocator
+ class: PHPStan\BetterReflection\SourceLocator\Type\SourceLocator
factory: @PHPStan\Reflection\BetterReflection\BetterReflectionSourceLocatorFactory::create
autowired: false
- betterReflectionClassReflector:
- class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingClassReflector
+ originalBetterReflectionReflector:
+ class: PHPStan\BetterReflection\Reflector\DefaultReflector
arguments:
sourceLocator: @betterReflectionSourceLocator
- autowired: false
-
- nodeScopeResolverClassReflector:
- factory: @betterReflectionClassReflector
- autowired: false
- betterReflectionFunctionReflector:
- class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingFunctionReflector
+ betterReflectionReflector:
+ class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingReflector
arguments:
- classReflector: @betterReflectionClassReflector
- sourceLocator: @betterReflectionSourceLocator
+ reflector: @originalBetterReflectionReflector
autowired: false
- betterReflectionConstantReflector:
- class: PHPStan\Reflection\BetterReflection\Reflector\MemoizingConstantReflector
- arguments:
- classReflector: @betterReflectionClassReflector
- sourceLocator: @betterReflectionSourceLocator
+ nodeScopeResolverReflector:
+ factory: @betterReflectionReflector
autowired: false
betterReflectionProvider:
class: PHPStan\Reflection\BetterReflection\BetterReflectionProvider
arguments:
- classReflector: @betterReflectionClassReflector
- functionReflector: @betterReflectionFunctionReflector
- constantReflector: @betterReflectionConstantReflector
- autowired: false
-
- regexParser:
- class: Hoa\Compiler\Llk\Parser
- factory: Hoa\Compiler\Llk\Llk::load(@regexGrammarStream)
-
- regexGrammarStream:
- class: Hoa\File\Read
- arguments:
- streamName: 'hoa://Library/Regex/Grammar.pp'
-
- runtimeReflectionProvider:
- class: PHPStan\Reflection\ReflectionProvider\ClassBlacklistReflectionProvider
- arguments:
- reflectionProvider: @innerRuntimeReflectionProvider
- patterns: %staticReflectionClassNamePatterns%
+ reflector: @betterReflectionReflector
+ universalObjectCratesClasses: %universalObjectCratesClasses%
autowired: false
- innerRuntimeReflectionProvider:
- class: PHPStan\Reflection\Runtime\RuntimeReflectionProvider
-
-
class: PHPStan\Reflection\BetterReflection\BetterReflectionSourceLocatorFactory
arguments:
parser: @phpParserDecorator
- autoloadDirectories: %autoload_directories%
- autoloadFiles: %autoload_files%
+ php8Parser: @php8PhpParser
scanFiles: %scanFiles%
scanDirectories: %scanDirectories%
analysedPaths: %analysedPaths%
composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
analysedPathsFromConfig: %analysedPathsFromConfig%
+ playgroundMode: %sourceLocatorPlaygroundMode%
-
implement: PHPStan\Reflection\BetterReflection\BetterReflectionProviderFactory
+ arguments:
+ universalObjectCratesClasses: %universalObjectCratesClasses%
-
- class: Roave\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber
+ class: PHPStan\Reflection\BetterReflection\SourceStubber\PhpStormStubsSourceStubberFactory
arguments:
- phpParser: @phpParserDecorator
+ phpParser: @php8PhpParser
+
+ -
+ factory: @PHPStan\Reflection\BetterReflection\SourceStubber\PhpStormStubsSourceStubberFactory::create()
autowired:
- - Roave\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber
+ - PHPStan\BetterReflection\SourceLocator\SourceStubber\PhpStormStubsSourceStubber
-
- class: Roave\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
+ factory: @PHPStan\Reflection\BetterReflection\SourceStubber\ReflectionSourceStubberFactory::create()
autowired:
- - Roave\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
+ - PHPStan\BetterReflection\SourceLocator\SourceStubber\ReflectionSourceStubber
+
+ -
+ class: PHPStan\Reflection\BetterReflection\SourceStubber\ReflectionSourceStubberFactory
+
+ -
+ class: PHPStan\Reflection\Deprecation\DeprecationProvider
+
+ php8Lexer:
+ class: PhpParser\Lexer\Emulative
+ factory: @PHPStan\Parser\LexerFactory::createEmulative()
+ autowired: false
+
+ php8PhpParser:
+ class: PhpParser\Parser\Php8
+ arguments:
+ lexer: @php8Lexer
+ autowired: false
+
+ php8Parser:
+ class: PHPStan\Parser\SimpleParser
+ arguments:
+ parser: @php8PhpParser
+ autowired: false
+
+ pathRoutingParser:
+ class: PHPStan\Parser\PathRoutingParser
+ arguments:
+ currentPhpVersionRichParser: @currentPhpVersionRichParser
+ currentPhpVersionSimpleParser: @currentPhpVersionSimpleParser
+ php8Parser: @php8Parser
+ autowired: false
+
+ freshStubParser:
+ class: PHPStan\Parser\StubParser
+ arguments:
+ parser: @php8PhpParser
+ autowired: false
+
+ stubParser:
+ class: PHPStan\Parser\CachedParser
+ arguments:
+ originalParser: @freshStubParser
+ cachedNodesByStringCountMax: %cache.nodesByStringCountMax%
+ autowired: false
+
+ phpstanDiagnoseExtension:
+ class: PHPStan\Diagnose\PHPStanDiagnoseExtension
+ arguments:
+ composerAutoloaderProjectPaths: %composerAutoloaderProjectPaths%
+ allConfigFiles: %allConfigFiles%
+ configPhpVersion: %phpVersion%
+ autowired: false
# Error formatters
+ -
+ class: PHPStan\Command\ErrorFormatter\CiDetectedErrorFormatter
+ autowired:
+ - PHPStan\Command\ErrorFormatter\CiDetectedErrorFormatter
+
errorFormatter.raw:
class: PHPStan\Command\ErrorFormatter\RawErrorFormatter
- errorFormatter.baselineNeon:
- class: PHPStan\Command\ErrorFormatter\BaselineNeonErrorFormatter
- arguments:
- relativePathHelper: @simpleRelativePathHelper
-
errorFormatter.table:
class: PHPStan\Command\ErrorFormatter\TableErrorFormatter
arguments:
+ simpleRelativePathHelper: @simpleRelativePathHelper
showTipsOfTheDay: %tipsOfTheDay%
+ editorUrl: %editorUrl%
+ editorUrlTitle: %editorUrlTitle%
errorFormatter.checkstyle:
class: PHPStan\Command\ErrorFormatter\CheckstyleErrorFormatter
@@ -1209,3 +2271,13 @@ services:
class: PHPStan\Command\ErrorFormatter\GitlabErrorFormatter
arguments:
relativePathHelper: @simpleRelativePathHelper
+
+ errorFormatter.github:
+ class: PHPStan\Command\ErrorFormatter\GithubErrorFormatter
+ arguments:
+ relativePathHelper: @simpleRelativePathHelper
+
+ errorFormatter.teamcity:
+ class: PHPStan\Command\ErrorFormatter\TeamcityErrorFormatter
+ arguments:
+ relativePathHelper: @simpleRelativePathHelper
diff --git a/conf/config.stubValidator.neon b/conf/config.stubValidator.neon
index df76b38866..52eac72312 100644
--- a/conf/config.stubValidator.neon
+++ b/conf/config.stubValidator.neon
@@ -1,50 +1,37 @@
parameters:
checkThisOnly: false
checkClassCaseSensitivity: true
- checkGenericClassInNonGenericObjectType: true
- checkMissingIterableValueType: true
checkMissingTypehints: true
+ checkMissingCallableSignature: false
+ __validate: false
services:
-
class: PHPStan\PhpDoc\StubSourceLocatorFactory
arguments:
- parser: @phpParserDecorator
- stubFiles: %stubFiles%
+ php8Parser: @php8PhpParser
- nodeScopeResolverClassReflector:
- factory: @stubClassReflector
+ defaultAnalysisParser!:
+ factory: @stubParser
+
+ nodeScopeResolverReflector:
+ factory: @stubReflector
stubBetterReflectionProvider:
class: PHPStan\Reflection\BetterReflection\BetterReflectionProvider
arguments:
- classReflector: @stubClassReflector
- functionReflector: @stubFunctionReflector
- constantReflector: @stubConstantReflector
+ reflector: @stubReflector
+ universalObjectCratesClasses: %universalObjectCratesClasses%
autowired: false
- stubClassReflector:
- class: Roave\BetterReflection\Reflector\ClassReflector
+ stubReflector:
+ class: PHPStan\BetterReflection\Reflector\DefaultReflector
arguments:
sourceLocator: @stubSourceLocator
autowired: false
- stubFunctionReflector:
- class: Roave\BetterReflection\Reflector\FunctionReflector
- arguments:
- classReflector: @stubClassReflector
- sourceLocator: @stubSourceLocator
- autowired: false
-
- stubConstantReflector:
- class: Roave\BetterReflection\Reflector\ConstantReflector
- arguments:
- classReflector: @stubClassReflector
- sourceLocator: @stubSourceLocator
- autowired: false
-
stubSourceLocator:
- class: Roave\BetterReflection\SourceLocator\Type\SourceLocator
+ class: PHPStan\BetterReflection\SourceLocator\Type\SourceLocator
factory: @PHPStan\PhpDoc\StubSourceLocatorFactory::create()
autowired: false
@@ -52,3 +39,11 @@ services:
factory: @stubBetterReflectionProvider
autowired:
- PHPStan\Reflection\ReflectionProvider
+
+ currentPhpVersionLexer:
+ factory: @php8Lexer
+ autowired: false
+
+ currentPhpVersionPhpParser:
+ factory: @php8PhpParser
+ autowired: false
diff --git a/conf/parametersSchema.neon b/conf/parametersSchema.neon
new file mode 100644
index 0000000000..d18df776e3
--- /dev/null
+++ b/conf/parametersSchema.neon
@@ -0,0 +1,194 @@
+parametersSchema:
+ bootstrapFiles: listOf(string())
+ excludePaths: anyOf(
+ structure([
+ analyse: listOf(string()),
+ ]),
+ structure([
+ analyseAndScan: listOf(string()),
+ ])
+ structure([
+ analyse: listOf(string()),
+ analyseAndScan: listOf(string())
+ ])
+ )
+ level: schema(anyOf(int(), string()), nullable())
+ paths: listOf(string())
+ exceptions: structure([
+ implicitThrows: bool(),
+ reportUncheckedExceptionDeadCatch: bool(),
+ uncheckedExceptionRegexes: listOf(string()),
+ uncheckedExceptionClasses: listOf(string()),
+ checkedExceptionRegexes: listOf(string()),
+ checkedExceptionClasses: listOf(string()),
+ check: structure([
+ missingCheckedExceptionInThrows: bool(),
+ tooWideThrowType: bool()
+ ])
+ ])
+ featureToggles: structure([
+ bleedingEdge: bool(),
+ checkParameterCastableToNumberFunctions: bool(),
+ skipCheckGenericClasses: listOf(string()),
+ stricterFunctionMap: bool()
+ reportPreciseLineForUnusedFunctionParameter: bool()
+ internalTag: bool()
+ ])
+ fileExtensions: listOf(string())
+ checkAdvancedIsset: bool()
+ reportAlwaysTrueInLastCondition: bool()
+ checkClassCaseSensitivity: bool()
+ checkExplicitMixed: bool()
+ checkImplicitMixed: bool()
+ checkFunctionArgumentTypes: bool()
+ checkFunctionNameCase: bool()
+ checkInternalClassCaseSensitivity: bool()
+ checkMissingCallableSignature: bool()
+ checkMissingVarTagTypehint: bool()
+ checkArgumentsPassedByReference: bool()
+ checkMaybeUndefinedVariables: bool()
+ checkNullables: bool()
+ checkThisOnly: bool()
+ checkUnionTypes: bool()
+ checkBenevolentUnionTypes: bool()
+ checkExplicitMixedMissingReturn: bool()
+ checkPhpDocMissingReturn: bool()
+ checkPhpDocMethodSignatures: bool()
+ checkExtraArguments: bool()
+ checkMissingTypehints: bool()
+ checkTooWideReturnTypesInProtectedAndPublicMethods: bool()
+ checkUninitializedProperties: bool()
+ checkDynamicProperties: bool()
+ strictRulesInstalled: bool()
+ deprecationRulesInstalled: bool()
+ inferPrivatePropertyTypeFromConstructor: bool()
+
+ tips: structure([
+ discoveringSymbols: bool()
+ treatPhpDocTypesAsCertain: bool()
+ ])
+ tipsOfTheDay: bool()
+ reportMaybes: bool()
+ reportMaybesInMethodSignatures: bool()
+ reportMaybesInPropertyPhpDocTypes: bool()
+ reportStaticMethodSignatures: bool()
+ reportWrongPhpDocTypeInVarTag: bool()
+ reportAnyTypeWideningInVarTag: bool()
+ reportPossiblyNonexistentGeneralArrayOffset: bool()
+ reportPossiblyNonexistentConstantArrayOffset: bool()
+ checkMissingOverrideMethodAttribute: bool()
+ parallel: structure([
+ jobSize: int(),
+ processTimeout: float(),
+ maximumNumberOfProcesses: int(),
+ minimumNumberOfJobsPerProcess: int(),
+ buffer: int()
+ ])
+ phpVersion: schema(anyOf(
+ schema(int(), min(70100), max(80499)),
+ structure([
+ min: schema(int(), min(70100), max(80499)),
+ max: schema(int(), min(70100), max(80499))
+ ])
+ ), nullable())
+ polluteScopeWithLoopInitialAssignments: bool()
+ polluteScopeWithAlwaysIterableForeach: bool()
+ polluteScopeWithBlock: bool()
+ propertyAlwaysWrittenTags: listOf(string())
+ propertyAlwaysReadTags: listOf(string())
+ additionalConstructors: listOf(string())
+ treatPhpDocTypesAsCertain: bool()
+ usePathConstantsAsConstantString: bool()
+ rememberPossiblyImpureFunctionValues: bool()
+ reportMagicMethods: bool()
+ reportMagicProperties: bool()
+ ignoreErrors: listOf(
+ anyOf(
+ string(),
+ structure([
+ ?messages: listOf(string())
+ ?identifier: string()
+ ?path: string()
+ ?reportUnmatched: bool()
+ ]),
+ structure([
+ ?message: string()
+ ?identifier: string()
+ ?path: string()
+ ?reportUnmatched: bool()
+ ]),
+ structure([
+ ?message: string()
+ count: int()
+ path: string()
+ ?identifier: string()
+ ?reportUnmatched: bool()
+ ]),
+ structure([
+ ?message: string()
+ paths: listOf(string())
+ ?identifier: string()
+ ?reportUnmatched: bool()
+ ]),
+ structure([
+ ?messages: listOf(string())
+ paths: listOf(string())
+ ?identifier: string()
+ ?reportUnmatched: bool()
+ ])
+ )
+ )
+ internalErrorsCountLimit: int()
+ cache: structure([
+ nodesByStringCountMax: int()
+ ])
+ reportUnmatchedIgnoredErrors: bool()
+ typeAliases: arrayOf(string())
+ universalObjectCratesClasses: listOf(string())
+ stubFiles: listOf(string())
+ earlyTerminatingMethodCalls: arrayOf(listOf(string()))
+ earlyTerminatingFunctionCalls: listOf(string())
+ resultCachePath: string()
+ resultCacheSkipIfOlderThanDays: int()
+ resultCacheChecksProjectExtensionFilesDependencies: bool()
+ dynamicConstantNames: listOf(string())
+ customRulesetUsed: schema(bool(), nullable())
+ rootDir: string()
+ tmpDir: string()
+ currentWorkingDirectory: string()
+ cliArgumentsVariablesRegistered: bool()
+ mixinExcludeClasses: listOf(string())
+ scanFiles: listOf(string())
+ scanDirectories: listOf(string())
+ editorUrl: schema(string(), nullable())
+ editorUrlTitle: schema(string(), nullable())
+ errorFormat: schema(string(), nullable())
+ pro: structure([
+ dnsServers: schema(listOf(string()), min(1)),
+ tmpDir: string()
+ ])
+ env: arrayOf(string(), anyOf(int(), string()))
+ sysGetTempDir: string()
+ parametersNotInvalidatingCache: listOf(schema(anyOf(
+ string(),
+ listOf(string()),
+ )))
+
+ # playground mode
+ sourceLocatorPlaygroundMode: bool()
+
+ # irrelevant Nette parameters
+ debugMode: bool()
+ productionMode: bool()
+ tempDir: string()
+ __validate: bool()
+
+ # internal parameters only for DerivativeContainerFactory
+ additionalConfigFiles: listOf(string())
+ generateBaselineFile: schema(string(), nullable())
+ analysedPaths: listOf(string())
+ allConfigFiles: listOf(string())
+ composerAutoloaderProjectPaths: listOf(string())
+ analysedPathsFromConfig: listOf(string())
+ usedLevel: string()
+ cliAutoloadFile: schema(string(), nullable())
diff --git a/conf/staticReflection.neon b/conf/staticReflection.neon
deleted file mode 100644
index 7fe9268c0b..0000000000
--- a/conf/staticReflection.neon
+++ /dev/null
@@ -1,5 +0,0 @@
-# WARNING - This isn't ready for use
-
-parameters:
- featureToggles:
- disableRuntimeReflectionProvider: true
diff --git a/e2e/PHPStanErrorPatch.patch b/e2e/PHPStanErrorPatch.patch
new file mode 100644
index 0000000000..3d23608791
--- /dev/null
+++ b/e2e/PHPStanErrorPatch.patch
@@ -0,0 +1,11 @@
+--- Error.php 2022-09-28 15:43:03.000000000 +0200
++++ Error.php 2022-10-17 20:47:54.000000000 +0200
+@@ -105,7 +105,7 @@
+
+ public function canBeIgnored(): bool
+ {
+- return $this->canBeIgnored === true;
++ return !$this->canBeIgnored instanceof Throwable;
+ }
+
+ public function hasNonIgnorableException(): bool
diff --git a/e2e/bad-exclude-paths/excludePaths.neon b/e2e/bad-exclude-paths/excludePaths.neon
new file mode 100644
index 0000000000..14ed59cad4
--- /dev/null
+++ b/e2e/bad-exclude-paths/excludePaths.neon
@@ -0,0 +1,9 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ excludePaths:
+ - tests
diff --git a/e2e/bad-exclude-paths/ignore.neon b/e2e/bad-exclude-paths/ignore.neon
new file mode 100644
index 0000000000..26d56b4b57
--- /dev/null
+++ b/e2e/bad-exclude-paths/ignore.neon
@@ -0,0 +1,11 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ ignoreErrors:
+ -
+ message: '#aaa#'
+ path: tests
diff --git a/e2e/bad-exclude-paths/ignoreNonexistentExcludePath.neon b/e2e/bad-exclude-paths/ignoreNonexistentExcludePath.neon
new file mode 100644
index 0000000000..b78c536f97
--- /dev/null
+++ b/e2e/bad-exclude-paths/ignoreNonexistentExcludePath.neon
@@ -0,0 +1,10 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - .
+ excludePaths:
+ - node_modules (?)
+ - tmp-node-modules
diff --git a/e2e/bad-exclude-paths/ignoreReportUnmatchedFalse.neon b/e2e/bad-exclude-paths/ignoreReportUnmatchedFalse.neon
new file mode 100644
index 0000000000..2206595e61
--- /dev/null
+++ b/e2e/bad-exclude-paths/ignoreReportUnmatchedFalse.neon
@@ -0,0 +1,12 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ reportUnmatchedIgnoredErrors: false
+ ignoreErrors:
+ -
+ message: '#aaa#'
+ path: tests
diff --git a/e2e/bad-exclude-paths/phpneon.php b/e2e/bad-exclude-paths/phpneon.php
new file mode 100644
index 0000000000..92ebd989a1
--- /dev/null
+++ b/e2e/bad-exclude-paths/phpneon.php
@@ -0,0 +1,17 @@
+ [
+ __DIR__ . '/../../conf/bleedingEdge.neon',
+ ],
+ 'parameters' => [
+ 'level' => '8',
+ 'paths' => [__DIR__ . '/src'],
+ 'ignoreErrors' => [
+ [
+ 'message' => '#aaa#',
+ 'path' => 'src/test.php', // not absolute path - invalid in .php config
+ ],
+ ],
+ ],
+];
diff --git a/e2e/bad-exclude-paths/phpneon2.php b/e2e/bad-exclude-paths/phpneon2.php
new file mode 100644
index 0000000000..4c06f1f310
--- /dev/null
+++ b/e2e/bad-exclude-paths/phpneon2.php
@@ -0,0 +1,16 @@
+ [
+ __DIR__ . '/../../conf/bleedingEdge.neon',
+ ],
+ 'parameters' => [
+ 'level' => '8',
+ 'paths' => [__DIR__ . '/src'],
+ 'excludePaths' => [
+ 'analyse' => [
+ 'src/test.php', // not absolute path - invalid in .php config
+ ],
+ ],
+ ],
+];
diff --git a/e2e/bad-exclude-paths/src/test.php b/e2e/bad-exclude-paths/src/test.php
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bad-exclude-paths/tmp-node-modules/test.php b/e2e/bad-exclude-paths/tmp-node-modules/test.php
new file mode 100644
index 0000000000..c24b518fb0
--- /dev/null
+++ b/e2e/bad-exclude-paths/tmp-node-modules/test.php
@@ -0,0 +1,3 @@
+x;
+ }
+
+ public function init(): void
+ {
+ $this->x = rand();
+ }
+}
diff --git a/e2e/baseline-uninit-prop-trait/src/HelloWorld.php b/e2e/baseline-uninit-prop-trait/src/HelloWorld.php
new file mode 100644
index 0000000000..f7ad689a59
--- /dev/null
+++ b/e2e/baseline-uninit-prop-trait/src/HelloWorld.php
@@ -0,0 +1,14 @@
+init();
+ $this->foo();
+ }
+}
diff --git a/e2e/baseline-uninit-prop-trait/test-no-baseline.neon b/e2e/baseline-uninit-prop-trait/test-no-baseline.neon
new file mode 100644
index 0000000000..3e639cd0d2
--- /dev/null
+++ b/e2e/baseline-uninit-prop-trait/test-no-baseline.neon
@@ -0,0 +1,4 @@
+parameters:
+ level: 9
+ paths:
+ - src
diff --git a/e2e/baseline-uninit-prop-trait/test.neon b/e2e/baseline-uninit-prop-trait/test.neon
new file mode 100644
index 0000000000..9b21d7b642
--- /dev/null
+++ b/e2e/baseline-uninit-prop-trait/test.neon
@@ -0,0 +1,3 @@
+includes:
+ - test-baseline.neon
+ - test-no-baseline.neon
diff --git a/e2e/bug-11819/phpstan.neon b/e2e/bug-11819/phpstan.neon
new file mode 100644
index 0000000000..5fbd64483a
--- /dev/null
+++ b/e2e/bug-11819/phpstan.neon
@@ -0,0 +1,4 @@
+parameters:
+ level: 5
+ paths:
+ - test.php
diff --git a/e2e/bug-11819/test.php b/e2e/bug-11819/test.php
new file mode 100644
index 0000000000..267e1647ad
--- /dev/null
+++ b/e2e/bug-11819/test.php
@@ -0,0 +1,11 @@
+
+ */
+class DummyRule implements Rule
+{
+
+ public function getNodeType(): string
+ {
+ return InClassNode::class;
+ }
+
+ /**
+ * @param InClassNode $node
+ * @return list
+ */
+ public function processNode(
+ Node $node,
+ Scope $scope,
+ ): array
+ {
+ return [FatalErrorWhenAutoloaded::AUTOLOAD];
+ }
+
+}
diff --git a/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php b/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php
new file mode 100644
index 0000000000..a75127a356
--- /dev/null
+++ b/e2e/bug-11826/src/FatalErrorWhenAutoloaded.php
@@ -0,0 +1,11 @@
+getName() === 'belongsTo';
+ }
+
+ public function getTypeFromMethodCall(MethodReflection $methodReflection, MethodCall $methodCall, Scope $scope): Type {
+ $returnType = $methodReflection->getVariants()[0]->getReturnType();
+ $argType = $scope->getType($methodCall->getArgs()[0]->value);
+ $modelClass = $argType->getClassStringObjectType()->getObjectClassNames()[0];
+
+ return new GenericObjectType($returnType->getObjectClassNames()[0], [
+ new ObjectType($modelClass),
+ $scope->getType($methodCall->var),
+ ]);
+ }
+}
+
diff --git a/e2e/bug-11857/src/test.php b/e2e/bug-11857/src/test.php
new file mode 100644
index 0000000000..5c237f25e8
--- /dev/null
+++ b/e2e/bug-11857/src/test.php
@@ -0,0 +1,70 @@
+ */
+ public function belongsTo(string $related): BelongsTo
+ {
+ return new BelongsTo();
+ }
+}
+
+/**
+ * @template TRelatedModel of Model
+ * @template TDeclaringModel of Model
+ */
+class BelongsTo {}
+
+class User extends Model {}
+
+class Post extends Model
+{
+ /** @return BelongsTo */
+ public function user(): BelongsTo
+ {
+ return $this->belongsTo(User::class);
+ }
+
+ /** @return BelongsTo */
+ public function userSelf(): BelongsTo
+ {
+ /** @phpstan-ignore return.type */
+ return $this->belongsTo(User::class);
+ }
+}
+
+class ChildPost extends Post {}
+
+final class Comment extends Model
+{
+ // This model is final, so either of these
+ // two methods would work. It seems that
+ // PHPStan is automatically converting the
+ // `$this` to a `self` type in the user docblock,
+ // but it is not doing so likewise for the `$this`
+ // that is returned by the dynamic return extension.
+
+ /** @return BelongsTo */
+ public function user(): BelongsTo
+ {
+ return $this->belongsTo(User::class);
+ }
+
+ /** @return BelongsTo */
+ public function user2(): BelongsTo
+ {
+ /** @phpstan-ignore return.type */
+ return $this->belongsTo(User::class);
+ }
+}
+
+function test(ChildPost $child): void
+{
+ assertType('Bug11857\BelongsTo', $child->user());
+ // This demonstrates why `$this` is needed in non-final models
+ assertType('Bug11857\BelongsTo', $child->userSelf()); // should be: Bug11857\BelongsTo
+}
diff --git a/e2e/bug-12606/phpstan.neon b/e2e/bug-12606/phpstan.neon
new file mode 100644
index 0000000000..1557144b26
--- /dev/null
+++ b/e2e/bug-12606/phpstan.neon
@@ -0,0 +1,2 @@
+includes:
+ - %env.CONFIGTEST%.neon
diff --git a/e2e/bug-12606/src/empty.php b/e2e/bug-12606/src/empty.php
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bug-12606/test.neon b/e2e/bug-12606/test.neon
new file mode 100644
index 0000000000..c308dcf542
--- /dev/null
+++ b/e2e/bug-12606/test.neon
@@ -0,0 +1,4 @@
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/bug-12606/test.php b/e2e/bug-12606/test.php
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bug-9622-trait/baseline-1.neon b/e2e/bug-9622-trait/baseline-1.neon
new file mode 100644
index 0000000000..caa24d89e8
--- /dev/null
+++ b/e2e/bug-9622-trait/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Offset 'foo' might not exist on array\\{foo\\?\\: int\\}\\.$#"
+ count: 1
+ path: src/UsesBar.php
diff --git a/e2e/bug-9622-trait/patch-1.patch b/e2e/bug-9622-trait/patch-1.patch
new file mode 100644
index 0000000000..cc2a6a622d
--- /dev/null
+++ b/e2e/bug-9622-trait/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Foo.php 2023-07-13 09:01:37
++++ src/Foo.php 2023-07-13 09:02:20
+@@ -3,7 +3,7 @@
+ namespace Bug9622Trait;
+
+ /**
+- * @phpstan-type AnArray array{foo: int}
++ * @phpstan-type AnArray array{foo?: int}
+ */
+ class Foo
+ {
diff --git a/e2e/bug-9622-trait/phpstan-baseline.neon b/e2e/bug-9622-trait/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/bug-9622-trait/phpstan.neon b/e2e/bug-9622-trait/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/bug-9622-trait/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/bug-9622-trait/src/Bar.php b/e2e/bug-9622-trait/src/Bar.php
new file mode 100644
index 0000000000..082a948bd5
--- /dev/null
+++ b/e2e/bug-9622-trait/src/Bar.php
@@ -0,0 +1,19 @@
+ $query
+ *
+ * @return T
+ */
+ public function handle(QueryInterface $query);
+}
\ No newline at end of file
diff --git a/e2e/bug10449/src/Bus/QueryHandlerInterface.php b/e2e/bug10449/src/Bus/QueryHandlerInterface.php
new file mode 100644
index 0000000000..88faa0164a
--- /dev/null
+++ b/e2e/bug10449/src/Bus/QueryHandlerInterface.php
@@ -0,0 +1,9 @@
+queryBus->handle(new Query\ExampleQuery());
+ $this->needsString($value);
+ return $value;
+ }
+
+ private function needsString(string $s):void {}
+}
\ No newline at end of file
diff --git a/e2e/bug10449/src/Query/ExampleQuery.php b/e2e/bug10449/src/Query/ExampleQuery.php
new file mode 100644
index 0000000000..a5c7637793
--- /dev/null
+++ b/e2e/bug10449/src/Query/ExampleQuery.php
@@ -0,0 +1,15 @@
+
+ */
+final class ExampleQuery implements QueryInterface
+{
+}
\ No newline at end of file
diff --git a/e2e/bug10449/src/Query/ExampleQueryHandler.php b/e2e/bug10449/src/Query/ExampleQueryHandler.php
new file mode 100644
index 0000000000..e9bc1d59f0
--- /dev/null
+++ b/e2e/bug10449/src/Query/ExampleQueryHandler.php
@@ -0,0 +1,19 @@
+ $query
+ *
+ * @return T
+ */
+ public function handle(QueryInterface $query);
+}
\ No newline at end of file
diff --git a/e2e/bug10449b/src/Bus/QueryHandlerInterface.php b/e2e/bug10449b/src/Bus/QueryHandlerInterface.php
new file mode 100644
index 0000000000..88faa0164a
--- /dev/null
+++ b/e2e/bug10449b/src/Bus/QueryHandlerInterface.php
@@ -0,0 +1,9 @@
+queryBus->handle($x);
+ $this->needsString($value);
+ return $value;
+ }
+
+ return 'hello';
+ }
+
+ private function needsString(string $s):void {}
+}
\ No newline at end of file
diff --git a/e2e/bug10449b/src/Query/ExampleQuery.php b/e2e/bug10449b/src/Query/ExampleQuery.php
new file mode 100644
index 0000000000..a5c7637793
--- /dev/null
+++ b/e2e/bug10449b/src/Query/ExampleQuery.php
@@ -0,0 +1,15 @@
+
+ */
+final class ExampleQuery implements QueryInterface
+{
+}
\ No newline at end of file
diff --git a/e2e/bug10449b/src/Query/ExampleQueryHandler.php b/e2e/bug10449b/src/Query/ExampleQueryHandler.php
new file mode 100644
index 0000000000..e9bc1d59f0
--- /dev/null
+++ b/e2e/bug10449b/src/Query/ExampleQueryHandler.php
@@ -0,0 +1,19 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 3>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('false', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('true', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/composer-max-version/.gitignore b/e2e/composer-max-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-max-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-max-version/composer.json b/e2e/composer-max-version/composer.json
new file mode 100644
index 0000000000..4d4ca141ef
--- /dev/null
+++ b/e2e/composer-max-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "<=8.3"
+ }
+}
diff --git a/e2e/composer-max-version/test.php b/e2e/composer-max-version/test.php
new file mode 100644
index 0000000000..038f559122
--- /dev/null
+++ b/e2e/composer-max-version/test.php
@@ -0,0 +1,10 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('int<5, 8>', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('-1|0|1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('bool', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('bool', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/composer-min-max-version/.gitignore b/e2e/composer-min-max-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-max-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-max-version/composer.json b/e2e/composer-min-max-version/composer.json
new file mode 100644
index 0000000000..869fd2ce42
--- /dev/null
+++ b/e2e/composer-min-max-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": ">=8.1, <=8.2.99"
+ }
+}
diff --git a/e2e/composer-min-max-version/test.php b/e2e/composer-min-max-version/test.php
new file mode 100644
index 0000000000..28d770f3bb
--- /dev/null
+++ b/e2e/composer-min-max-version/test.php
@@ -0,0 +1,10 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 2>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('false', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('true', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/composer-min-open-end-version/.gitignore b/e2e/composer-min-open-end-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-open-end-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-open-end-version/composer.json b/e2e/composer-min-open-end-version/composer.json
new file mode 100644
index 0000000000..b6303c6b77
--- /dev/null
+++ b/e2e/composer-min-open-end-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": ">= 8.1"
+ }
+}
diff --git a/e2e/composer-min-open-end-version/test.php b/e2e/composer-min-open-end-version/test.php
new file mode 100644
index 0000000000..d4d06a34eb
--- /dev/null
+++ b/e2e/composer-min-open-end-version/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 4>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-min-version-v5/.gitignore b/e2e/composer-min-version-v5/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-version-v5/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-version-v5/composer.json b/e2e/composer-min-version-v5/composer.json
new file mode 100644
index 0000000000..b73464d219
--- /dev/null
+++ b/e2e/composer-min-version-v5/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^5.6"
+ }
+}
diff --git a/e2e/composer-min-version-v5/test.php b/e2e/composer-min-version-v5/test.php
new file mode 100644
index 0000000000..2f652079a6
--- /dev/null
+++ b/e2e/composer-min-version-v5/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('5', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('6', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, 99>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-min-version-v7/.gitignore b/e2e/composer-min-version-v7/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-version-v7/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-version-v7/composer.json b/e2e/composer-min-version-v7/composer.json
new file mode 100644
index 0000000000..9f9b263871
--- /dev/null
+++ b/e2e/composer-min-version-v7/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^7"
+ }
+}
diff --git a/e2e/composer-min-version-v7/test.php b/e2e/composer-min-version-v7/test.php
new file mode 100644
index 0000000000..e8876bd78f
--- /dev/null
+++ b/e2e/composer-min-version-v7/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('7', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<0, 4>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-min-version/.gitignore b/e2e/composer-min-version/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-min-version/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-min-version/composer.json b/e2e/composer-min-version/composer.json
new file mode 100644
index 0000000000..9be64619f1
--- /dev/null
+++ b/e2e/composer-min-version/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^8.1"
+ }
+}
diff --git a/e2e/composer-min-version/test.php b/e2e/composer-min-version/test.php
new file mode 100644
index 0000000000..d4d06a34eb
--- /dev/null
+++ b/e2e/composer-min-version/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 4>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-no-versions/.gitignore b/e2e/composer-no-versions/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-no-versions/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-no-versions/composer.json b/e2e/composer-no-versions/composer.json
new file mode 100644
index 0000000000..2c63c08510
--- /dev/null
+++ b/e2e/composer-no-versions/composer.json
@@ -0,0 +1,2 @@
+{
+}
diff --git a/e2e/composer-no-versions/test.php b/e2e/composer-no-versions/test.php
new file mode 100644
index 0000000000..28c8a3183b
--- /dev/null
+++ b/e2e/composer-no-versions/test.php
@@ -0,0 +1,6 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('int<5, 8>', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-version-config-invalid/phpstan.neon b/e2e/composer-version-config-invalid/phpstan.neon
new file mode 100644
index 0000000000..96977def5f
--- /dev/null
+++ b/e2e/composer-version-config-invalid/phpstan.neon
@@ -0,0 +1,5 @@
+parameters:
+ phpVersion:
+ min: 80303
+ max: 80104
+
diff --git a/e2e/composer-version-config-patch/.gitignore b/e2e/composer-version-config-patch/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-version-config-patch/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-version-config-patch/composer.json b/e2e/composer-version-config-patch/composer.json
new file mode 100644
index 0000000000..d6103988c8
--- /dev/null
+++ b/e2e/composer-version-config-patch/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": ">=8.0.2, <8.0.15"
+ }
+}
diff --git a/e2e/composer-version-config-patch/test.php b/e2e/composer-version-config-patch/test.php
new file mode 100644
index 0000000000..3f201eadab
--- /dev/null
+++ b/e2e/composer-version-config-patch/test.php
@@ -0,0 +1,7 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('0', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<2, 15>', PHP_RELEASE_VERSION);
diff --git a/e2e/composer-version-config/.gitignore b/e2e/composer-version-config/.gitignore
new file mode 100644
index 0000000000..3a9875b460
--- /dev/null
+++ b/e2e/composer-version-config/.gitignore
@@ -0,0 +1,2 @@
+/vendor/
+composer.lock
diff --git a/e2e/composer-version-config/composer.json b/e2e/composer-version-config/composer.json
new file mode 100644
index 0000000000..2da0adaf1c
--- /dev/null
+++ b/e2e/composer-version-config/composer.json
@@ -0,0 +1,5 @@
+{
+ "require": {
+ "php": "^8.0"
+ }
+}
diff --git a/e2e/composer-version-config/phpstan.neon b/e2e/composer-version-config/phpstan.neon
new file mode 100644
index 0000000000..003e5e1484
--- /dev/null
+++ b/e2e/composer-version-config/phpstan.neon
@@ -0,0 +1,4 @@
+parameters:
+ phpVersion:
+ min: 80103
+ max: 80304
diff --git a/e2e/composer-version-config/test.php b/e2e/composer-version-config/test.php
new file mode 100644
index 0000000000..a9afaa4b65
--- /dev/null
+++ b/e2e/composer-version-config/test.php
@@ -0,0 +1,11 @@
+', PHP_VERSION_ID);
+\PHPStan\Testing\assertType('8', PHP_MAJOR_VERSION);
+\PHPStan\Testing\assertType('int<1, 3>', PHP_MINOR_VERSION);
+\PHPStan\Testing\assertType('int<0, max>', PHP_RELEASE_VERSION);
+
+\PHPStan\Testing\assertType('1', version_compare(PHP_VERSION, '7.0.0'));
+\PHPStan\Testing\assertType('false', version_compare(PHP_VERSION, '7.0.0', '<'));
+\PHPStan\Testing\assertType('true', version_compare(PHP_VERSION, '7.0.0', '>'));
diff --git a/e2e/discussion-11362/.gitignore b/e2e/discussion-11362/.gitignore
new file mode 100644
index 0000000000..61ead86667
--- /dev/null
+++ b/e2e/discussion-11362/.gitignore
@@ -0,0 +1 @@
+/vendor
diff --git a/e2e/discussion-11362/composer.json b/e2e/discussion-11362/composer.json
new file mode 100644
index 0000000000..114bec3040
--- /dev/null
+++ b/e2e/discussion-11362/composer.json
@@ -0,0 +1,24 @@
+{
+ "config": {
+ "preferred-install": {
+ "*": "dist",
+ "repro/*": "source"
+ },
+ "sort-packages": true
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "repositories": [
+ {
+ "type": "path",
+ "url": "./packages/*/"
+ }
+ ],
+ "require": {
+ "repro/site": "@dev",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "1.11.7"
+ }
+}
diff --git a/e2e/discussion-11362/composer.lock b/e2e/discussion-11362/composer.lock
new file mode 100644
index 0000000000..b893bfb8cc
--- /dev/null
+++ b/e2e/discussion-11362/composer.lock
@@ -0,0 +1,103 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "49a30c2374c218ffcab0e58fd0628fab",
+ "packages": [
+ {
+ "name": "repro/site",
+ "version": "dev-main",
+ "dist": {
+ "type": "path",
+ "url": "./packages/site",
+ "reference": "0f4b564a39e8ff3758c1d96a2a5d4b72dea08b23"
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Repro\\Site\\": "Classes"
+ }
+ },
+ "transport-options": {
+ "relative": true
+ }
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.11.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/52d2bbfdcae7f895915629e4694e9497d0f8e28d",
+ "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2024-07-06T11:17:41+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": {
+ "repro/site": 20
+ },
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.1"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/ContentPage.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/ContentPage.php
new file mode 100644
index 0000000000..4ca5833958
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/ContentPage.php
@@ -0,0 +1,59 @@
+parentIssue;
+ }
+
+ public function getParentLesson(): ?Lesson
+ {
+ return $this->parentLesson;
+ }
+
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ public function getType(): string
+ {
+ return $this->type;
+ }
+
+ public function getNavigationVisible(): bool
+ {
+ return $this->navigationVisible;
+ }
+
+ public function getNavigationColor(): string
+ {
+ return $this->navigationColor;
+ }
+}
+
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/Issue.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Issue.php
new file mode 100644
index 0000000000..8343551215
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Issue.php
@@ -0,0 +1,45 @@
+parentSchoolYear;
+ }
+
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ public function getStartDate(): int
+ {
+ return $this->startDate;
+ }
+
+ public function getHolidayTitle(): string
+ {
+ return $this->holidayTitle;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/Lesson.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Lesson.php
new file mode 100644
index 0000000000..e00f2f0efb
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/Lesson.php
@@ -0,0 +1,29 @@
+schoolLevel;
+ }
+
+ public function getParentIssue(): ?Issue
+ {
+ return $this->parentIssue;
+ }
+
+ public function getLessonNumber(): int
+ {
+ return $this->lessonNumber;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolLevel.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolLevel.php
new file mode 100644
index 0000000000..5c326ca596
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolLevel.php
@@ -0,0 +1,15 @@
+title;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolYear.php b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolYear.php
new file mode 100644
index 0000000000..a86f5bf575
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/Classes/Domain/Model/SchoolYear.php
@@ -0,0 +1,40 @@
+startDate;
+ }
+
+ public function getEndDate(): int
+ {
+ return $this->endDate;
+ }
+
+ public function getIntroStartDate(): int
+ {
+ return $this->introStartDate;
+ }
+
+ public function getIntroEndDate(): int
+ {
+ return $this->introEndDate;
+ }
+}
diff --git a/e2e/discussion-11362/packages/site/composer.json b/e2e/discussion-11362/packages/site/composer.json
new file mode 100644
index 0000000000..ca413c1c8d
--- /dev/null
+++ b/e2e/discussion-11362/packages/site/composer.json
@@ -0,0 +1,11 @@
+{
+ "autoload": {
+ "psr-4": {
+ "Repro\\Site\\": "Classes"
+ }
+ },
+ "name": "repro/site",
+ "require": {
+ "php": "^8.1"
+ }
+}
diff --git a/e2e/discussion-11362/phpstan.neon b/e2e/discussion-11362/phpstan.neon
new file mode 100644
index 0000000000..2e6178c1a7
--- /dev/null
+++ b/e2e/discussion-11362/phpstan.neon
@@ -0,0 +1,9 @@
+parameters:
+ excludePaths:
+ analyse:
+ - vendor
+
+ level: 1
+
+ paths:
+ - .
diff --git a/e2e/env-int-key/test.php b/e2e/env-int-key/test.php
new file mode 100644
index 0000000000..b3d9bbc7f3
--- /dev/null
+++ b/e2e/env-int-key/test.php
@@ -0,0 +1 @@
+
+ */
+final class ClassCollector implements Collector
+{
+ public function getNodeType(): string
+ {
+ return Node\Stmt\Class_::class;
+ }
+
+ public function processNode(Node $node, Scope $scope) : ?array
+ {
+ if ($node->name === null) {
+ return null;
+ }
+
+ return [$node->name->name, $node->getStartLine()];
+ }
+}
diff --git a/e2e/ignore-error-extension/src/ClassRule.php b/e2e/ignore-error-extension/src/ClassRule.php
new file mode 100644
index 0000000000..17283bafe5
--- /dev/null
+++ b/e2e/ignore-error-extension/src/ClassRule.php
@@ -0,0 +1,43 @@
+
+ */
+final class ClassRule implements Rule
+{
+ #[Override]
+ public function getNodeType() : string
+ {
+ return CollectedDataNode::class;
+ }
+
+ #[Override]
+ public function processNode(Node $node, Scope $scope) : array
+ {
+ $errors = [];
+
+ foreach ($node->get(ClassCollector::class) as $file => $data) {
+ foreach ($data as [$className, $line]) {
+ $errors[] = RuleErrorBuilder::message('This is an error from a rule that uses a collector')
+ ->file($file)
+ ->line($line)
+ ->identifier('class.name')
+ ->build();
+ }
+ }
+
+ return $errors;
+ }
+
+}
diff --git a/e2e/ignore-error-extension/src/ControllerActionReturnTypeIgnoreExtension.php b/e2e/ignore-error-extension/src/ControllerActionReturnTypeIgnoreExtension.php
new file mode 100644
index 0000000000..dc7b0dab5a
--- /dev/null
+++ b/e2e/ignore-error-extension/src/ControllerActionReturnTypeIgnoreExtension.php
@@ -0,0 +1,41 @@
+getIdentifier() !== 'missingType.iterableValue') {
+ return false;
+ }
+
+ // @phpstan-ignore phpstanApi.instanceofAssumption
+ if (! $node instanceof InClassMethodNode) {
+ return false;
+ }
+
+ if (! str_ends_with($node->getClassReflection()->getName(), 'Controller')) {
+ return false;
+ }
+
+ if (! str_ends_with($node->getMethodReflection()->getName(), 'Action')) {
+ return false;
+ }
+
+ if (! $node->getMethodReflection()->isPublic()) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/e2e/ignore-error-extension/src/ControllerClassNameIgnoreExtension.php b/e2e/ignore-error-extension/src/ControllerClassNameIgnoreExtension.php
new file mode 100644
index 0000000000..b52b4f7ef1
--- /dev/null
+++ b/e2e/ignore-error-extension/src/ControllerClassNameIgnoreExtension.php
@@ -0,0 +1,34 @@
+getIdentifier() !== 'class.name') {
+ return false;
+ }
+
+ // @phpstan-ignore phpstanApi.instanceofAssumption
+ if (!$node instanceof CollectedDataNode) {
+ return false;
+ }
+
+ if (!str_ends_with($error->getFile(), 'Controller.php')) {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/e2e/ignore-error-extension/src/HomepageController.php b/e2e/ignore-error-extension/src/HomepageController.php
new file mode 100644
index 0000000000..d55c955157
--- /dev/null
+++ b/e2e/ignore-error-extension/src/HomepageController.php
@@ -0,0 +1,29 @@
+ 'Homepage',
+ 'something' => $this->getSomething(),
+ ];
+ }
+
+ public function contactAction($someUnrelatedError): array
+ {
+ return [
+ 'title' => 'Contact',
+ 'something' => $this->getSomething(),
+ ];
+ }
+
+ private function getSomething(): array
+ {
+ return [];
+ }
+}
diff --git a/e2e/only-files-not-analysed-trait/ignore.neon b/e2e/only-files-not-analysed-trait/ignore.neon
new file mode 100644
index 0000000000..e0257ac498
--- /dev/null
+++ b/e2e/only-files-not-analysed-trait/ignore.neon
@@ -0,0 +1,10 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ ignoreErrors:
+ -
+ message: "#^Trait OnlyFilesNotAnalysedTrait\\\\BarTrait is used zero times and is not analysed\\.$#"
+ count: 1
+ path: src/BarTrait.php
diff --git a/e2e/only-files-not-analysed-trait/no-ignore.neon b/e2e/only-files-not-analysed-trait/no-ignore.neon
new file mode 100644
index 0000000000..899fee922c
--- /dev/null
+++ b/e2e/only-files-not-analysed-trait/no-ignore.neon
@@ -0,0 +1,5 @@
+includes:
+ - ../../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
diff --git a/e2e/only-files-not-analysed-trait/src/BarTrait.php b/e2e/only-files-not-analysed-trait/src/BarTrait.php
new file mode 100644
index 0000000000..efb6e5abb5
--- /dev/null
+++ b/e2e/only-files-not-analysed-trait/src/BarTrait.php
@@ -0,0 +1,8 @@
+= 8.1
+
+namespace PhpstanPhpUnit190;
+
+class FoobarTest
+{
+ public function testBaz(): int
+ {
+ $matcher = new self();
+ $this->acceptCallback(static function (string $test) use ($matcher): string {
+ match ($matcher->testBaz()) {
+ 1 => 1,
+ 2 => 2,
+ default => new \LogicException()
+ };
+
+ return $test;
+ });
+
+ return 1;
+ }
+
+ public function acceptCallback(callable $cb): void
+ {
+
+ }
+}
diff --git a/e2e/result-cache-1/baseline-1.neon b/e2e/result-cache-1/baseline-1.neon
new file mode 100644
index 0000000000..ff4bda03bd
--- /dev/null
+++ b/e2e/result-cache-1/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Call to an undefined method TestResultCache1\\\\Foo\\:\\:doFoo\\(\\)\\.$#"
+ count: 1
+ path: src/Baz.php
diff --git a/e2e/result-cache-1/patch-1.patch b/e2e/result-cache-1/patch-1.patch
new file mode 100644
index 0000000000..55f8d3c2be
--- /dev/null
+++ b/e2e/result-cache-1/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Bar.php 2022-10-17 20:57:35.000000000 +0200
++++ src/Bar2.php 2022-10-17 20:57:47.000000000 +0200
+@@ -5,7 +5,7 @@
+ class Bar
+ {
+
+- public function doFoo(): void
++ public function doFooo(): void
+ {
+
+ }
diff --git a/e2e/result-cache-1/phpstan-baseline.neon b/e2e/result-cache-1/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-1/phpstan.neon b/e2e/result-cache-1/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-1/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-1/src/Bar.php b/e2e/result-cache-1/src/Bar.php
new file mode 100644
index 0000000000..713500e65d
--- /dev/null
+++ b/e2e/result-cache-1/src/Bar.php
@@ -0,0 +1,13 @@
+doFoo();
+ }
+
+}
diff --git a/e2e/result-cache-1/src/Foo.php b/e2e/result-cache-1/src/Foo.php
new file mode 100644
index 0000000000..f51ae8be5a
--- /dev/null
+++ b/e2e/result-cache-1/src/Foo.php
@@ -0,0 +1,11 @@
+ in PHPDoc tag @use is not subtype of template type T of Exception of trait TestResultCache3\\\\BarTrait\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-3/patch-1.patch b/e2e/result-cache-3/patch-1.patch
new file mode 100644
index 0000000000..6507669199
--- /dev/null
+++ b/e2e/result-cache-3/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Baz.php 2022-10-24 14:28:45.000000000 +0200
++++ src/Baz.php 2022-10-24 14:30:02.000000000 +0200
+@@ -2,7 +2,7 @@
+
+ namespace TestResultCache3;
+
+-class Baz extends \Exception
++class Baz extends \stdClass
+ {
+
+ }
diff --git a/e2e/result-cache-3/phpstan-baseline.neon b/e2e/result-cache-3/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-3/phpstan.neon b/e2e/result-cache-3/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-3/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-3/src/BarTrait.php b/e2e/result-cache-3/src/BarTrait.php
new file mode 100644
index 0000000000..7529085522
--- /dev/null
+++ b/e2e/result-cache-3/src/BarTrait.php
@@ -0,0 +1,11 @@
+ */
+ use BarTrait;
+
+}
diff --git a/e2e/result-cache-4/baseline-1.neon b/e2e/result-cache-4/baseline-1.neon
new file mode 100644
index 0000000000..d54e5899ce
--- /dev/null
+++ b/e2e/result-cache-4/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^PHPDoc tag @var for property TestResultCache4\\\\Foo\\:\\:\\$foo with type TestResultCache4\\\\Bar is incompatible with native type Exception\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-4/patch-1.patch b/e2e/result-cache-4/patch-1.patch
new file mode 100644
index 0000000000..d8f6d0aa67
--- /dev/null
+++ b/e2e/result-cache-4/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Bar.php 2022-10-24 14:28:45.000000000 +0200
++++ src/Bar.php 2022-10-24 14:30:02.000000000 +0200
+@@ -2,7 +2,7 @@
+
+ namespace TestResultCache3;
+
+-class Bar extends \Exception
++class Bar extends \stdClass
+ {
+
+ }
diff --git a/e2e/result-cache-4/phpstan-baseline.neon b/e2e/result-cache-4/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-4/phpstan.neon b/e2e/result-cache-4/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-4/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-4/src/Bar.php b/e2e/result-cache-4/src/Bar.php
new file mode 100644
index 0000000000..d07bf2d9c9
--- /dev/null
+++ b/e2e/result-cache-4/src/Bar.php
@@ -0,0 +1,8 @@
+foo;
+ }
+
+}
diff --git a/e2e/result-cache-5/baseline-1.neon b/e2e/result-cache-5/baseline-1.neon
new file mode 100644
index 0000000000..f0db0c2a00
--- /dev/null
+++ b/e2e/result-cache-5/baseline-1.neon
@@ -0,0 +1,11 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Expected type true, actual\\: false$#"
+ count: 1
+ path: src/Foo.php
+
+ -
+ message: "#^Instanceof between TestResultCache5\\\\Baz and Exception will always evaluate to false\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-5/patch-1.patch b/e2e/result-cache-5/patch-1.patch
new file mode 100644
index 0000000000..69791cca29
--- /dev/null
+++ b/e2e/result-cache-5/patch-1.patch
@@ -0,0 +1,11 @@
+--- src/Baz.php 2022-10-24 14:28:45.000000000 +0200
++++ src/Baz.php 2022-10-24 14:30:02.000000000 +0200
+@@ -2,7 +2,7 @@
+
+ namespace TestResultCache5;
+
+-class Baz extends \Exception
++class Baz extends \stdClass
+ {
+
+ }
diff --git a/e2e/result-cache-5/phpstan-baseline.neon b/e2e/result-cache-5/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-5/phpstan.neon b/e2e/result-cache-5/phpstan.neon
new file mode 100644
index 0000000000..7c3f71ae98
--- /dev/null
+++ b/e2e/result-cache-5/phpstan.neon
@@ -0,0 +1,11 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ ignoreErrors:
+ -
+ identifier: instanceof.alwaysTrue
+ reportUnmatched: false
diff --git a/e2e/result-cache-5/src/Bar.php b/e2e/result-cache-5/src/Bar.php
new file mode 100644
index 0000000000..6df1b7ee81
--- /dev/null
+++ b/e2e/result-cache-5/src/Bar.php
@@ -0,0 +1,16 @@
+doBar($var);
+ assertType('true', $var instanceof \Exception);
+ }
+
+}
diff --git a/e2e/result-cache-6/baseline-1.neon b/e2e/result-cache-6/baseline-1.neon
new file mode 100644
index 0000000000..a9ebd9fb61
--- /dev/null
+++ b/e2e/result-cache-6/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^Access to an undefined property TestResultCache6\\\\Bar\\:\\:\\$s\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-6/patch-1.patch b/e2e/result-cache-6/patch-1.patch
new file mode 100644
index 0000000000..e2d7e84db0
--- /dev/null
+++ b/e2e/result-cache-6/patch-1.patch
@@ -0,0 +1,10 @@
+diff --git b/e2e/result-cache-6/src/Baz.php a/e2e/result-cache-6/src/Baz.php
+index 4a94eb3ae..6fed0b9ec 100644
+--- b/e2e/result-cache-6/src/Baz.php
++++ a/e2e/result-cache-6/src/Baz.php
+@@ -4,5 +4,4 @@ namespace TestResultCache6;
+
+ class Baz
+ {
+- public string $s;
+ }
diff --git a/e2e/result-cache-6/phpstan-baseline.neon b/e2e/result-cache-6/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-6/phpstan.neon b/e2e/result-cache-6/phpstan.neon
new file mode 100644
index 0000000000..ddbf4c2114
--- /dev/null
+++ b/e2e/result-cache-6/phpstan.neon
@@ -0,0 +1,7 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
diff --git a/e2e/result-cache-6/src/Bar.php b/e2e/result-cache-6/src/Bar.php
new file mode 100644
index 0000000000..a9d6848bfe
--- /dev/null
+++ b/e2e/result-cache-6/src/Bar.php
@@ -0,0 +1,10 @@
+s;
+ }
+
+}
diff --git a/e2e/result-cache-7/baseline-1.neon b/e2e/result-cache-7/baseline-1.neon
new file mode 100644
index 0000000000..6f1062520d
--- /dev/null
+++ b/e2e/result-cache-7/baseline-1.neon
@@ -0,0 +1,6 @@
+parameters:
+ ignoreErrors:
+ -
+ message: "#^PHPDoc tag @phpstan\\-require\\-implements cannot contain non\\-interface type TestResultCache7\\\\Bar\\.$#"
+ count: 1
+ path: src/Foo.php
diff --git a/e2e/result-cache-7/patch-1.patch b/e2e/result-cache-7/patch-1.patch
new file mode 100644
index 0000000000..a381f8b428
--- /dev/null
+++ b/e2e/result-cache-7/patch-1.patch
@@ -0,0 +1,12 @@
+diff --git a/e2e/result-cache-7/src/Bar.php b/e2e/result-cache-7/src/Bar.php
+index b698e695d..0bbcc3093 100644
+--- a/e2e/result-cache-7/src/Bar.php
++++ b/e2e/result-cache-7/src/Bar.php
+@@ -2,6 +2,6 @@
+
+ namespace TestResultCache7;
+
+-interface Bar
++class Bar
+ {
+ }
diff --git a/e2e/result-cache-7/phpstan-baseline.neon b/e2e/result-cache-7/phpstan-baseline.neon
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/e2e/result-cache-7/phpstan.neon b/e2e/result-cache-7/phpstan.neon
new file mode 100644
index 0000000000..66c19c7166
--- /dev/null
+++ b/e2e/result-cache-7/phpstan.neon
@@ -0,0 +1,10 @@
+includes:
+ - phpstan-baseline.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ ignoreErrors:
+ -
+ identifier: trait.unused
diff --git a/e2e/result-cache-7/src/Bar.php b/e2e/result-cache-7/src/Bar.php
new file mode 100644
index 0000000000..b698e695dd
--- /dev/null
+++ b/e2e/result-cache-7/src/Bar.php
@@ -0,0 +1,7 @@
+
+ */
+class CustomRule implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ return [];
+ }
+
+}
diff --git a/e2e/result-cache-8/build/CustomRule2.php b/e2e/result-cache-8/build/CustomRule2.php
new file mode 100644
index 0000000000..413d37b54d
--- /dev/null
+++ b/e2e/result-cache-8/build/CustomRule2.php
@@ -0,0 +1,24 @@
+
+ */
+class CustomRule2 implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ return [];
+ }
+
+}
diff --git a/e2e/result-cache-8/composer.json b/e2e/result-cache-8/composer.json
new file mode 100644
index 0000000000..d29ab86e75
--- /dev/null
+++ b/e2e/result-cache-8/composer.json
@@ -0,0 +1,14 @@
+{
+ "require-dev": {
+ "phpstan/phpstan": "^1.10",
+ "phpstan/phpstan-webmozart-assert": "^1.2"
+ },
+ "autoload": {
+ "classmap": ["src"]
+ },
+ "autoload-dev": {
+ "classmap": [
+ "build"
+ ]
+ }
+}
diff --git a/e2e/result-cache-8/composer.lock b/e2e/result-cache-8/composer.lock
new file mode 100644
index 0000000000..23a7f311ea
--- /dev/null
+++ b/e2e/result-cache-8/composer.lock
@@ -0,0 +1,132 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "964b13a11680dbf7fa5291f0baa6d10c",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "phpstan/phpstan",
+ "version": "1.10.63",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "ad12836d9ca227301f5fb9960979574ed8628339"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad12836d9ca227301f5fb9960979574ed8628339",
+ "reference": "ad12836d9ca227301f5fb9960979574ed8628339",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-03-18T16:53:53+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-webmozart-assert",
+ "version": "1.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-webmozart-assert.git",
+ "reference": "d1ff28697bd4e1c9ef5d3f871367ce9092871fec"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/d1ff28697bd4e1c9ef5d3f871367ce9092871fec",
+ "reference": "d1ff28697bd4e1c9ef5d3f871367ce9092871fec",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpstan/phpstan": "^1.10"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^4.13.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-deprecation-rules": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpstan/phpstan-strict-rules": "^1.0",
+ "phpunit/phpunit": "^9.5",
+ "webmozart/assert": "^1.11.0"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan webmozart/assert extension",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-webmozart-assert/issues",
+ "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.4"
+ },
+ "time": "2023-02-21T20:34:19+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "2.6.0"
+}
diff --git a/e2e/result-cache-8/phpstan.neon b/e2e/result-cache-8/phpstan.neon
new file mode 100644
index 0000000000..c7fd83c756
--- /dev/null
+++ b/e2e/result-cache-8/phpstan.neon
@@ -0,0 +1,17 @@
+includes:
+ - vendor/phpstan/phpstan-webmozart-assert/extension.neon
+
+parameters:
+ paths:
+ - src
+ level: 8
+
+rules:
+ - ResultCache8E2E\CustomRule
+ - ResultCache8E2E\CustomRule3
+
+services:
+ -
+ class: ResultCache8E2E\CustomRule2
+ tags:
+ - phpstan.rules.rule
diff --git a/e2e/result-cache-8/src/CustomRule3.php b/e2e/result-cache-8/src/CustomRule3.php
new file mode 100644
index 0000000000..1f0ca326e1
--- /dev/null
+++ b/e2e/result-cache-8/src/CustomRule3.php
@@ -0,0 +1,24 @@
+
+ */
+class CustomRule3 implements Rule
+{
+ public function getNodeType(): string
+ {
+ return Node::class;
+ }
+
+ public function processNode(Node $node, Scope $scope): array
+ {
+ return [];
+ }
+
+}
diff --git a/e2e/result-cache-8/src/Foo.php b/e2e/result-cache-8/src/Foo.php
new file mode 100644
index 0000000000..0082675fde
--- /dev/null
+++ b/e2e/result-cache-8/src/Foo.php
@@ -0,0 +1,8 @@
+=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "Clue\\StreamFilter\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering"
+ }
+ ],
+ "description": "A simple and modern approach to stream filtering in PHP",
+ "homepage": "https://github.com/clue/stream-filter",
+ "keywords": [
+ "bucket brigade",
+ "callback",
+ "filter",
+ "php_user_filter",
+ "stream",
+ "stream_filter_append",
+ "stream_filter_register"
+ ],
+ "support": {
+ "issues": "https://github.com/clue/stream-filter/issues",
+ "source": "https://github.com/clue/stream-filter/tree/v1.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://clue.engineering/support",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-20T15:40:13+00:00"
+ },
+ {
+ "name": "dflydev/dot-access-data",
+ "version": "v3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dflydev/dflydev-dot-access-data.git",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.42",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3",
+ "scrutinizer/ocular": "1.6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dflydev\\DotAccessData\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Dragonfly Development Inc.",
+ "email": "info@dflydev.com",
+ "homepage": "http://dflydev.com/"
+ },
+ {
+ "name": "Beau Simensen",
+ "email": "beau@dflydev.com",
+ "homepage": "http://beausimensen.com/"
+ },
+ {
+ "name": "Carlos Frutos",
+ "email": "carlos@kiwing.it",
+ "homepage": "https://github.com/cfrutos"
+ },
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com/"
+ }
+ ],
+ "description": "Given a deep data structure, access data by dot notation.",
+ "homepage": "https://github.com/dflydev/dflydev-dot-access-data",
+ "keywords": [
+ "access",
+ "data",
+ "dot",
+ "notation"
+ ],
+ "support": {
+ "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues",
+ "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3"
+ },
+ "time": "2024-07-08T12:26:09+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b",
+ "reference": "d281ed313b989f213357e3be1a179f02196ac99b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.5.3 || ^2.0.3",
+ "guzzlehttp/psr7": "^2.7.0",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0",
+ "symfony/deprecation-contracts": "^2.2 || ^3.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "ext-curl": "*",
+ "guzzle/client-integration-tests": "3.0.2",
+ "php-http/message-factory": "^1.1",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20",
+ "psr/log": "^1.1 || ^2.0 || ^3.0"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/guzzle/issues",
+ "source": "https://github.com/guzzle/guzzle/tree/7.9.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-24T11:22:20+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
+ "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/promises/issues",
+ "source": "https://github.com/guzzle/promises/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-18T10:29:17+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu/"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-07-18T11:15:46+00:00"
+ },
+ {
+ "name": "knplabs/github-api",
+ "version": "v3.15.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/KnpLabs/php-github-api.git",
+ "reference": "d4b7a1c00e22c1ca32408ecdd4e33c674196b1bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/d4b7a1c00e22c1ca32408ecdd4e33c674196b1bc",
+ "reference": "d4b7a1c00e22c1ca32408ecdd4e33c674196b1bc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.2.5 || ^8.0",
+ "php-http/cache-plugin": "^1.7.1|^2.0",
+ "php-http/client-common": "^2.3",
+ "php-http/discovery": "^1.12",
+ "php-http/httplug": "^2.2",
+ "php-http/multipart-stream-builder": "^1.1.2",
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "psr/http-client-implementation": "^1.0",
+ "psr/http-factory-implementation": "^1.0",
+ "psr/http-message": "^1.0|^2.0",
+ "symfony/deprecation-contracts": "^2.2|^3.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "guzzlehttp/guzzle": "^7.2",
+ "guzzlehttp/psr7": "^2.7",
+ "http-interop/http-factory-guzzle": "^1.0",
+ "php-http/mock-client": "^1.4.1",
+ "phpstan/extension-installer": "^1.0.5",
+ "phpstan/phpstan": "^0.12.57",
+ "phpstan/phpstan-deprecation-rules": "^0.12.5",
+ "phpunit/phpunit": "^8.5 || ^9.4",
+ "symfony/cache": "^5.1.8",
+ "symfony/phpunit-bridge": "^5.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.20.x-dev",
+ "dev-master": "3.14-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Github\\": "lib/Github/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "KnpLabs Team",
+ "homepage": "http://knplabs.com/"
+ },
+ {
+ "name": "Thibault Duplessis",
+ "email": "thibault.duplessis@gmail.com",
+ "homepage": "http://ornicar.github.com/"
+ }
+ ],
+ "description": "GitHub API v3 client",
+ "homepage": "https://github.com/KnpLabs/php-github-api",
+ "keywords": [
+ "api",
+ "gh",
+ "gist",
+ "github"
+ ],
+ "support": {
+ "issues": "https://github.com/KnpLabs/php-github-api/issues",
+ "source": "https://github.com/KnpLabs/php-github-api/tree/v3.15.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/acrobat",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-23T19:00:43+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "2.5.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "b650144166dfa7703e62a22e493b853b58d874b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/b650144166dfa7703e62a22e493b853b58d874b0",
+ "reference": "b650144166dfa7703e62a22e493b853b58d874b0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "league/config": "^1.1.1",
+ "php": "^7.4 || ^8.0",
+ "psr/event-dispatcher": "^1.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3.0",
+ "symfony/polyfill-php80": "^1.16"
+ },
+ "require-dev": {
+ "cebe/markdown": "^1.0",
+ "commonmark/cmark": "0.31.1",
+ "commonmark/commonmark.js": "0.31.1",
+ "composer/package-versions-deprecated": "^1.8",
+ "embed/embed": "^4.4",
+ "erusev/parsedown": "^1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "^1.4 || ^2.0",
+ "nyholm/psr7": "^1.5",
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0",
+ "scrutinizer/ocular": "^1.8.1",
+ "symfony/finder": "^5.3 | ^6.0 || ^7.0",
+ "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 || ^7.0",
+ "unleashedtech/php-coding-standard": "^3.1.1",
+ "vimeo/psalm": "^4.24.0 || ^5.0.0"
+ },
+ "suggest": {
+ "symfony/yaml": "v2.3+ required if using the Front Matter extension"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com/",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com/",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "support": {
+ "docs": "https://commonmark.thephpleague.com/",
+ "forum": "https://github.com/thephpleague/commonmark/discussions",
+ "issues": "https://github.com/thephpleague/commonmark/issues",
+ "rss": "https://github.com/thephpleague/commonmark/releases.atom",
+ "source": "https://github.com/thephpleague/commonmark"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-08-16T11:46:16+00:00"
+ },
+ {
+ "name": "league/config",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/config.git",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3",
+ "shasum": ""
+ },
+ "require": {
+ "dflydev/dot-access-data": "^3.0.1",
+ "nette/schema": "^1.2",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^1.8.2",
+ "phpunit/phpunit": "^9.5.5",
+ "scrutinizer/ocular": "^1.8.1",
+ "unleashedtech/php-coding-standard": "^3.1",
+ "vimeo/psalm": "^4.7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Config\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com/",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Define configuration arrays with strict schemas and access values with dot notation",
+ "homepage": "https://config.thephpleague.com/",
+ "keywords": [
+ "array",
+ "config",
+ "configuration",
+ "dot",
+ "dot-access",
+ "nested",
+ "schema"
+ ],
+ "support": {
+ "docs": "https://config.thephpleague.com/",
+ "issues": "https://github.com/thephpleague/config/issues",
+ "rss": "https://github.com/thephpleague/config/releases.atom",
+ "source": "https://github.com/thephpleague/config"
+ },
+ "funding": [
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ }
+ ],
+ "time": "2022-12-11T20:36:23+00:00"
+ },
+ {
+ "name": "nette/neon",
+ "version": "v3.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/neon.git",
+ "reference": "c8481c104431c8d94cc88424a1e21f47f8c93280"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/neon/zipball/c8481c104431c8d94cc88424a1e21f47f8c93280",
+ "reference": "c8481c104431c8d94cc88424a1e21f47f8c93280",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "8.0 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.4",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "bin": [
+ "bin/neon-lint"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🍸 Nette NEON: encodes and decodes NEON file format.",
+ "homepage": "https://ne-on.org/",
+ "keywords": [
+ "export",
+ "import",
+ "neon",
+ "nette",
+ "yaml"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/neon/issues",
+ "source": "https://github.com/nette/neon/tree/v3.4.3"
+ },
+ "time": "2024-06-26T14:53:59+00:00"
+ },
+ {
+ "name": "nette/schema",
+ "version": "v1.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/schema.git",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/schema/zipball/0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "reference": "0462f0166e823aad657c9224d0f849ecac1ba10a",
+ "shasum": ""
+ },
+ "require": {
+ "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0",
+ "php": "7.1 - 8.3"
+ },
+ "require-dev": {
+ "nette/tester": "^2.3 || ^2.4",
+ "phpstan/phpstan-nette": "^1.0",
+ "tracy/tracy": "^2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "📐 Nette Schema: validating data structures against a given Schema.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "config",
+ "nette"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/schema/issues",
+ "source": "https://github.com/nette/schema/tree/v1.2.5"
+ },
+ "time": "2023-10-05T20:37:59+00:00"
+ },
+ {
+ "name": "nette/utils",
+ "version": "v3.2.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nette/utils.git",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nette/utils/zipball/a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "reference": "a4175c62652f2300c8017fb7e640f9ccb11648d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2 <8.4"
+ },
+ "conflict": {
+ "nette/di": "<3.0.6"
+ },
+ "require-dev": {
+ "jetbrains/phpstorm-attributes": "dev-master",
+ "nette/tester": "~2.0",
+ "phpstan/phpstan": "^1.0",
+ "tracy/tracy": "^2.3"
+ },
+ "suggest": {
+ "ext-gd": "to use Image",
+ "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+ "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+ "ext-json": "to use Nette\\Utils\\Json",
+ "ext-mbstring": "to use Strings::lower() etc...",
+ "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
+ "ext-xml": "to use Strings::length() etc. when mbstring is not available"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause",
+ "GPL-2.0-only",
+ "GPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "David Grudl",
+ "homepage": "https://davidgrudl.com/"
+ },
+ {
+ "name": "Nette Community",
+ "homepage": "https://nette.org/contributors"
+ }
+ ],
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+ "homepage": "https://nette.org/",
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "support": {
+ "issues": "https://github.com/nette/utils/issues",
+ "source": "https://github.com/nette/utils/tree/v3.2.10"
+ },
+ "time": "2023-07-30T15:38:18+00:00"
+ },
+ {
+ "name": "php-http/cache-plugin",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/cache-plugin.git",
+ "reference": "539b2d1ea0dc1c2f141c8155f888197d4ac5635b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/cache-plugin/zipball/539b2d1ea0dc1c2f141c8155f888197d4ac5635b",
+ "reference": "539b2d1ea0dc1c2f141c8155f888197d4ac5635b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/client-common": "^1.9 || ^2.0",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0",
+ "psr/http-factory-implementation": "^1.0",
+ "symfony/options-resolver": "^2.6 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.6.1",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\Plugin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "PSR-6 Cache plugin for HTTPlug",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "cache",
+ "http",
+ "httplug",
+ "plugin"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/cache-plugin/issues",
+ "source": "https://github.com/php-http/cache-plugin/tree/2.0.0"
+ },
+ "time": "2024-02-19T17:02:14+00:00"
+ },
+ {
+ "name": "php-http/client-common",
+ "version": "2.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/client-common.git",
+ "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/client-common/zipball/0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "reference": "0cfe9858ab9d3b213041b947c881d5b19ceeca46",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/httplug": "^2.0",
+ "php-http/message": "^1.6",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0",
+ "symfony/options-resolver": "~4.0.15 || ~4.1.9 || ^4.2.1 || ^5.0 || ^6.0 || ^7.0",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "doctrine/instantiator": "^1.1",
+ "guzzlehttp/psr7": "^1.4",
+ "nyholm/psr7": "^1.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "phpspec/prophecy": "^1.10.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.33 || ^9.6.7"
+ },
+ "suggest": {
+ "ext-json": "To detect JSON responses with the ContentTypePlugin",
+ "ext-libxml": "To detect XML responses with the ContentTypePlugin",
+ "php-http/cache-plugin": "PSR-6 Cache plugin",
+ "php-http/logger-plugin": "PSR-3 Logger plugin",
+ "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\Common\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Common HTTP Client implementations and tools for HTTPlug",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "client",
+ "common",
+ "http",
+ "httplug"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/client-common/issues",
+ "source": "https://github.com/php-http/client-common/tree/2.7.2"
+ },
+ "time": "2024-09-24T06:21:48+00:00"
+ },
+ {
+ "name": "php-http/discovery",
+ "version": "1.19.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/discovery.git",
+ "reference": "0700efda8d7526335132360167315fdab3aeb599"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/discovery/zipball/0700efda8d7526335132360167315fdab3aeb599",
+ "reference": "0700efda8d7526335132360167315fdab3aeb599",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "nyholm/psr7": "<1.0",
+ "zendframework/zend-diactoros": "*"
+ },
+ "provide": {
+ "php-http/async-client-implementation": "*",
+ "php-http/client-implementation": "*",
+ "psr/http-client-implementation": "*",
+ "psr/http-factory-implementation": "*",
+ "psr/http-message-implementation": "*"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0.2|^2.0",
+ "graham-campbell/phpspec-skip-example-extension": "^5.0",
+ "php-http/httplug": "^1.0 || ^2.0",
+ "php-http/message-factory": "^1.0",
+ "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3",
+ "sebastian/comparator": "^3.0.5 || ^4.0.8",
+ "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Http\\Discovery\\Composer\\Plugin",
+ "plugin-optional": true
+ },
+ "autoload": {
+ "psr-4": {
+ "Http\\Discovery\\": "src/"
+ },
+ "exclude-from-classmap": [
+ "src/Composer/Plugin.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "adapter",
+ "client",
+ "discovery",
+ "factory",
+ "http",
+ "message",
+ "psr17",
+ "psr7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/discovery/issues",
+ "source": "https://github.com/php-http/discovery/tree/1.19.4"
+ },
+ "time": "2024-03-29T13:00:05+00:00"
+ },
+ {
+ "name": "php-http/httplug",
+ "version": "2.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/httplug.git",
+ "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/httplug/zipball/5cad731844891a4c282f3f3e1b582c46839d22f4",
+ "reference": "5cad731844891a4c282f3f3e1b582c46839d22f4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/promise": "^1.1",
+ "psr/http-client": "^1.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.1 || ^5.0 || ^6.0",
+ "phpspec/phpspec": "^5.1 || ^6.0 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eric GELOEN",
+ "email": "geloen.eric@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu/"
+ }
+ ],
+ "description": "HTTPlug, the HTTP client abstraction for PHP",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "client",
+ "http"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/httplug/issues",
+ "source": "https://github.com/php-http/httplug/tree/2.4.1"
+ },
+ "time": "2024-09-23T11:39:58+00:00"
+ },
+ {
+ "name": "php-http/message",
+ "version": "1.16.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/message.git",
+ "reference": "5997f3289332c699fa2545c427826272498a2088"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/message/zipball/5997f3289332c699fa2545c427826272498a2088",
+ "reference": "5997f3289332c699fa2545c427826272498a2088",
+ "shasum": ""
+ },
+ "require": {
+ "clue/stream-filter": "^1.5",
+ "php": "^7.2 || ^8.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0"
+ },
+ "require-dev": {
+ "ergebnis/composer-normalize": "^2.6",
+ "ext-zlib": "*",
+ "guzzlehttp/psr7": "^1.0 || ^2.0",
+ "laminas/laminas-diactoros": "^2.0 || ^3.0",
+ "php-http/message-factory": "^1.0.2",
+ "phpspec/phpspec": "^5.1 || ^6.3 || ^7.1",
+ "slim/slim": "^3.0"
+ },
+ "suggest": {
+ "ext-zlib": "Used with compressor/decompressor streams",
+ "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
+ "laminas/laminas-diactoros": "Used with Diactoros Factories",
+ "slim/slim": "Used with Slim Framework PSR-7 implementation"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/filters.php"
+ ],
+ "psr-4": {
+ "Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "HTTP Message related tools",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/message/issues",
+ "source": "https://github.com/php-http/message/tree/1.16.1"
+ },
+ "time": "2024-03-07T13:22:09+00:00"
+ },
+ {
+ "name": "php-http/multipart-stream-builder",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/multipart-stream-builder.git",
+ "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/multipart-stream-builder/zipball/10086e6de6f53489cca5ecc45b6f468604d3460e",
+ "reference": "10086e6de6f53489cca5ecc45b6f468604d3460e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0",
+ "php-http/discovery": "^1.15",
+ "psr/http-factory-implementation": "^1.0"
+ },
+ "require-dev": {
+ "nyholm/psr7": "^1.0",
+ "php-http/message": "^1.5",
+ "php-http/message-factory": "^1.0.2",
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Message\\MultipartStream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ }
+ ],
+ "description": "A builder class that help you create a multipart stream",
+ "homepage": "http://php-http.org/",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "multipart stream",
+ "stream"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/multipart-stream-builder/issues",
+ "source": "https://github.com/php-http/multipart-stream-builder/tree/1.4.2"
+ },
+ "time": "2024-09-04T13:22:54+00:00"
+ },
+ {
+ "name": "php-http/promise",
+ "version": "1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-http/promise.git",
+ "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-http/promise/zipball/fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+ "reference": "fc85b1fba37c169a69a07ef0d5a8075770cc1f83",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "friends-of-phpspec/phpspec-code-coverage": "^4.3.2 || ^6.3",
+ "phpspec/phpspec": "^5.1.2 || ^6.2 || ^7.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Http\\Promise\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Joel Wurtz",
+ "email": "joel.wurtz@gmail.com"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com"
+ }
+ ],
+ "description": "Promise used for asynchronous HTTP requests",
+ "homepage": "http://httplug.io/",
+ "keywords": [
+ "promise"
+ ],
+ "support": {
+ "issues": "https://github.com/php-http/promise/issues",
+ "source": "https://github.com/php-http/promise/tree/1.3.1"
+ },
+ "time": "2024-03-15T13:55:21+00:00"
+ },
+ {
+ "name": "phpstan/phpstan",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan.git",
+ "reference": "72115ab2bf1e40af1f9b238938d493ba7f3221e7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/72115ab2bf1e40af1f9b238938d493ba7f3221e7",
+ "reference": "72115ab2bf1e40af1f9b238938d493ba7f3221e7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2024-11-11T07:06:55+00:00"
+ },
+ {
+ "name": "phpstan/phpstan-strict-rules",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpstan-strict-rules.git",
+ "reference": "a4a6a08bd4a461e516b9c3b8fdbf0f1883b34158"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/a4a6a08bd4a461e516b9c3b8fdbf0f1883b34158",
+ "reference": "a4a6a08bd4a461e516b9c3b8fdbf0f1883b34158",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0",
+ "phpstan/phpstan": "^2.0"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/phpstan-deprecation-rules": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.6"
+ },
+ "type": "phpstan-extension",
+ "extra": {
+ "phpstan": {
+ "includes": [
+ "rules.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Extra strict and opinionated rules for PHPStan",
+ "support": {
+ "issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
+ "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.0"
+ },
+ "time": "2024-10-26T16:04:33+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client"
+ },
+ "time": "2023-09-23T14:17:50+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.12",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/72d080eb9edf80e36c19be61f72c98ed8273b765",
+ "reference": "72d080eb9edf80e36c19be61f72c98ed8273b765",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.12"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-20T08:15:52+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:32:20+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.4.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
+ "reference": "d7eb6daf8cd7e9ac4976e9576b32042ef7253453",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com/",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.4.11"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-08-13T14:27:37+00:00"
+ },
+ {
+ "name": "symfony/options-resolver",
+ "version": "v7.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/options-resolver.git",
+ "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/options-resolver/zipball/47aa818121ed3950acd2b58d1d37d08a94f9bf55",
+ "reference": "47aa818121ed3950acd2b58d1d37d08a94f9bf55",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\OptionsResolver\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an improved replacement for the array_replace PHP function",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "config",
+ "configuration",
+ "options"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/options-resolver/tree/v7.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-31T14:57:53+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.31.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v3.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+ "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.5-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/service-contracts/tree/v3.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-04-18T09:32:20+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v7.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306",
+ "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
+ "homepage": "https://symfony.com/",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/string/tree/v7.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-20T08:28:38+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.12.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0"
+ },
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-06-12T14:39:25+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
+ "reference": "23c79fbbfb725fb92af9bcf41065c8e9a0d49ddb",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.2.0"
+ },
+ "time": "2024-09-15T16:40:33+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.32",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.6"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "9.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-08-22T04:23:01+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.21",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
+ "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.5.0 || ^2",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.12.0",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
+ "sebastian/comparator": "^4.0.8",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.6",
+ "sebastian/global-state": "^5.0.7",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
+ "sebastian/version": "^3.0.2"
+ },
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-19T10:50:18+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:27:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a",
+ "reference": "fa0f136dd2334583309d32b62544682ee972b51a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2022-09-14T12:41:17+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:19:30+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:30:58+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:03:51+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:33:00+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-02T06:35:11+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:20:34+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:07:39+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "support": {
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-14T16:00:52+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:13:03+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:36:25+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": {},
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^8.3"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.6.0"
+}
diff --git a/issue-bot/console.php b/issue-bot/console.php
new file mode 100755
index 0000000000..fd1dfa73a8
--- /dev/null
+++ b/issue-bot/console.php
@@ -0,0 +1,73 @@
+#!/usr/bin/env php
+addPlugin($rateLimitPlugin);
+ $httpBuilder->addPlugin($requestCounter);
+
+ $client = new Client($httpBuilder);
+ $client->authenticate($token, AuthMethod::ACCESS_TOKEN);
+ $rateLimitPlugin->setClient($client);
+
+ $markdownEnvironment = new Environment();
+ $markdownEnvironment->addExtension(new CommonMarkCoreExtension());
+ $markdownEnvironment->addExtension(new GithubFlavoredMarkdownExtension());
+ $botCommentParser = new BotCommentParser(new MarkdownParser($markdownEnvironment));
+ $issueCommentDownloader = new IssueCommentDownloader($client, $botCommentParser);
+
+ $issueCachePath = __DIR__ . '/tmp/issueCache.tmp';
+ $playgroundCachePath = __DIR__ . '/tmp/playgroundCache.tmp';
+ $tmpDir = __DIR__ . '/tmp';
+
+ exec('git branch --show-current', $gitBranchLines, $exitCode);
+ if ($exitCode === 0) {
+ $gitBranch = implode("\n", $gitBranchLines);
+ } else {
+ $gitBranch = 'dev-master';
+ }
+
+ $postGenerator = new PostGenerator(new Differ(new UnifiedDiffOutputBuilder('')));
+
+ $application = new Application();
+ $application->add(new DownloadCommand($client, new PlaygroundClient(new \GuzzleHttp\Client()), $issueCommentDownloader, $issueCachePath, $playgroundCachePath));
+ $application->add(new RunCommand($playgroundCachePath, $tmpDir));
+ $application->add(new EvaluateCommand(new TabCreator(), $postGenerator, $client, $issueCommentDownloader, $issueCachePath, $playgroundCachePath, $tmpDir, $gitBranch, $phpstanSrcCommitBefore, $phpstanSrcCommitAfter));
+
+ $application->setCatchExceptions(false);
+ $application->run();
+})();
diff --git a/issue-bot/phpstan.neon b/issue-bot/phpstan.neon
new file mode 100644
index 0000000000..7ff756707c
--- /dev/null
+++ b/issue-bot/phpstan.neon
@@ -0,0 +1,13 @@
+includes:
+ - ../vendor/phpstan/phpstan-deprecation-rules/rules.neon
+ - ../vendor/phpstan/phpstan-phpunit/extension.neon
+ - ../vendor/phpstan/phpstan-phpunit/rules.neon
+ - ../vendor/phpstan/phpstan-strict-rules/rules.neon
+ - ../conf/bleedingEdge.neon
+
+parameters:
+ level: 8
+ paths:
+ - src
+ - tests
+ - console.php
diff --git a/issue-bot/phpunit.xml b/issue-bot/phpunit.xml
new file mode 100644
index 0000000000..0946e9b886
--- /dev/null
+++ b/issue-bot/phpunit.xml
@@ -0,0 +1,28 @@
+
+
+
+
+ src
+
+
+
+
+
+
+
+
+ tests
+
+
+
+
diff --git a/issue-bot/playground.neon b/issue-bot/playground.neon
new file mode 100644
index 0000000000..d4072a4170
--- /dev/null
+++ b/issue-bot/playground.neon
@@ -0,0 +1,13 @@
+rules:
+ - PHPStan\Rules\Playground\FunctionNeverRule
+ - PHPStan\Rules\Playground\MethodNeverRule
+ - PHPStan\Rules\Playground\NotAnalysedTraitRule
+ - PHPStan\Rules\Playground\NoPhpCodeRule
+
+conditionalTags:
+ PHPStan\Rules\Playground\StaticVarWithoutTypeRule:
+ phpstan.rules.rule: %checkImplicitMixed%
+
+services:
+ -
+ class: PHPStan\Rules\Playground\StaticVarWithoutTypeRule
diff --git a/issue-bot/src/.gitkeep b/issue-bot/src/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/issue-bot/src/Comment/BotComment.php b/issue-bot/src/Comment/BotComment.php
new file mode 100644
index 0000000000..3fbc351a6e
--- /dev/null
+++ b/issue-bot/src/Comment/BotComment.php
@@ -0,0 +1,32 @@
+resultHash = $playgroundExample->getHash();
+ }
+
+ public function getResultHash(): string
+ {
+ return $this->resultHash;
+ }
+
+ public function getDiff(): string
+ {
+ return $this->diff;
+ }
+
+}
diff --git a/issue-bot/src/Comment/BotCommentParser.php b/issue-bot/src/Comment/BotCommentParser.php
new file mode 100644
index 0000000000..c09d09263d
--- /dev/null
+++ b/issue-bot/src/Comment/BotCommentParser.php
@@ -0,0 +1,63 @@
+docParser->parse($text);
+ $walker = $document->walker();
+ $hashes = [];
+ $diffs = [];
+ while ($event = $walker->next()) {
+ if (!$event->isEntering()) {
+ continue;
+ }
+
+ $node = $event->getNode();
+ if ($node instanceof Link) {
+ $url = $node->getUrl();
+ $match = Strings::match($url, '/^https:\/\/phpstan\.org\/r\/([0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12})$/i');
+ if ($match === null) {
+ continue;
+ }
+
+ $hashes[] = $match[1];
+ continue;
+ }
+
+ if (!($node instanceof FencedCode)) {
+ continue;
+ }
+
+ if ($node->getInfo() !== 'diff') {
+ continue;
+ }
+
+ $diffs[] = $node->getLiteral();
+ }
+
+ if (count($hashes) !== 1) {
+ throw new BotCommentParserException();
+ }
+
+ if (count($diffs) !== 1) {
+ throw new BotCommentParserException();
+ }
+
+ return new BotCommentParserResult($hashes[0], $diffs[0]);
+ }
+
+}
diff --git a/issue-bot/src/Comment/BotCommentParserException.php b/issue-bot/src/Comment/BotCommentParserException.php
new file mode 100644
index 0000000000..8b4a7d7794
--- /dev/null
+++ b/issue-bot/src/Comment/BotCommentParserException.php
@@ -0,0 +1,10 @@
+hash;
+ }
+
+ public function getDiff(): string
+ {
+ return $this->diff;
+ }
+
+}
diff --git a/issue-bot/src/Comment/Comment.php b/issue-bot/src/Comment/Comment.php
new file mode 100644
index 0000000000..e29701b08d
--- /dev/null
+++ b/issue-bot/src/Comment/Comment.php
@@ -0,0 +1,39 @@
+ $playgroundExamples
+ */
+ public function __construct(
+ private string $author,
+ private string $text,
+ private array $playgroundExamples,
+ )
+ {
+ }
+
+ public function getAuthor(): string
+ {
+ return $this->author;
+ }
+
+ public function getText(): string
+ {
+ return $this->text;
+ }
+
+ /**
+ * @return non-empty-list
+ */
+ public function getPlaygroundExamples(): array
+ {
+ return $this->playgroundExamples;
+ }
+
+}
diff --git a/issue-bot/src/Comment/IssueCommentDownloader.php b/issue-bot/src/Comment/IssueCommentDownloader.php
new file mode 100644
index 0000000000..f676390289
--- /dev/null
+++ b/issue-bot/src/Comment/IssueCommentDownloader.php
@@ -0,0 +1,92 @@
+
+ */
+ public function getComments(int $issueNumber): array
+ {
+ $comments = [];
+ foreach ($this->downloadComments($issueNumber) as $issueComment) {
+ $commentExamples = $this->searchBody($issueComment['body']);
+ if (count($commentExamples) === 0) {
+ continue;
+ }
+
+ if ($issueComment['user']['login'] === 'phpstan-bot') {
+ $parserResult = $this->botCommentParser->parse($issueComment['body']);
+ if (count($commentExamples) !== 1 || $commentExamples[0]->getHash() !== $parserResult->getHash()) {
+ throw new BotCommentParserException();
+ }
+
+ $comments[] = new BotComment($issueComment['body'], $commentExamples[0], $parserResult->getDiff());
+ continue;
+ }
+
+ $comments[] = new Comment($issueComment['user']['login'], $issueComment['body'], $commentExamples);
+ }
+
+ return $comments;
+ }
+
+ /**
+ * @return mixed[]
+ */
+ private function downloadComments(int $issueNumber): array
+ {
+ $page = 1;
+
+ /** @var Issue $api */
+ $api = $this->githubClient->api('issue');
+
+ $comments = [];
+ while (true) {
+ $newComments = $api->comments()->all('phpstan', 'phpstan', $issueNumber, [
+ 'page' => $page,
+ 'per_page' => 100,
+ ]);
+ $comments = array_merge($comments, $newComments);
+ if (count($newComments) < 100) {
+ break;
+ }
+ $page++;
+ }
+
+ return $comments;
+ }
+
+ /**
+ * @return list
+ */
+ public function searchBody(string $text): array
+ {
+ $matches = Strings::matchAll($text, '/https:\/\/phpstan\.org\/r\/([0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12})/i');
+
+ $examples = [];
+
+ foreach ($matches as [$url, $hash]) {
+ $examples[] = new PlaygroundExample($url, $hash);
+ }
+
+ return $examples;
+ }
+
+}
diff --git a/issue-bot/src/Console/DownloadCommand.php b/issue-bot/src/Console/DownloadCommand.php
new file mode 100644
index 0000000000..fb0855b792
--- /dev/null
+++ b/issue-bot/src/Console/DownloadCommand.php
@@ -0,0 +1,258 @@
+setName('download');
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $issues = $this->getIssues();
+
+ $playgroundCache = $this->loadPlaygroundCache();
+ if ($playgroundCache === null) {
+ $cachedResults = [];
+ } else {
+ $cachedResults = $playgroundCache->getResults();
+ }
+
+ $unusedCachedResults = $cachedResults;
+
+ $deduplicatedExamples = [];
+ foreach ($issues as $issue) {
+ foreach ($issue->getComments() as $comment) {
+ if ($comment instanceof BotComment) {
+ continue;
+ }
+ foreach ($comment->getPlaygroundExamples() as $example) {
+ $deduplicatedExamples[$example->getHash()] = $example;
+ }
+ }
+ }
+
+ $hashes = array_keys($deduplicatedExamples);
+ foreach ($hashes as $hash) {
+ if (array_key_exists($hash, $cachedResults)) {
+ unset($unusedCachedResults[$hash]);
+ continue;
+ }
+
+ $cachedResults[$hash] = $this->playgroundClient->getResult($hash);
+ }
+
+ foreach (array_keys($unusedCachedResults) as $hash) {
+ unset($cachedResults[$hash]);
+ }
+
+ $this->savePlaygroundCache(new PlaygroundCache($cachedResults));
+
+ $chunkSize = (int) ceil(count($hashes) / 20);
+ if ($chunkSize < 1) {
+ throw new Exception('Chunk size less than 1');
+ }
+
+ $matrix = [];
+ foreach ([70300, 70400, 80000, 80100, 80200, 80300, 80400] as $phpVersion) {
+ $phpVersionHashes = [];
+ foreach ($cachedResults as $hash => $result) {
+ $resultPhpVersions = array_keys($result->getVersionedErrors());
+ if ($resultPhpVersions === [70400]) {
+ $resultPhpVersions = [70300, 70400, 80000];
+ }
+
+ if (!in_array(80100, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80100;
+ }
+ if (!in_array(80200, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80200;
+ }
+ if (!in_array(80300, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80300;
+ }
+ if (!in_array(80400, $resultPhpVersions, true)) {
+ $resultPhpVersions[] = 80400;
+ }
+
+ if (!in_array($phpVersion, $resultPhpVersions, true)) {
+ continue;
+ }
+ $phpVersionHashes[] = $hash;
+ }
+ $chunkSize = (int) ceil(count($phpVersionHashes) / 18);
+ if ($chunkSize < 1) {
+ throw new Exception('Chunk size less than 1');
+ }
+ $chunks = array_chunk($phpVersionHashes, $chunkSize);
+ $i = 1;
+ foreach ($chunks as $chunk) {
+ $matrix[] = [
+ 'phpVersion' => $phpVersion,
+ 'chunkNumber' => $i,
+ 'playgroundExamples' => implode(',', $chunk),
+ ];
+ $i++;
+ }
+ }
+
+ $output->writeln(Json::encode(['include' => $matrix]));
+
+ return 0;
+ }
+
+ /**
+ * @return Issue[]
+ */
+ private function getIssues(): array
+ {
+ /** @var \Github\Api\Issue $api */
+ $api = $this->githubClient->api('issue');
+
+ $cache = $this->loadIssueCache();
+ $newDate = new DateTimeImmutable();
+
+ $issues = [];
+ foreach (['feature-request', 'bug'] as $label) {
+ $page = 1;
+ while (true) {
+ $parameters = [
+ 'labels' => $label,
+ 'page' => $page,
+ 'per_page' => 100,
+ 'sort' => 'created',
+ 'direction' => 'desc',
+ ];
+ if ($cache !== null) {
+ $parameters['state'] = 'all';
+ $parameters['since'] = $cache->getDate()->format(DateTimeImmutable::ATOM);
+ } else {
+ $parameters['state'] = 'open';
+ }
+ $newIssues = $api->all('phpstan', 'phpstan', $parameters);
+ $issues = array_merge($issues, $newIssues);
+ if (count($newIssues) < 100) {
+ break;
+ }
+
+ $page++;
+ }
+ }
+
+ $issueObjects = [];
+ if ($cache !== null) {
+ $issueObjects = $cache->getIssues();
+ }
+ foreach ($issues as $issue) {
+ if ($issue['state'] === 'closed') {
+ unset($issueObjects[$issue['number']]);
+ continue;
+ }
+ $comments = [];
+ $issueExamples = $this->issueCommentDownloader->searchBody($issue['body']);
+ if (count($issueExamples) > 0) {
+ $comments[] = new Comment($issue['user']['login'], $issue['body'], $issueExamples);
+ }
+
+ foreach ($this->issueCommentDownloader->getComments($issue['number']) as $issueComment) {
+ $comments[] = $issueComment;
+ }
+
+ $issueObjects[(int) $issue['number']] = new Issue(
+ $issue['number'],
+ $comments,
+ );
+ }
+
+ $this->saveIssueCache(new IssueCache($newDate, $issueObjects));
+
+ return $issueObjects;
+ }
+
+ private function loadIssueCache(): ?IssueCache
+ {
+ if (!is_file($this->issueCachePath)) {
+ return null;
+ }
+
+ $contents = file_get_contents($this->issueCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ private function saveIssueCache(IssueCache $cache): void
+ {
+ $result = file_put_contents($this->issueCachePath, serialize($cache));
+ if ($result === false) {
+ throw new Exception('Write unsuccessful');
+ }
+ }
+
+ private function loadPlaygroundCache(): ?PlaygroundCache
+ {
+ if (!is_file($this->playgroundCachePath)) {
+ return null;
+ }
+
+ $contents = file_get_contents($this->playgroundCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ private function savePlaygroundCache(PlaygroundCache $cache): void
+ {
+ $result = file_put_contents($this->playgroundCachePath, serialize($cache));
+ if ($result === false) {
+ throw new Exception('Write unsuccessful');
+ }
+ }
+
+}
diff --git a/issue-bot/src/Console/EvaluateCommand.php b/issue-bot/src/Console/EvaluateCommand.php
new file mode 100644
index 0000000000..9836d85bb0
--- /dev/null
+++ b/issue-bot/src/Console/EvaluateCommand.php
@@ -0,0 +1,319 @@
+setName('evaluate');
+ $this->addOption('post-comments', null, InputOption::VALUE_NONE);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $issueCache = $this->loadIssueCache();
+ $originalResults = $this->loadPlaygroundCache()->getResults();
+ $newResults = $this->loadResults();
+ $toPost = [];
+ $totalCodeSnippets = 0;
+
+ foreach ($issueCache->getIssues() as $issue) {
+ $botComments = [];
+ $deduplicatedExamples = [];
+ foreach ($issue->getComments() as $comment) {
+ if ($comment instanceof BotComment) {
+ $botComments[] = $comment;
+ continue;
+ }
+ foreach ($comment->getPlaygroundExamples() as $example) {
+ if (isset($deduplicatedExamples[$example->getHash()])) {
+ $deduplicatedExamples[$example->getHash()]['users'][] = $comment->getAuthor();
+ $deduplicatedExamples[$example->getHash()]['users'] = array_values(array_unique($deduplicatedExamples[$example->getHash()]['users']));
+ continue;
+ }
+ $deduplicatedExamples[$example->getHash()] = [
+ 'example' => $example,
+ 'users' => [$comment->getAuthor()],
+ ];
+ }
+ }
+
+ $totalCodeSnippets += count($deduplicatedExamples);
+ foreach ($deduplicatedExamples as ['example' => $example, 'users' => $users]) {
+ $hash = $example->getHash();
+ if (!array_key_exists($hash, $originalResults)) {
+ throw new Exception(sprintf('Hash %s does not exist in original results.', $hash));
+ }
+
+ $originalErrors = $originalResults[$hash]->getVersionedErrors();
+ $originalTabs = $this->tabCreator->create($originalErrors);
+
+ if (!array_key_exists($hash, $newResults)) {
+ throw new Exception(sprintf('Hash %s does not exist in new results.', $hash));
+ }
+
+ $originalPhpVersions = array_keys($originalErrors);
+ $newResult = $newResults[$hash];
+ if (array_key_exists(70100, $originalErrors) || $originalPhpVersions === [70400]) {
+ $newResult[70100] = $newResult[70300];
+ }
+ if (array_key_exists(70200, $originalErrors)) {
+ $newResult[70200] = $newResult[70300];
+ }
+
+ $newTabs = $this->tabCreator->create($this->filterErrors($originalErrors, $newResult));
+ $text = $this->postGenerator->createText($hash, $originalTabs, $newTabs, $botComments);
+ if ($text === null) {
+ continue;
+ }
+
+ if ($this->isIssueClosed($issue->getNumber())) {
+ continue;
+ }
+
+ $freshBotComments = $this->getFreshBotComments($issue->getNumber());
+ $textAgain = $this->postGenerator->createText($hash, $originalTabs, $newTabs, $freshBotComments);
+ if ($textAgain === null) {
+ continue;
+ }
+
+ $toPost[] = [
+ 'issue' => $issue->getNumber(),
+ 'hash' => $hash,
+ 'users' => $users,
+ 'diff' => $text['diff'],
+ 'details' => $text['details'],
+ ];
+ }
+ }
+
+ if (count($toPost) === 0) {
+ $output->writeln(sprintf('No changes in results in %d code snippets from %d GitHub issues. :tada:', $totalCodeSnippets, count($issueCache->getIssues())));
+ }
+
+ foreach ($toPost as ['issue' => $issue, 'hash' => $hash, 'users' => $users, 'diff' => $diff, 'details' => $details]) {
+ $text = sprintf(
+ "Result of the [code snippet](https://phpstan.org/r/%s) from %s in [#%d](https://github.com/phpstan/phpstan/issues/%d) changed:\n\n```diff\n%s```",
+ $hash,
+ implode(' ', array_map(static fn (string $user): string => sprintf('@%s', $user), $users)),
+ $issue,
+ $issue,
+ $diff,
+ );
+ if ($details !== null) {
+ $text .= "\n\n" . sprintf('
+ Full report
+
+%s
+ ', $details);
+ }
+
+ $text .= "\n\n---\n";
+
+ $output->writeln($text);
+ }
+
+ $postComments = (bool) $input->getOption('post-comments');
+ if ($postComments) {
+ if (count($toPost) > 20) {
+ $output->writeln('Too many comments to post, something is probably wrong.');
+ return 1;
+ }
+ foreach ($toPost as ['issue' => $issue, 'hash' => $hash, 'users' => $users, 'diff' => $diff, 'details' => $details]) {
+ $text = sprintf(
+ "%s After [the latest push in %s](https://github.com/phpstan/phpstan-src/compare/%s...%s), PHPStan now reports different result with your [code snippet](https://phpstan.org/r/%s):\n\n```diff\n%s```",
+ implode(' ', array_map(static fn (string $user): string => sprintf('@%s', $user), $users)),
+ $this->gitBranch,
+ $this->phpstanSrcCommitBefore,
+ $this->phpstanSrcCommitAfter,
+ $hash,
+ $diff,
+ );
+ if ($details !== null) {
+ $text .= "\n\n" . sprintf('
+ Full report
+
+%s
+ ', $details);
+ }
+
+ /** @var GitHubIssueApi $issueApi */
+ $issueApi = $this->githubClient->api('issue');
+ $issueApi->comments()->create('phpstan', 'phpstan', $issue, [
+ 'body' => $text,
+ ]);
+ }
+ }
+
+ return 0;
+ }
+
+ /**
+ * @return list
+ */
+ private function getFreshBotComments(int $issueNumber): array
+ {
+ $comments = [];
+ foreach ($this->issueCommentDownloader->getComments($issueNumber) as $issueComment) {
+ if (!$issueComment instanceof BotComment) {
+ continue;
+ }
+
+ $comments[] = $issueComment;
+ }
+
+ return $comments;
+ }
+
+ private function isIssueClosed(int $issueNumber): bool
+ {
+ /** @var GitHubIssueApi $issueApi */
+ $issueApi = $this->githubClient->api('issue');
+ $issue = $issueApi->show('phpstan', 'phpstan', $issueNumber);
+
+ return $issue['state'] === 'closed';
+ }
+
+ private function loadIssueCache(): IssueCache
+ {
+ if (!is_file($this->issueCachePath)) {
+ throw new Exception('Issue cache must exist');
+ }
+
+ $contents = file_get_contents($this->issueCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ private function loadPlaygroundCache(): PlaygroundCache
+ {
+ if (!is_file($this->playgroundCachePath)) {
+ throw new Exception('Playground cache must exist');
+ }
+
+ $contents = file_get_contents($this->playgroundCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+ /**
+ * @return array>>
+ */
+ private function loadResults(): array
+ {
+ $finder = new Finder();
+ $tmpResults = [];
+ foreach ($finder->files()->name('results-*.tmp')->in($this->tmpDir) as $resultFile) {
+ $contents = file_get_contents($resultFile->getPathname());
+ if ($contents === false) {
+ throw new Exception('Result read unsuccessful');
+ }
+ $result = unserialize($contents);
+ $phpVersion = (int) $result['phpVersion'];
+ foreach ($result['errors'] as $hash => $errors) {
+ $tmpResults[(string) $hash][$phpVersion] = array_values($errors);
+ }
+ }
+
+ return $tmpResults;
+ }
+
+ /**
+ * @param array> $originalErrors
+ * @param array> $newErrors
+ * @return array>
+ */
+ private function filterErrors(
+ array $originalErrors,
+ array $newErrors,
+ ): array
+ {
+ $originalPhpVersions = array_keys($originalErrors);
+ $filteredNewErrors = [];
+ foreach ($newErrors as $phpVersion => $errors) {
+ if (!in_array($phpVersion, $originalPhpVersions, true)) {
+ continue;
+ }
+
+ $filteredNewErrors[$phpVersion] = $errors;
+ }
+
+ $newTabs = $this->tabCreator->create($newErrors);
+ $filteredNewTabs = $this->tabCreator->create($filteredNewErrors);
+ if (count($newTabs) !== count($filteredNewTabs)) {
+ return $newErrors;
+ }
+
+ $firstFilteredNewTab = $filteredNewTabs[0];
+ $firstNewTab = $newTabs[0];
+
+ if (count($firstFilteredNewTab->getErrors()) !== count($firstNewTab->getErrors())) {
+ return $newErrors;
+ }
+
+ foreach ($firstFilteredNewTab->getErrors() as $i => $error) {
+ $otherError = $firstNewTab->getErrors()[$i];
+ if ($error->getLine() !== $otherError->getLine()) {
+ return $newErrors;
+ }
+ if ($error->getMessage() !== $otherError->getMessage()) {
+ return $newErrors;
+ }
+ }
+
+ return $filteredNewErrors;
+ }
+
+}
diff --git a/issue-bot/src/Console/RunCommand.php b/issue-bot/src/Console/RunCommand.php
new file mode 100644
index 0000000000..763db57cd0
--- /dev/null
+++ b/issue-bot/src/Console/RunCommand.php
@@ -0,0 +1,150 @@
+setName('run');
+ $this->addArgument('phpVersion', InputArgument::REQUIRED);
+ $this->addArgument('playgroundHashes', InputArgument::REQUIRED);
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output): int
+ {
+ $phpVersion = (int) $input->getArgument('phpVersion');
+ $commaSeparatedPlaygroundHashes = $input->getArgument('playgroundHashes');
+ $playgroundHashes = explode(',', $commaSeparatedPlaygroundHashes);
+ $playgroundCache = $this->loadPlaygroundCache();
+ $errors = [];
+ foreach ($playgroundHashes as $hash) {
+ if (!array_key_exists($hash, $playgroundCache->getResults())) {
+ throw new Exception(sprintf('Hash %s must exist', $hash));
+ }
+ $errors[$hash] = $this->analyseHash($output, $phpVersion, $playgroundCache->getResults()[$hash]);
+ }
+
+ $data = ['phpVersion' => $phpVersion, 'errors' => $errors];
+
+ $writeSuccess = file_put_contents(sprintf($this->tmpDir . '/results-%d-%s.tmp', $phpVersion, sha1($commaSeparatedPlaygroundHashes)), serialize($data));
+ if ($writeSuccess === false) {
+ throw new Exception('Result write unsuccessful');
+ }
+
+ return 0;
+ }
+
+ /**
+ * @return list
+ */
+ private function analyseHash(OutputInterface $output, int $phpVersion, PlaygroundResult $result): array
+ {
+ $configFiles = [
+ __DIR__ . '/../../playground.neon',
+ ];
+ if ($result->isBleedingEdge()) {
+ $configFiles[] = __DIR__ . '/../../../conf/bleedingEdge.neon';
+ }
+ if ($result->isStrictRules()) {
+ $configFiles[] = __DIR__ . '/../../vendor/phpstan/phpstan-strict-rules/rules.neon';
+ }
+ $neon = Neon::encode([
+ 'includes' => $configFiles,
+ 'parameters' => [
+ 'level' => $result->getLevel(),
+ 'inferPrivatePropertyTypeFromConstructor' => true,
+ 'treatPhpDocTypesAsCertain' => $result->isTreatPhpDocTypesAsCertain(),
+ 'phpVersion' => $phpVersion,
+ ],
+ ]);
+
+ $hash = $result->getHash();
+ $neonPath = sprintf($this->tmpDir . '/%s.neon', $hash);
+ $codePath = sprintf($this->tmpDir . '/%s.php', $hash);
+ file_put_contents($neonPath, $neon);
+ file_put_contents($codePath, $result->getCode());
+
+ $commandArray = [
+ __DIR__ . '/../../../bin/phpstan',
+ 'analyse',
+ '--error-format',
+ 'json',
+ '--no-progress',
+ '-c',
+ $neonPath,
+ $codePath,
+ ];
+
+ $output->writeln(sprintf('Starting analysis of %s', $hash));
+
+ $startTime = microtime(true);
+ exec(implode(' ', $commandArray), $outputLines, $exitCode);
+ $elapsedTime = microtime(true) - $startTime;
+ $output->writeln(sprintf('Analysis of %s took %.2f s', $hash, $elapsedTime));
+
+ if ($exitCode !== 0 && $exitCode !== 1) {
+ throw new Exception(sprintf('PHPStan exited with code %d during analysis of %s', $exitCode, $hash));
+ }
+
+ $json = Json::decode(implode("\n", $outputLines), Json::FORCE_ARRAY);
+ $errors = [];
+ foreach ($json['files'] as ['messages' => $messages]) {
+ foreach ($messages as $message) {
+ $messageText = str_replace(sprintf('/%s.php', $hash), '/tmp.php', $message['message']);
+ if (strpos($messageText, 'Internal error') !== false) {
+ throw new Exception(sprintf('While analysing %s: %s', $hash, $messageText));
+ }
+ $errors[] = new PlaygroundError($message['line'] ?? -1, $messageText, $message['identifier'] ?? null);
+ }
+ }
+
+ return $errors;
+ }
+
+ private function loadPlaygroundCache(): PlaygroundCache
+ {
+ if (!is_file($this->playgroundCachePath)) {
+ throw new Exception('Playground cache must exist');
+ }
+
+ $contents = file_get_contents($this->playgroundCachePath);
+ if ($contents === false) {
+ throw new Exception('Read unsuccessful');
+ }
+
+ return unserialize($contents);
+ }
+
+}
diff --git a/issue-bot/src/GitHub/RateLimitPlugin.php b/issue-bot/src/GitHub/RateLimitPlugin.php
new file mode 100644
index 0000000000..ce0bbf8caa
--- /dev/null
+++ b/issue-bot/src/GitHub/RateLimitPlugin.php
@@ -0,0 +1,47 @@
+client = $client;
+ }
+
+ public function handleRequest(RequestInterface $request, callable $next, callable $first): Promise
+ {
+ $path = $request->getUri()->getPath();
+ if ($path === '/rate_limit') {
+ return $next($request);
+ }
+
+ /** @var RateLimit $api */
+ $api = $this->client->api('rate_limit');
+
+ /** @var RateLimitResource $resource */
+ $resource = $api->getResource('core');
+ if ($resource->getRemaining() < 10) {
+ $reset = $resource->getReset();
+ $sleepFor = $reset - time();
+ if ($sleepFor > 0) {
+ sleep($sleepFor);
+ }
+ }
+
+ return $next($request);
+ }
+
+}
diff --git a/issue-bot/src/GitHub/RequestCounterPlugin.php b/issue-bot/src/GitHub/RequestCounterPlugin.php
new file mode 100644
index 0000000000..042cb53202
--- /dev/null
+++ b/issue-bot/src/GitHub/RequestCounterPlugin.php
@@ -0,0 +1,30 @@
+getUri()->getPath();
+ if ($path === '/rate_limit') {
+ return $next($request);
+ }
+
+ $this->totalCount++;
+ return $next($request);
+ }
+
+ public function getTotalCount(): int
+ {
+ return $this->totalCount;
+ }
+
+}
diff --git a/issue-bot/src/Issue/Issue.php b/issue-bot/src/Issue/Issue.php
new file mode 100644
index 0000000000..a9feaf01d8
--- /dev/null
+++ b/issue-bot/src/Issue/Issue.php
@@ -0,0 +1,30 @@
+number;
+ }
+
+ /**
+ * @return Comment[]
+ */
+ public function getComments(): array
+ {
+ return $this->comments;
+ }
+
+}
diff --git a/issue-bot/src/Issue/IssueCache.php b/issue-bot/src/Issue/IssueCache.php
new file mode 100644
index 0000000000..6b5ed53fec
--- /dev/null
+++ b/issue-bot/src/Issue/IssueCache.php
@@ -0,0 +1,30 @@
+ $issues
+ */
+ public function __construct(private DateTimeImmutable $date, private array $issues)
+ {
+ }
+
+ public function getDate(): DateTimeImmutable
+ {
+ return $this->date;
+ }
+
+ /**
+ * @return array
+ */
+ public function getIssues(): array
+ {
+ return $this->issues;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundCache.php b/issue-bot/src/Playground/PlaygroundCache.php
new file mode 100644
index 0000000000..cda495a831
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundCache.php
@@ -0,0 +1,23 @@
+ $results
+ */
+ public function __construct(private array $results)
+ {
+ }
+
+ /**
+ * @return array
+ */
+ public function getResults(): array
+ {
+ return $this->results;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundClient.php b/issue-bot/src/Playground/PlaygroundClient.php
new file mode 100644
index 0000000000..43cd6ea9d3
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundClient.php
@@ -0,0 +1,42 @@
+client->get(sprintf('https://api.phpstan.org/sample?id=%s', $hash));
+
+ $body = (string) $response->getBody();
+ $json = Json::decode($body, Json::FORCE_ARRAY);
+
+ $versionedErrors = [];
+ foreach ($json['versionedErrors'] as ['phpVersion' => $phpVersion, 'errors' => $errors]) {
+ $versionedErrors[(int) $phpVersion] = array_map(static fn (array $error) => new PlaygroundError($error['line'] ?? -1, $error['message'], $error['identifier'] ?? null), array_values($errors));
+ }
+
+ return new PlaygroundResult(
+ sprintf('https://phpstan.org/r/%s', $hash),
+ $hash,
+ $json['code'],
+ $json['level'],
+ $json['config']['strictRules'],
+ $json['config']['bleedingEdge'],
+ $json['config']['treatPhpDocTypesAsCertain'],
+ $versionedErrors,
+ );
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundError.php b/issue-bot/src/Playground/PlaygroundError.php
new file mode 100644
index 0000000000..1e55ac88b3
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundError.php
@@ -0,0 +1,27 @@
+line;
+ }
+
+ public function getMessage(): string
+ {
+ return $this->message;
+ }
+
+ public function getIdentifier(): ?string
+ {
+ return $this->identifier;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundExample.php b/issue-bot/src/Playground/PlaygroundExample.php
new file mode 100644
index 0000000000..0d25f7bfbb
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundExample.php
@@ -0,0 +1,25 @@
+url;
+ }
+
+ public function getHash(): string
+ {
+ return $this->hash;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundResult.php b/issue-bot/src/Playground/PlaygroundResult.php
new file mode 100644
index 0000000000..faddc6c078
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundResult.php
@@ -0,0 +1,67 @@
+> $versionedErrors
+ */
+ public function __construct(
+ private string $url,
+ private string $hash,
+ private string $code,
+ private string $level,
+ private bool $strictRules,
+ private bool $bleedingEdge,
+ private bool $treatPhpDocTypesAsCertain,
+ private array $versionedErrors,
+ )
+ {
+ }
+
+ public function getUrl(): string
+ {
+ return $this->url;
+ }
+
+ public function getHash(): string
+ {
+ return $this->hash;
+ }
+
+ public function getCode(): string
+ {
+ return $this->code;
+ }
+
+ public function getLevel(): string
+ {
+ return $this->level;
+ }
+
+ public function isStrictRules(): bool
+ {
+ return $this->strictRules;
+ }
+
+ public function isBleedingEdge(): bool
+ {
+ return $this->bleedingEdge;
+ }
+
+ public function isTreatPhpDocTypesAsCertain(): bool
+ {
+ return $this->treatPhpDocTypesAsCertain;
+ }
+
+ /**
+ * @return array>
+ */
+ public function getVersionedErrors(): array
+ {
+ return $this->versionedErrors;
+ }
+
+}
diff --git a/issue-bot/src/Playground/PlaygroundResultTab.php b/issue-bot/src/Playground/PlaygroundResultTab.php
new file mode 100644
index 0000000000..03d33ac7d4
--- /dev/null
+++ b/issue-bot/src/Playground/PlaygroundResultTab.php
@@ -0,0 +1,28 @@
+ $errors
+ */
+ public function __construct(private string $title, private array $errors)
+ {
+ }
+
+ public function getTitle(): string
+ {
+ return $this->title;
+ }
+
+ /**
+ * @return list
+ */
+ public function getErrors(): array
+ {
+ return $this->errors;
+ }
+
+}
diff --git a/issue-bot/src/Playground/TabCreator.php b/issue-bot/src/Playground/TabCreator.php
new file mode 100644
index 0000000000..a6254957b2
--- /dev/null
+++ b/issue-bot/src/Playground/TabCreator.php
@@ -0,0 +1,130 @@
+> $versionedErrors
+ * @return list
+ */
+ public function create(array $versionedErrors): array
+ {
+ ksort($versionedErrors, SORT_NUMERIC);
+
+ $versions = [];
+ $last = null;
+
+ foreach ($versionedErrors as $phpVersion => $errors) {
+ $errors = array_values(array_filter($errors, static fn (PlaygroundError $error) => $error->getIdentifier() !== 'phpstanPlayground.configParameter'));
+ $errors = array_map(static function (PlaygroundError $error): PlaygroundError {
+ if ($error->getIdentifier() === null) {
+ return $error;
+ }
+
+ if (!str_starts_with($error->getIdentifier(), 'phpstanPlayground.')) {
+ return $error;
+ }
+
+ return new PlaygroundError(
+ $error->getLine(),
+ sprintf('Tip: %s', $error->getMessage()),
+ $error->getIdentifier(),
+ );
+ }, $errors);
+ $current = [
+ 'versions' => [$phpVersion],
+ 'errors' => $errors,
+ ];
+ if ($last === null) {
+ $last = $current;
+ continue;
+ }
+
+ if (count($errors) !== count($last['errors'])) {
+ $versions[] = $last;
+ $last = $current;
+ continue;
+ }
+
+ $merge = true;
+ foreach ($errors as $i => $error) {
+ $lastError = $last['errors'][$i];
+ if ($error->getLine() !== $lastError->getLine()) {
+ $versions[] = $last;
+ $last = $current;
+ $merge = false;
+ break;
+ }
+ if ($error->getMessage() !== $lastError->getMessage()) {
+ $versions[] = $last;
+ $last = $current;
+ $merge = false;
+ break;
+ }
+ }
+
+ if (!$merge) {
+ continue;
+ }
+
+ $last['versions'][] = $phpVersion;
+ }
+
+ if ($last !== null) {
+ $versions[] = $last;
+ }
+
+ usort($versions, static function ($a, $b): int {
+ $aVersion = $a['versions'][count($a['versions']) - 1];
+ $bVersion = $b['versions'][count($b['versions']) - 1];
+
+ return $bVersion - $aVersion;
+ });
+
+ $tabs = [];
+
+ foreach ($versions as $version) {
+ $title = 'PHP ';
+ if (count($version['versions']) > 1) {
+ $title .= $this->versionNumberToString($version['versions'][0]);
+ $title .= ' – ';
+ $title .= $this->versionNumberToString($version['versions'][count($version['versions']) - 1]);
+ } else {
+ $title .= $this->versionNumberToString($version['versions'][0]);
+ }
+
+ if (count($version['errors']) === 1) {
+ $title .= ' (1 error)';
+ } elseif (count($version['errors']) > 0) {
+ $title .= ' (' . count($version['errors']) . ' errors)';
+ }
+
+ $tabs[] = new PlaygroundResultTab($title, $version['errors']);
+ }
+
+ return $tabs;
+ }
+
+ private function versionNumberToString(int $versionId): string
+ {
+ $first = (int) floor($versionId / 10000);
+ $second = (int) floor(($versionId % 10000) / 100);
+ $third = (int) floor($versionId % 100);
+
+ return $first . '.' . $second . ($third !== 0 ? '.' . $third : '');
+ }
+
+}
diff --git a/issue-bot/src/PostGenerator.php b/issue-bot/src/PostGenerator.php
new file mode 100644
index 0000000000..db62d448a8
--- /dev/null
+++ b/issue-bot/src/PostGenerator.php
@@ -0,0 +1,138 @@
+ $originalTabs
+ * @param list $currentTabs
+ * @param BotComment[] $botComments
+ * @return array{diff: string, details: string|null}|null
+ */
+ public function createText(
+ string $hash,
+ array $originalTabs,
+ array $currentTabs,
+ array $botComments,
+ ): ?array
+ {
+ foreach ($currentTabs as $tab) {
+ foreach ($tab->getErrors() as $error) {
+ if (strpos($error->getMessage(), 'Internal error') === false) {
+ continue;
+ }
+
+ return null;
+ }
+ }
+
+ $maxDigit = 1;
+ foreach (array_merge($originalTabs, $currentTabs) as $tab) {
+ foreach ($tab->getErrors() as $error) {
+ $length = strlen((string) $error->getLine());
+ if ($length <= $maxDigit) {
+ continue;
+ }
+
+ $maxDigit = $length;
+ }
+ }
+ $originalErrorsText = $this->generateTextFromTabs($originalTabs, $maxDigit);
+ $currentErrorsText = $this->generateTextFromTabs($currentTabs, $maxDigit);
+ if ($originalErrorsText === $currentErrorsText) {
+ return null;
+ }
+
+ $diff = $this->differ->diff($originalErrorsText, $currentErrorsText);
+ foreach ($botComments as $botComment) {
+ if ($botComment->getResultHash() !== $hash) {
+ continue;
+ }
+
+ if ($botComment->getDiff() === $diff) {
+ return null;
+ }
+ }
+
+ if (count($currentTabs) === 1 && count($currentTabs[0]->getErrors()) === 0) {
+ return ['diff' => $diff, 'details' => null];
+ }
+
+ $details = [];
+ foreach ($currentTabs as $tab) {
+ $detail = '';
+ if (count($currentTabs) > 1) {
+ $detail .= sprintf("%s\n-----------\n\n", $tab->getTitle());
+ }
+
+ if (count($tab->getErrors()) === 0) {
+ $detail .= "No errors\n";
+ $details[] = $detail;
+ continue;
+ }
+
+ $detail .= "| Line | Error |\n";
+ $detail .= "|---|---|\n";
+
+ foreach ($tab->getErrors() as $error) {
+ $errorText = Strings::replace($error->getMessage(), "/\r|\n/", '');
+ $detail .= sprintf("| %d | `%s` |\n", $error->getLine(), $errorText);
+ }
+
+ $details[] = $detail;
+ }
+
+ return ['diff' => $diff, 'details' => implode("\n", $details)];
+ }
+
+ /**
+ * @param PlaygroundResultTab[] $tabs
+ */
+ private function generateTextFromTabs(array $tabs, int $maxDigit): string
+ {
+ $parts = [];
+ foreach ($tabs as $tab) {
+ $text = '';
+ if (count($tabs) > 1) {
+ $text .= sprintf("%s\n==========\n\n", $tab->getTitle());
+ }
+
+ if (count($tab->getErrors()) === 0) {
+ $text .= 'No errors';
+ $parts[] = $text;
+ continue;
+ }
+
+ $errorLines = [];
+ foreach ($tab->getErrors() as $error) {
+ $errorLines[] = sprintf('%s: %s', str_pad((string) $error->getLine(), $maxDigit, ' ', STR_PAD_LEFT), $error->getMessage());
+ }
+
+ $text .= implode("\n", $errorLines);
+
+ $parts[] = $text;
+ }
+
+ return implode("\n\n", $parts);
+ }
+
+}
diff --git a/issue-bot/tests/Comment/BotCommentParserResultTest.php b/issue-bot/tests/Comment/BotCommentParserResultTest.php
new file mode 100644
index 0000000000..123c8034f1
--- /dev/null
+++ b/issue-bot/tests/Comment/BotCommentParserResultTest.php
@@ -0,0 +1,49 @@
+
+ */
+ public function dataParse(): iterable
+ {
+ yield [
+ '@foobar After [the latest commit to dev-master](https://github.com/phpstan/phpstan-src/commit/abc123), PHPStan now reports different result with your [code snippet](https://phpstan.org/r/74c3b0af-5a87-47e7-907a-9ea6fbb1c396):
+
+```diff
+@@ @@
+-1: abc
++1: def
+```',
+ '74c3b0af-5a87-47e7-907a-9ea6fbb1c396',
+ '@@ @@
+-1: abc
++1: def
+',
+ ];
+ }
+
+ /**
+ * @dataProvider dataParse
+ */
+ public function testParse(string $text, string $expectedHash, string $expectedDiff): void
+ {
+ $markdownEnvironment = new Environment();
+ $markdownEnvironment->addExtension(new CommonMarkCoreExtension());
+ $markdownEnvironment->addExtension(new GithubFlavoredMarkdownExtension());
+ $parser = new BotCommentParser(new MarkdownParser($markdownEnvironment));
+ $result = $parser->parse($text);
+ self::assertSame($expectedHash, $result->getHash());
+ self::assertSame($expectedDiff, $result->getDiff());
+ }
+
+}
diff --git a/issue-bot/tests/Playground/TabCreatorTest.php b/issue-bot/tests/Playground/TabCreatorTest.php
new file mode 100644
index 0000000000..47bf147308
--- /dev/null
+++ b/issue-bot/tests/Playground/TabCreatorTest.php
@@ -0,0 +1,134 @@
+>, list}>
+ */
+ public function dataCreate(): array
+ {
+ return [
+ [
+ [
+ 70100 => [
+
+ ],
+ 70200 => [
+
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 – 7.2', []),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', null),
+ ],
+ 70200 => [
+ new PlaygroundError(2, 'Foo', null),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 – 7.2 (1 error)', [
+ new PlaygroundError(2, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ 70200 => [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 – 7.2 (2 errors)', [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ 70200 => [
+ new PlaygroundError(3, 'Foo', null),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.2 (1 error)', [
+ new PlaygroundError(3, 'Foo', null),
+ ]),
+ new PlaygroundResultTab('PHP 7.1 (2 errors)', [
+ new PlaygroundError(2, 'Foo', null),
+ new PlaygroundError(3, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', 'attribute.notFound'),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 (1 error)', [
+ new PlaygroundError(2, 'Foo', null),
+ ]),
+ ],
+ ],
+ [
+ [
+ 70100 => [
+ new PlaygroundError(2, 'Foo', 'phpstanPlayground.never'),
+ ],
+ ],
+ [
+ new PlaygroundResultTab('PHP 7.1 (1 error)', [
+ new PlaygroundError(2, 'Tip: Foo', null),
+ ]),
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider dataCreate
+ * @param array> $versionedErrors
+ * @param list $expectedTabs
+ * @return void
+ */
+ public function testCreate(array $versionedErrors, array $expectedTabs): void
+ {
+ $tabCreator = new TabCreator();
+ $tabs = $tabCreator->create($versionedErrors);
+ self::assertCount(count($expectedTabs), $tabs);
+
+ foreach ($tabs as $i => $tab) {
+ $expectedTab = $expectedTabs[$i];
+ self::assertSame($expectedTab->getTitle(), $tab->getTitle());
+ self::assertCount(count($expectedTab->getErrors()), $tab->getErrors());
+ foreach ($tab->getErrors() as $j => $error) {
+ $expectedError = $expectedTab->getErrors()[$j];
+ self::assertSame($expectedError->getMessage(), $error->getMessage());
+ self::assertSame($expectedError->getLine(), $error->getLine());
+ }
+ }
+ }
+
+}
diff --git a/issue-bot/tests/PostGeneratorTest.php b/issue-bot/tests/PostGeneratorTest.php
new file mode 100644
index 0000000000..06c30811c9
--- /dev/null
+++ b/issue-bot/tests/PostGeneratorTest.php
@@ -0,0 +1,133 @@
+, list, BotComment[], string|null}>
+ */
+ public function dataGeneratePosts(): iterable
+ {
+ $diff = '@@ @@
+-1: abc
++1: def
+';
+
+ $details = "| Line | Error |
+|---|---|
+| 1 | `def` |
+";
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [],
+ null,
+ null,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'def', null),
+ ])],
+ [],
+ $diff,
+ $details,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'def', null),
+ ])],
+ [
+ new BotComment('', new PlaygroundExample('', 'abc-def'), 'some diff'),
+ ],
+ $diff,
+ $details,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'def', null),
+ ])],
+ [
+ new BotComment('', new PlaygroundExample('', 'abc-def'), $diff),
+ ],
+ null,
+ null,
+ ];
+
+ yield [
+ 'abc-def',
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'abc', null),
+ ])],
+ [new PlaygroundResultTab('PHP 7.1', [
+ new PlaygroundError(1, 'Internal error', null),
+ ])],
+ [],
+ null,
+ null,
+ ];
+ }
+
+ /**
+ * @dataProvider dataGeneratePosts
+ * @param list $originalTabs
+ * @param list $currentTabs
+ * @param BotComment[] $botComments
+ */
+ public function testGeneratePosts(
+ string $hash,
+ array $originalTabs,
+ array $currentTabs,
+ array $botComments,
+ ?string $expectedDiff,
+ ?string $expectedDetails
+ ): void
+ {
+ $generator = new PostGenerator(new Differ(new UnifiedDiffOutputBuilder('')));
+ $text = $generator->createText(
+ $hash,
+ $originalTabs,
+ $currentTabs,
+ $botComments,
+ );
+ if ($text === null) {
+ self::assertNull($expectedDiff);
+ self::assertNull($expectedDetails);
+ return;
+ }
+
+ self::assertSame($expectedDiff, $text['diff']);
+ self::assertSame($expectedDetails, $text['details']);
+ }
+
+}
diff --git a/issue-bot/tmp/.gitignore b/issue-bot/tmp/.gitignore
new file mode 100644
index 0000000000..125e34294b
--- /dev/null
+++ b/issue-bot/tmp/.gitignore
@@ -0,0 +1,2 @@
+*
+!.*
diff --git a/patches/Buffer.patch b/patches/Buffer.patch
new file mode 100644
index 0000000000..1e50ecf112
--- /dev/null
+++ b/patches/Buffer.patch
@@ -0,0 +1,54 @@
+--- Buffer.php 2017-01-10 11:34:47.000000000 +0100
++++ Buffer.php 2021-10-30 16:36:22.000000000 +0200
+@@ -103,7 +103,7 @@
+ *
+ * @return \Iterator
+ */
+- public function getInnerIterator()
++ public function getInnerIterator(): ?\Iterator
+ {
+ return $this->_iterator;
+ }
+@@ -133,6 +133,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function current()
+ {
+ return $this->getBuffer()->current()[self::BUFFER_VALUE];
+@@ -143,6 +144,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function key()
+ {
+ return $this->getBuffer()->current()[self::BUFFER_KEY];
+@@ -153,7 +155,7 @@
+ *
+ * @return void
+ */
+- public function next()
++ public function next(): void
+ {
+ $innerIterator = $this->getInnerIterator();
+ $buffer = $this->getBuffer();
+@@ -204,7 +206,7 @@
+ *
+ * @return void
+ */
+- public function rewind()
++ public function rewind(): void
+ {
+ $innerIterator = $this->getInnerIterator();
+ $buffer = $this->getBuffer();
+@@ -228,7 +230,7 @@
+ *
+ * @return bool
+ */
+- public function valid()
++ public function valid(): bool
+ {
+ return
+ $this->getBuffer()->valid() &&
diff --git a/patches/Consistency.patch b/patches/Consistency.patch
new file mode 100644
index 0000000000..4409109b36
--- /dev/null
+++ b/patches/Consistency.patch
@@ -0,0 +1,45 @@
+--- Consistency.php 2017-05-02 14:18:12.000000000 +0200
++++ Consistency.php 2020-05-05 08:28:35.000000000 +0200
+@@ -319,42 +319,6 @@
+ $define('STREAM_CRYPTO_METHOD_ANY_CLIENT', 63);
+ }
+
+-if (!function_exists('curry')) {
+- /**
+- * Curry.
+- * Example:
+- * $c = curry('str_replace', …, …, 'foobar');
+- * var_dump($c('foo', 'baz')); // bazbar
+- * $c = curry('str_replace', 'foo', 'baz', …);
+- * var_dump($c('foobarbaz')); // bazbarbaz
+- * Nested curries also work:
+- * $c1 = curry('str_replace', …, …, 'foobar');
+- * $c2 = curry($c1, 'foo', …);
+- * var_dump($c2('baz')); // bazbar
+- * Obviously, as the first argument is a callable, we can combine this with
+- * \Hoa\Consistency\Xcallable ;-).
+- * The “…” character is the HORIZONTAL ELLIPSIS Unicode character (Unicode:
+- * 2026, UTF-8: E2 80 A6).
+- *
+- * @param mixed $callable Callable (two parts).
+- * @param ... ... Arguments.
+- * @return \Closure
+- */
+- function curry($callable)
+- {
+- $arguments = func_get_args();
+- array_shift($arguments);
+- $ii = array_keys($arguments, …, true);
+-
+- return function () use ($callable, $arguments, $ii) {
+- return call_user_func_array(
+- $callable,
+- array_replace($arguments, array_combine($ii, func_get_args()))
+- );
+- };
+- }
+-}
+-
+ /**
+ * Flex entity.
+ */
diff --git a/patches/DependencyChecker.patch b/patches/DependencyChecker.patch
new file mode 100644
index 0000000000..4902922537
--- /dev/null
+++ b/patches/DependencyChecker.patch
@@ -0,0 +1,13 @@
+--- src/DI/DependencyChecker.php 2023-10-02 21:58:38
++++ src/DI/DependencyChecker.php 2024-07-07 09:24:35
+@@ -147,7 +147,9 @@
+ $flip = array_flip($classes);
+ foreach ($functions as $name) {
+ if (strpos($name, '::')) {
+- $method = new ReflectionMethod($name);
++ $method = PHP_VERSION_ID < 80300
++ ? new ReflectionMethod($name)
++ : ReflectionMethod::createFromMethodName($name);
+ $class = $method->getDeclaringClass();
+ if (isset($flip[$class->name])) {
+ continue;
diff --git a/patches/File.patch b/patches/File.patch
new file mode 100644
index 0000000000..0732eb0e55
--- /dev/null
+++ b/patches/File.patch
@@ -0,0 +1,11 @@
+--- File.php 2017-07-11 09:42:15
++++ File.php 2024-08-26 23:13:27
+@@ -192,7 +192,7 @@
+ * @throws \Hoa\File\Exception\FileDoesNotExist
+ * @throws \Hoa\File\Exception
+ */
+- protected function &_open($streamName, Stream\Context $context = null)
++ protected function &_open($streamName, ?Stream\Context $context = null)
+ {
+ if (substr($streamName, 0, 4) == 'file' &&
+ false === is_dir(dirname($streamName))) {
diff --git a/patches/HoaException.patch b/patches/HoaException.patch
new file mode 100644
index 0000000000..bada616504
--- /dev/null
+++ b/patches/HoaException.patch
@@ -0,0 +1,11 @@
+--- Exception/Exception.php 2024-06-24 15:17:26
++++ Exception/Exception.php 2024-06-24 15:17:51
+@@ -37,7 +37,7 @@
+ namespace Hoa\Compiler\Exception;
+
+ use Hoa\Consistency;
+-use Hoa\Exception as HoaException;
++use Hoa\Exception\Exception as HoaException;
+
+ /**
+ * Class \Hoa\Compiler\Exception.
diff --git a/patches/Idle.patch b/patches/Idle.patch
new file mode 100644
index 0000000000..6f6f0dbe29
--- /dev/null
+++ b/patches/Idle.patch
@@ -0,0 +1,11 @@
+--- Idle.php 2017-01-16 08:53:27
++++ Idle.php 2024-08-26 23:18:04
+@@ -100,7 +100,7 @@
+ $message,
+ $code = 0,
+ $arguments = [],
+- \Exception $previous = null
++ ?\Exception $previous = null
+ ) {
+ $this->_tmpArguments = $arguments;
+ parent::__construct($message, $code, $previous);
diff --git a/patches/Invocation.patch b/patches/Invocation.patch
new file mode 100644
index 0000000000..a3e9e10965
--- /dev/null
+++ b/patches/Invocation.patch
@@ -0,0 +1,11 @@
+--- Llk/Rule/Invocation.php 2017-08-08 09:44:07
++++ Llk/Rule/Invocation.php 2024-08-26 23:11:25
+@@ -95,7 +95,7 @@
+ public function __construct(
+ $rule,
+ $data,
+- array $todo = null,
++ ?array $todo = null,
+ $depth = -1
+ ) {
+ $this->_rule = $rule;
diff --git a/patches/Lexer.patch b/patches/Lexer.patch
new file mode 100644
index 0000000000..b2d84ed6e9
--- /dev/null
+++ b/patches/Lexer.patch
@@ -0,0 +1,12 @@
+diff --git a/Llk/Lexer.php b/Llk/Lexer.php
+index 6851367..b8acf98 100644
+--- a/Llk/Lexer.php
++++ b/Llk/Lexer.php
+@@ -281,7 +281,7 @@ class Lexer
+ $offset
+ );
+
+- if (0 === $preg) {
++ if (0 === $preg || $preg === false) {
+ return null;
+ }
diff --git a/patches/Lookahead.patch b/patches/Lookahead.patch
new file mode 100644
index 0000000000..d17a378444
--- /dev/null
+++ b/patches/Lookahead.patch
@@ -0,0 +1,52 @@
+--- Lookahead.php 2017-01-10 11:34:47.000000000 +0100
++++ Lookahead.php 2021-10-30 16:35:30.000000000 +0200
+@@ -93,7 +93,7 @@
+ *
+ * @return \Iterator
+ */
+- public function getInnerIterator()
++ public function getInnerIterator(): ?\Iterator
+ {
+ return $this->_iterator;
+ }
+@@ -103,6 +103,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function current()
+ {
+ return $this->_current;
+@@ -113,6 +114,7 @@
+ *
+ * @return mixed
+ */
++ #[\ReturnTypeWillChange]
+ public function key()
+ {
+ return $this->_key;
+@@ -123,6 +125,7 @@
+ *
+ * @return void
+ */
++ #[\ReturnTypeWillChange]
+ public function next()
+ {
+ $innerIterator = $this->getInnerIterator();
+@@ -143,6 +146,7 @@
+ *
+ * @return void
+ */
++ #[\ReturnTypeWillChange]
+ public function rewind()
+ {
+ $out = $this->getInnerIterator()->rewind();
+@@ -156,7 +160,7 @@
+ *
+ * @return bool
+ */
+- public function valid()
++ public function valid(): bool
+ {
+ return $this->_valid;
+ }
diff --git a/patches/Node.patch b/patches/Node.patch
new file mode 100644
index 0000000000..d289251ebd
--- /dev/null
+++ b/patches/Node.patch
@@ -0,0 +1,46 @@
+--- Node/Node.php 2017-01-14 13:26:10.000000000 +0100
++++ Node/Node.php 2021-10-30 16:32:43.000000000 +0200
+@@ -108,7 +108,7 @@
+ * @return \Hoa\Protocol\Protocol
+ * @throws \Hoa\Protocol\Exception
+ */
+- public function offsetSet($name, $node)
++ public function offsetSet($name, $node): void
+ {
+ if (!($node instanceof self)) {
+ throw new Protocol\Exception(
+@@ -141,6 +141,7 @@
+ * @return \Hoa\Protocol\Protocol
+ * @throws \Hoa\Protocol\Exception
+ */
++ #[\ReturnTypeWillChange]
+ public function offsetGet($name)
+ {
+ if (!isset($this[$name])) {
+@@ -160,7 +161,7 @@
+ * @param string $name Node's name.
+ * @return bool
+ */
+- public function offsetExists($name)
++ public function offsetExists($name): bool
+ {
+ return true === array_key_exists($name, $this->_children);
+ }
+@@ -171,7 +172,7 @@
+ * @param string $name Node's name to remove.
+ * @return void
+ */
+- public function offsetUnset($name)
++ public function offsetUnset($name): void
+ {
+ unset($this->_children[$name]);
+
+@@ -365,7 +366,7 @@
+ *
+ * @return \ArrayIterator
+ */
+- public function getIterator()
++ public function getIterator(): \Traversable
+ {
+ return new \ArrayIterator($this->_children);
+ }
diff --git a/patches/PDO.patch b/patches/PDO.patch
new file mode 100644
index 0000000000..607a23fda2
--- /dev/null
+++ b/patches/PDO.patch
@@ -0,0 +1,11 @@
+--- PDO/PDO.php 2021-12-26 15:44:39.000000000 +0100
++++ PDO/PDO.php 2022-01-03 22:54:21.000000000 +0100
+@@ -1476,7 +1476,7 @@ namespace {
+ * @return array|false if one or more notifications is pending, returns a single row,
+ * with fields message and pid, otherwise FALSE.
+ */
+- public function pgsqlGetNotify($fetchMode = PDO::FETCH_DEFAULT, $timeoutMilliseconds = 0) {}
++ public function pgsqlGetNotify($fetchMode = 1, $timeoutMilliseconds = 0) {}
+
+ /**
+ * (PHP 5 >= 5.6.0, PHP 7, PHP 8)
diff --git a/patches/Read.patch b/patches/Read.patch
new file mode 100644
index 0000000000..ad9b64c445
--- /dev/null
+++ b/patches/Read.patch
@@ -0,0 +1,11 @@
+--- Read.php 2017-07-11 09:42:15
++++ Read.php 2024-08-26 23:09:54
+@@ -77,7 +77,7 @@
+ * @throws \Hoa\File\Exception\FileDoesNotExist
+ * @throws \Hoa\File\Exception
+ */
+- protected function &_open($streamName, Stream\Context $context = null)
++ protected function &_open($streamName, ?Stream\Context $context = null)
+ {
+ static $createModes = [
+ parent::MODE_READ
diff --git a/patches/ReflectionProperty.patch b/patches/ReflectionProperty.patch
new file mode 100644
index 0000000000..38d60b1bd4
--- /dev/null
+++ b/patches/ReflectionProperty.patch
@@ -0,0 +1,11 @@
+--- Reflection/ReflectionProperty.php 2023-09-07 12:59:56.000000000 +0200
++++ Reflection/ReflectionProperty.php 2023-09-15 13:24:07.900736741 +0200
+@@ -248,7 +248,7 @@
+ * Gets property type
+ *
+ * @link https://php.net/manual/en/reflectionproperty.gettype.php
+- * @return ReflectionNamedType|ReflectionUnionType|null Returns a {@see ReflectionType} if the
++ * @return ReflectionType|null Returns a {@see ReflectionType} if the
+ * property has a type, and {@see null} otherwise.
+ * @since 7.4
+ */
diff --git a/patches/Rule.patch b/patches/Rule.patch
new file mode 100644
index 0000000000..faf698a5ff
--- /dev/null
+++ b/patches/Rule.patch
@@ -0,0 +1,14 @@
+--- Llk/Rule/Rule.php 2017-08-08 09:44:07.000000000 +0200
++++ Llk/Rule/Rule.php 2021-10-29 16:42:12.000000000 +0200
+@@ -118,7 +118,10 @@
+ {
+ $this->setName($name);
+ $this->setChildren($children);
+- $this->setNodeId($nodeId);
++
++ if ($nodeId !== null) {
++ $this->setNodeId($nodeId);
++ }
+
+ return;
+ }
diff --git a/patches/Sender.patch b/patches/Sender.patch
new file mode 100644
index 0000000000..e01d1ff81c
--- /dev/null
+++ b/patches/Sender.patch
@@ -0,0 +1,11 @@
+--- src/Io/Sender.php 2024-03-27 18:20:46
++++ src/Io/Sender.php 2024-10-14 10:19:28
+@@ -48,7 +48,7 @@
+ * @param ConnectorInterface|null $connector
+ * @return self
+ */
+- public static function createFromLoop(LoopInterface $loop, ConnectorInterface $connector = null)
++ public static function createFromLoop(LoopInterface $loop, ?ConnectorInterface $connector = null)
+ {
+ if ($connector === null) {
+ $connector = new Connector(array(), $loop);
diff --git a/patches/SessionHandler.patch b/patches/SessionHandler.patch
new file mode 100644
index 0000000000..ba45ffc1b5
--- /dev/null
+++ b/patches/SessionHandler.patch
@@ -0,0 +1,20 @@
+--- session/SessionHandler.php 2021-11-04 14:27:30.000000000 +0100
++++ session/SessionHandler.php 2021-11-05 11:26:14.000000000 +0100
+@@ -147,7 +147,7 @@
+ *
+ */
+ #[TentativeType]
+- public function validateId(string $id): bool;
++ public function validateId($id): bool;
+
+ /**
+ * Update timestamp of a session
+@@ -163,7 +163,7 @@
+ * @return bool
+ */
+ #[TentativeType]
+- public function updateTimestamp(string $id, string $data): bool;
++ public function updateTimestamp($id, $data): bool;
+ }
+
+ /**
diff --git a/patches/Stream.patch b/patches/Stream.patch
new file mode 100644
index 0000000000..8dbb2e108e
--- /dev/null
+++ b/patches/Stream.patch
@@ -0,0 +1,32 @@
+--- Stream.php 2024-08-26 23:05:49
++++ Stream.php 2024-08-26 23:01:08
+@@ -192,7 +192,7 @@
+ * @return array
+ * @throws \Hoa\Stream\Exception
+ */
+- final private static function &_getStream(
++ private static function &_getStream(
+ $streamName,
+ Stream $handler,
+ $context = null
+@@ -250,7 +250,7 @@
+ * @return resource
+ * @throws \Hoa\Exception\Exception
+ */
+- abstract protected function &_open($streamName, Context $context = null);
++ abstract protected function &_open($streamName, ?Context $context = null);
+
+ /**
+ * Close the current stream.
+@@ -687,11 +687,6 @@
+ Consistency::flexEntity('Hoa\Stream\Stream');
+
+ /**
+- * Shutdown method.
+- */
+-Consistency::registerShutdownFunction(xcallable('Hoa\Stream\Stream::_Hoa_Stream'));
+-
+-/**
+ * Add the `hoa://Library/Stream` node. Should be use to reach/get an entry
+ * in the stream register.
+ */
diff --git a/patches/TreeNode.patch b/patches/TreeNode.patch
new file mode 100644
index 0000000000..39e7917def
--- /dev/null
+++ b/patches/TreeNode.patch
@@ -0,0 +1,14 @@
+--- Llk/TreeNode.php 2017-08-08 09:44:07
++++ Llk/TreeNode.php 2024-08-26 23:07:29
+@@ -95,9 +95,9 @@
+ */
+ public function __construct(
+ $id,
+- array $value = null,
++ ?array $value = null,
+ array $children = [],
+- self $parent = null
++ ?self $parent = null
+ ) {
+ $this->setId($id);
+
diff --git a/patches/Wrapper.patch b/patches/Wrapper.patch
new file mode 100644
index 0000000000..b8282376bd
--- /dev/null
+++ b/patches/Wrapper.patch
@@ -0,0 +1,27 @@
+--- Wrapper.php 2017-01-14 13:26:10.000000000 +0100
++++ Wrapper.php 2020-05-05 08:39:18.000000000 +0200
+@@ -582,24 +582,3 @@
+ stream_wrapper_register('hoa', Wrapper::class);
+
+ }
+-
+-namespace
+-{
+-
+-/**
+- * Alias of `Hoa\Protocol::resolve` method.
+- *
+- * @param string $path Path to resolve.
+- * @param bool $exists If `true`, try to find the first that exists,
+- * else return the first solution.
+- * @param bool $unfold Return all solutions instead of one.
+- * @return mixed
+- */
+-if (!function_exists('resolve')) {
+- function resolve($path, $exists = true, $unfold = false)
+- {
+- return Hoa\Protocol::getInstance()->resolve($path, $exists, $unfold);
+- }
+-}
+-
+-}
diff --git a/patches/cloudflare-ca.patch b/patches/cloudflare-ca.patch
new file mode 100644
index 0000000000..57f6cf5a77
--- /dev/null
+++ b/patches/cloudflare-ca.patch
@@ -0,0 +1,27 @@
+--- ca-bundle/res/cacert.pem 2024-06-18 13:50:00
++++ ca-bundle/res/cacert.pem 2024-06-18 13:50:29
+@@ -3579,3 +3579,24 @@
+ HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0
+ o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
+ -----END CERTIFICATE-----
++
++Cloudflare CA
++==================================
++-----BEGIN CERTIFICATE-----
++MIIC6zCCAkygAwIBAgIUI7b68p0pPrCBoW4ptlyvVcPItscwCgYIKoZIzj0EAwQw
++gY0xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T
++YW4gRnJhbmNpc2NvMRgwFgYDVQQKEw9DbG91ZGZsYXJlLCBJbmMxNzA1BgNVBAMT
++LkNsb3VkZmxhcmUgZm9yIFRlYW1zIEVDQyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
++HhcNMjAwMjA0MTYwNTAwWhcNMjUwMjAyMTYwNTAwWjCBjTELMAkGA1UEBhMCVVMx
++EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xGDAW
++BgNVBAoTD0Nsb3VkZmxhcmUsIEluYzE3MDUGA1UEAxMuQ2xvdWRmbGFyZSBmb3Ig
++VGVhbXMgRUNDIENlcnRpZmljYXRlIEF1dGhvcml0eTCBmzAQBgcqhkjOPQIBBgUr
++gQQAIwOBhgAEAVdXsX8tpA9NAQeEQalvUIcVaFNDvGsR69ysZxOraRWNGHLfq1mi
++P6o3wtmtx/C2OXG01Cw7UFJbKl5MEDxnT2KoAdFSynSJOF2NDoe5LoZHbUW+yR3X
++FDl+MF6JzZ590VLGo6dPBf06UsXbH7PvHH2XKtFt8bBXVNMa5a21RdmpD0Pho0Uw
++QzAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBAjAdBgNVHQ4EFgQU
++YBcQng1AEMMNteuRDAMG0/vgFe0wCgYIKoZIzj0EAwQDgYwAMIGIAkIBQU5OTA2h
++YqmFk8paan5ezHVLcmcucsfYw4L/wmeEjCkczRmCVNm6L86LjhWU0v0wER0e+lHO
++3efvjbsu8gIGSagCQgEBnyYMP9gwg8l96QnQ1khFA1ljFlnqc2XgJHDSaAJC0gdz
+++NV3JMeWaD2Rb32jc9r6/a7xY0u0ByqxBQ1OQ0dt7A==
++-----END CERTIFICATE-----
diff --git a/patches/dom_c.patch b/patches/dom_c.patch
new file mode 100644
index 0000000000..9e542c826d
--- /dev/null
+++ b/patches/dom_c.patch
@@ -0,0 +1,17 @@
+--- dom/dom_c.php 2024-01-02 12:04:54
++++ dom/dom_c.php 2024-01-21 10:41:56
+@@ -1347,6 +1347,14 @@
+ */
+ class DOMNamedNodeMap implements IteratorAggregate, Countable
+ {
++
++ /**
++ * The number of nodes in the map. The range of valid child node indices is 0 to length - 1 inclusive.
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $length;
+ /**
+ * Retrieves a node specified by name
+ * @link https://php.net/manual/en/domnamednodemap.getnameditem.php
diff --git a/patches/paratest.patch b/patches/paratest.patch
new file mode 100644
index 0000000000..f2091828ff
--- /dev/null
+++ b/patches/paratest.patch
@@ -0,0 +1,35 @@
+--- src/Runners/PHPUnit/Worker/BaseWorker.php 2020-02-07 23:07:07.000000000 +0100
++++ src/Runners/PHPUnit/Worker/BaseWorker.php 2022-03-27 17:35:45.000000000 +0200
+@@ -28,17 +28,18 @@
+ array $parameters = [],
+ ?Options $options = null
+ ) {
+- $bin = 'PARATEST=1 ';
++ $env = getenv();
++ $env['PARATEST'] = 1;
+ if (\is_numeric($token)) {
+- $bin .= 'XDEBUG_CONFIG="true" ';
+- $bin .= "TEST_TOKEN=$token ";
++ $env['XDEBUG_CONFIG'] = 'true';
++ $env['TEST_TOKEN'] = $token;
+ }
+ if ($uniqueToken) {
+- $bin .= "UNIQUE_TEST_TOKEN=$uniqueToken ";
++ $env['UNIQUE_TEST_TOKEN'] = $uniqueToken;
+ }
+ $finder = new PhpExecutableFinder();
+ $phpExecutable = $finder->find();
+- $bin .= "$phpExecutable ";
++ $bin = "$phpExecutable ";
+ if ($options && $options->passthruPhp) {
+ $bin .= $options->passthruPhp . ' ';
+ }
+@@ -50,7 +51,7 @@
+ if ($options && $options->verbose) {
+ echo "Starting WrapperWorker via: $bin\n";
+ }
+- $process = \proc_open($bin, self::$descriptorspec, $pipes);
++ $process = \proc_open($bin, self::$descriptorspec, $pipes, null, $env);
+ $this->proc = \is_resource($process) ? $process : null;
+ $this->pipes = $pipes;
+ }
diff --git a/patches/xmlreader.patch b/patches/xmlreader.patch
new file mode 100644
index 0000000000..7be168133f
--- /dev/null
+++ b/patches/xmlreader.patch
@@ -0,0 +1,122 @@
+--- xmlreader/xmlreader.php 2024-01-21 10:44:31
++++ xmlreader/xmlreader.php 2024-01-21 10:48:24
+@@ -28,7 +28,119 @@
+ */
+ class XMLReader
+ {
++ /**
++ * The number of attributes on the node
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $attributeCount;
++
++ /**
++ * The base URI of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $baseURI;
++
++ /**
++ * Depth of the node in the tree, starting at 0
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $depth;
++
++ /**
++ * Indicates if node has attributes
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $hasAttributes;
++
++ /**
++ * Indicates if node has a text value
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $hasValue;
++
++ /**
++ * Indicates if attribute is defaulted from DTD
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $isDefault;
++
++ /**
++ * Indicates if node is an empty element tag
++ * @var bool
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $isEmptyElement;
++
++ /**
++ * The local name of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $localName;
++
+ /**
++ * The qualified name of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $name;
++
++ /**
++ * The URI of the namespace associated with the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $namespaceURI;
++
++ /**
++ * The node type for the node
++ * @var int
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $nodeType;
++
++ /**
++ * The prefix of the namespace associated with the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $prefix;
++
++ /**
++ * The text value of the node
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $value;
++
++ /**
++ * The xml:lang scope which the node resides
++ * @var string
++ * @readonly
++ */
++ #[PhpStormStubsElementAvailable(from: '8.1')]
++ public $xmlLang;
++
++ /**
+ * No node type
+ */
+ public const NONE = 0;
diff --git a/phpcs.xml b/phpcs.xml
index 64222d1751..fa9198745f 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,63 +1,120 @@
-
+
+
+
+
+
+
+
+
+ bin
+ src
+ tests
+ compiler/src
+ compiler/tests
+ apigen/src
+ changelog-generator/src
+ changelog-generator/run.php
+ issue-bot/src
+ issue-bot/console.php
+
+
-
+
-
+
-
-
+
+
+
+
-
+
+
-
+
-
+
+
+ src/Rules/Whitespace/FileWhitespaceRule.php
+
+
+ 10
+
-
+
+
-
+
+
+ 10
+
+
-
+
-
+
+
+ 10
src/Command/CommandHelper.php
+ src/Testing/PHPStanTestCase.php
tests
-
- src/Command/AnalyseApplication.php
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -71,30 +128,94 @@
-
-
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
- tests/*/data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ src/Type/TypeResult.php
+
+ compiler/tests/*/data/
+ tests/*/Fixture/
+ tests/*/cache/
+ tests/*/data/
+ tests/*/traits/
+ tests/PHPStan/Analyser/nsrt/
+ tests/e2e/anon-class/
+ tests/e2e/magic-setter/
tests/e2e/resultCache_1.php
tests/e2e/resultCache_2.php
tests/e2e/resultCache_3.php
- tests/*/traits
- tests/tmp
- tests/notAutoloaded
- src/Reflection/BetterReflection/BetterReflectionSourceLocatorFactory.php
- src/Reflection/SignatureMap/functionMap.php
- src/Reflection/SignatureMap/functionMetadata.php
+ tests/notAutoloaded/
+ tests/tmp/
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index bc4ee43f14..035be525fe 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -1,247 +1,1987 @@
parameters:
ignoreErrors:
-
- message: "#^Strict comparison using \\=\\=\\= between PhpParser\\\\Node\\\\Expr\\\\ArrayItem and null will always evaluate to false\\.$#"
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Analyser/MutatingScope.php
+ path: build/PHPStan/Build/ContainerDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Method PHPStan\\Analyser\\AnalyserResultFinalizer\:\:finalize\(\) throws checked exception Throwable but it''s missing from the PHPDoc @throws tag\.$#'
+ identifier: missingType.checkedException
+ count: 1
+ path: src/Analyser/AnalyserResultFinalizer.php
-
- message: "#^Only numeric types are allowed in pre\\-increment, bool\\|float\\|int\\|string\\|null given\\.$#"
+ message: '#^Cannot assign offset ''realCount'' to array\\|string\.$#'
+ identifier: offsetAssign.dimType
count: 1
+ path: src/Analyser/Ignore/IgnoredErrorHelperResult.php
+
+ -
+ message: '#^Casting to string something that''s already string\.$#'
+ identifier: cast.useless
+ count: 3
+ path: src/Analyser/MutatingScope.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Analyser/MutatingScope.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
path: src/Analyser/MutatingScope.php
-
- message: "#^Only numeric types are allowed in pre\\-decrement, bool\\|float\\|int\\|string\\|null given\\.$#"
+ message: '#^Only numeric types are allowed in pre\-increment, float\|int\|string\|null given\.$#'
+ identifier: preInc.nonNumeric
count: 1
path: src/Analyser/MutatingScope.php
-
- message: "#^Anonymous function has an unused use \\$container\\.$#"
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Analyser/NodeScopeResolver.php
+
+ -
+ message: '#^Parameter \#2 \$node of method PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\NodeToReflection\:\:__invoke\(\) expects PhpParser\\Node\\Expr\\ArrowFunction\|PhpParser\\Node\\Expr\\Closure\|PhpParser\\Node\\Expr\\FuncCall\|PhpParser\\Node\\Stmt\\Class_\|PhpParser\\Node\\Stmt\\Const_\|PhpParser\\Node\\Stmt\\Enum_\|PhpParser\\Node\\Stmt\\Function_\|PhpParser\\Node\\Stmt\\Interface_\|PhpParser\\Node\\Stmt\\Trait_, PhpParser\\Node\\Stmt\\ClassLike given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Analyser/NodeScopeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Analyser/RicherScopeGetTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Analyser/TypeSpecifier.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Analyser/TypeSpecifier.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Analyser/TypeSpecifier.php
+
+ -
+ message: '#^Template type TNodeType is declared as covariant, but occurs in contravariant position in parameter node of method PHPStan\\Collectors\\Collector\:\:processNode\(\)\.$#'
+ identifier: generics.variance
+ count: 1
+ path: src/Collectors/Collector.php
+
+ -
+ message: '#^Method PHPStan\\Collectors\\Registry\:\:__construct\(\) has parameter \$collectors with generic interface PHPStan\\Collectors\\Collector but does not specify its types\: TNodeType, TValue$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Collectors/Registry.php
+
+ -
+ message: '#^Property PHPStan\\Collectors\\Registry\:\:\$cache with generic interface PHPStan\\Collectors\\Collector does not specify its types\: TNodeType, TValue$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Collectors/Registry.php
+
+ -
+ message: '#^Property PHPStan\\Collectors\\Registry\:\:\$collectors with generic interface PHPStan\\Collectors\\Collector does not specify its types\: TNodeType, TValue$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Collectors/Registry.php
+
+ -
+ message: '#^Anonymous function has an unused use \$container\.$#'
+ identifier: closure.unusedUse
+ count: 1
+ path: src/Command/CommandHelper.php
+
+ -
+ message: '#^Call to static method expand\(\) of internal class Nette\\DI\\Helpers from outside its root namespace Nette\.$#'
+ identifier: staticMethod.internalClass
count: 2
path: src/Command/CommandHelper.php
-
- message: "#^Parameter \\#1 \\$headers \\(array\\\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$headers \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\StyleInterface\\:\\:table\\(\\)$#"
+ message: '#^Parameter \#1 \$path of function dirname expects string, string\|false given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Command/CommandHelper.php
+
+ -
+ message: '#^Static property PHPStan\\Command\\CommandHelper\:\:\$reservedMemory is never read, only written\.$#'
+ identifier: property.onlyWritten
+ count: 1
+ path: src/Command/CommandHelper.php
+
+ -
+ message: '#^Call to static method escape\(\) of internal class Nette\\DI\\Helpers from outside its root namespace Nette\.$#'
+ identifier: staticMethod.internalClass
+ count: 4
+ path: src/Command/ErrorFormatter/BaselineNeonErrorFormatter.php
+
+ -
+ message: '#^Call to static method escape\(\) of internal class Nette\\DI\\Helpers from outside its root namespace Nette\.$#'
+ identifier: staticMethod.internalClass
+ count: 5
+ path: src/Command/ErrorFormatter/BaselinePhpErrorFormatter.php
+
+ -
+ message: '#^Parameter \#1 \$headers \(array\\) of method PHPStan\\Command\\ErrorsConsoleStyle\:\:table\(\) should be contravariant with parameter \$headers \(array\) of method Symfony\\Component\\Console\\Style\\StyleInterface\:\:table\(\)$#'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Parameter \\#1 \\$headers \\(array\\\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$headers \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\SymfonyStyle\\:\\:table\\(\\)$#"
+ message: '#^Parameter \#1 \$headers \(array\\) of method PHPStan\\Command\\ErrorsConsoleStyle\:\:table\(\) should be contravariant with parameter \$headers \(array\) of method Symfony\\Component\\Console\\Style\\SymfonyStyle\:\:table\(\)$#'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Parameter \\#2 \\$rows \\(array\\\\>\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$rows \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\StyleInterface\\:\\:table\\(\\)$#"
+ message: '#^Parameter \#2 \$rows \(array\\>\) of method PHPStan\\Command\\ErrorsConsoleStyle\:\:table\(\) should be contravariant with parameter \$rows \(array\) of method Symfony\\Component\\Console\\Style\\StyleInterface\:\:table\(\)$#'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Parameter \\#2 \\$rows \\(array\\\\>\\) of method PHPStan\\\\Command\\\\ErrorsConsoleStyle\\:\\:table\\(\\) should be contravariant with parameter \\$rows \\(array\\) of method Symfony\\\\Component\\\\Console\\\\Style\\\\SymfonyStyle\\:\\:table\\(\\)$#"
+ message: '#^Parameter \#2 \$rows \(array\\>\) of method PHPStan\\Command\\ErrorsConsoleStyle\:\:table\(\) should be contravariant with parameter \$rows \(array\) of method Symfony\\Component\\Console\\Style\\SymfonyStyle\:\:table\(\)$#'
+ identifier: method.childParameterType
count: 1
path: src/Command/ErrorsConsoleStyle.php
-
- message: "#^Fetching class constant PREVENT_MERGING of deprecated class Nette\\\\DI\\\\Config\\\\Helpers\\.$#"
+ message: '#^Call to static method expand\(\) of internal class Nette\\DI\\Helpers from outside its root namespace Nette\.$#'
+ identifier: staticMethod.internalClass
+ count: 1
+ path: src/DependencyInjection/ContainerFactory.php
+
+ -
+ message: '#^Call to static method merge\(\) of internal class Nette\\Schema\\Helpers from outside its root namespace Nette\.$#'
+ identifier: staticMethod.internalClass
+ count: 2
+ path: src/DependencyInjection/ContainerFactory.php
+
+ -
+ message: '#^Variable method call on Nette\\Schema\\Elements\\AnyOf\|Nette\\Schema\\Elements\\Structure\|Nette\\Schema\\Elements\\Type\.$#'
+ identifier: method.dynamicName
+ count: 1
+ path: src/DependencyInjection/ContainerFactory.php
+
+ -
+ message: '#^Variable static method call on Nette\\Schema\\Expect\.$#'
+ identifier: staticMethod.dynamicName
+ count: 1
+ path: src/DependencyInjection/ContainerFactory.php
+
+ -
+ message: '#^Fetching class constant PREVENT_MERGING of deprecated class Nette\\DI\\Config\\Helpers\.$#'
+ identifier: classConstant.deprecatedClass
count: 1
path: src/DependencyInjection/NeonAdapter.php
-
- message: "#^Variable static method call on Nette\\\\Schema\\\\Expect\\.$#"
+ message: '#^Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/DependencyInjection/ParametersSchemaExtension.php
+ path: src/Diagnose/PHPStanDiagnoseExtension.php
-
- message: "#^Variable method call on Nette\\\\Schema\\\\Elements\\\\AnyOf\\|Nette\\\\Schema\\\\Elements\\\\Structure\\|Nette\\\\Schema\\\\Elements\\\\Type\\.$#"
+ message: '#^Parameter \#1 \$path of function dirname expects string, string\|false given\.$#'
+ identifier: argument.type
count: 1
- path: src/DependencyInjection/ParametersSchemaExtension.php
+ path: src/Diagnose/PHPStanDiagnoseExtension.php
-
- message: "#^Variable method call on PHPStan\\\\Reflection\\\\ClassReflection\\.$#"
- count: 2
- path: src/PhpDoc/PhpDocBlock.php
+ message: '#^Access to property \$id of internal class Symfony\\Polyfill\\Php80\\PhpToken from outside its root namespace Symfony\.$#'
+ identifier: property.internalClass
+ count: 1
+ path: src/Parser/RichParser.php
+
+ -
+ message: '#^Access to property \$line of internal class Symfony\\Polyfill\\Php80\\PhpToken from outside its root namespace Symfony\.$#'
+ identifier: property.internalClass
+ count: 4
+ path: src/Parser/RichParser.php
+
+ -
+ message: '#^Access to property \$text of internal class Symfony\\Polyfill\\Php80\\PhpToken from outside its root namespace Symfony\.$#'
+ identifier: property.internalClass
+ count: 3
+ path: src/Parser/RichParser.php
-
- message: "#^Variable static method call on PHPStan\\\\PhpDoc\\\\PhpDocBlock\\.$#"
+ message: '#^Call to function method_exists\(\) with PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode and ''getParamOutTypeTagV…'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
count: 1
- path: src/PhpDoc/PhpDocBlock.php
+ path: src/PhpDoc/PhpDocNodeResolver.php
-
- message: "#^Return type \\(PHPStan\\\\PhpDoc\\\\Tag\\\\ParamTag\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\ParamTag\\:\\:withType\\(\\) should be covariant with return type \\(static\\(PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\)\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\:\\:withType\\(\\)$#"
+ message: '#^Call to function method_exists\(\) with PHPStan\\PhpDocParser\\Ast\\PhpDoc\\PhpDocNode and ''getSelfOutTypeTagVa…'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
count: 1
- path: src/PhpDoc/Tag/ParamTag.php
+ path: src/PhpDoc/PhpDocNodeResolver.php
-
- message: "#^Return type \\(PHPStan\\\\PhpDoc\\\\Tag\\\\ReturnTag\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\ReturnTag\\:\\:withType\\(\\) should be covariant with return type \\(static\\(PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\)\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\:\\:withType\\(\\)$#"
+ message: '#^Method PHPStan\\PhpDoc\\ResolvedPhpDocBlock\:\:getNameScope\(\) should return PHPStan\\Analyser\\NameScope but returns PHPStan\\Analyser\\NameScope\|null\.$#'
+ identifier: return.type
count: 1
- path: src/PhpDoc/Tag/ReturnTag.php
+ path: src/PhpDoc/ResolvedPhpDocBlock.php
-
- message: "#^Return type \\(PHPStan\\\\PhpDoc\\\\Tag\\\\VarTag\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\VarTag\\:\\:withType\\(\\) should be covariant with return type \\(static\\(PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\)\\) of method PHPStan\\\\PhpDoc\\\\Tag\\\\TypedTag\\:\\:withType\\(\\)$#"
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/PhpDoc/Tag/VarTag.php
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Only booleans are allowed in a negated boolean, int\\|false given\\.$#"
+ message: '#^Doing instanceof PHPStan\\Type\\CallableType is error\-prone and deprecated\. Use Type\:\:isCallable\(\) and Type\:\:getCallableParametersAcceptors\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Parameter \\#3 \\$subject of function preg_replace expects array\\|string, string\\|null given\\.$#"
- count: 4
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IterableType is error\-prone and deprecated\. Use Type\:\:isIterable\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/PhpDoc/TypeNodeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/PhpDoc/TypeNodeResolver.php
-
- message: "#^Parameter \\#1 \\$str of function substr expects string, string\\|null given\\.$#"
+ message: '#^Dead catch \- PHPStan\\BetterReflection\\Identifier\\Exception\\InvalidIdentifierName is never thrown in the try block\.$#'
+ identifier: catch.neverThrown
count: 3
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/BetterReflectionProvider.php
-
- message: "#^Parameter \\#1 \\$haystack of function strrpos expects string, string\\|null given\\.$#"
+ message: '#^Dead catch \- PHPStan\\BetterReflection\\NodeCompiler\\Exception\\UnableToCompileNode is never thrown in the try block\.$#'
+ identifier: catch.neverThrown
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/BetterReflectionProvider.php
-
- message: "#^Only booleans are allowed in an if condition, int\\|false given\\.$#"
+ message: '#^Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
-
- message: "#^Parameter \\#2 \\$subject of function preg_match expects string, string\\|null given\\.$#"
+ message: '#^Creating new ReflectionFunction is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
-
- message: "#^Parameter \\#2 \\$subject of function preg_match_all expects string, string\\|null given\\.$#"
+ message: '#^Parameter \#2 \$node of method PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\NodeToReflection\:\:__invoke\(\) expects PhpParser\\Node\\Expr\\ArrowFunction\|PhpParser\\Node\\Expr\\Closure\|PhpParser\\Node\\Expr\\FuncCall\|PhpParser\\Node\\Stmt\\Class_\|PhpParser\\Node\\Stmt\\Const_\|PhpParser\\Node\\Stmt\\Enum_\|PhpParser\\Node\\Stmt\\Function_\|PhpParser\\Node\\Stmt\\Interface_\|PhpParser\\Node\\Stmt\\Trait_, PhpParser\\Node\\Stmt\\ClassLike given\.$#'
+ identifier: argument.type
count: 1
- path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
+ path: src/Reflection/BetterReflection/SourceLocator/AutoloadSourceLocator.php
+
+ -
+ message: '#^Method PHPStan\\Reflection\\BetterReflection\\SourceLocator\\FileReadTrapStreamWrapper\:\:invokeWithRealFileStreamWrapper\(\) has parameter \$cb with no signature specified for callable\.$#'
+ identifier: missingType.callable
+ count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/FileReadTrapStreamWrapper.php
-
- message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#"
+ message: '#^Parameter \#2 \$node of method PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\NodeToReflection\:\:__invoke\(\) expects PhpParser\\Node\\Expr\\ArrowFunction\|PhpParser\\Node\\Expr\\Closure\|PhpParser\\Node\\Expr\\FuncCall\|PhpParser\\Node\\Stmt\\Class_\|PhpParser\\Node\\Stmt\\Const_\|PhpParser\\Node\\Stmt\\Enum_\|PhpParser\\Node\\Stmt\\Function_\|PhpParser\\Node\\Stmt\\Interface_\|PhpParser\\Node\\Stmt\\Trait_, PhpParser\\Node\\Expr\\FuncCall\|PhpParser\\Node\\Stmt\\ClassLike\|PhpParser\\Node\\Stmt\\Const_\|PhpParser\\Node\\Stmt\\Function_ given\.$#'
+ identifier: argument.type
count: 1
path: src/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocator.php
-
- message: "#^Property PHPStan\\\\Reflection\\\\ClassReflection\\:\\:\\$reflection with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Parameter \#2 \$node of method PHPStan\\BetterReflection\\SourceLocator\\Ast\\Strategy\\NodeToReflection\:\:__invoke\(\) expects PhpParser\\Node\\Expr\\ArrowFunction\|PhpParser\\Node\\Expr\\Closure\|PhpParser\\Node\\Expr\\FuncCall\|PhpParser\\Node\\Stmt\\Class_\|PhpParser\\Node\\Stmt\\Const_\|PhpParser\\Node\\Stmt\\Enum_\|PhpParser\\Node\\Stmt\\Function_\|PhpParser\\Node\\Stmt\\Interface_\|PhpParser\\Node\\Stmt\\Trait_, PhpParser\\Node\\Stmt\\ClassLike given\.$#'
+ identifier: argument.type
+ count: 2
+ path: src/Reflection/BetterReflection/SourceLocator/OptimizedSingleFileSourceLocator.php
+
+ -
+ message: '#^Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
count: 1
- path: src/Reflection/ClassReflection.php
+ path: src/Reflection/BetterReflection/SourceLocator/ReflectionClassSourceLocator.php
+
+ -
+ message: '#^Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/RewriteClassAliasSourceLocator.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\ClassReflection\\:\\:__construct\\(\\) has parameter \\$reflection with generic class ReflectionClass but does not specify its types\\: T$#"
+ message: '#^Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
count: 1
+ path: src/Reflection/BetterReflection/SourceLocator/SkipClassAliasSourceLocator.php
+
+ -
+ message: '''
+ #^Call to deprecated method isSubclassOf\(\) of class PHPStan\\Reflection\\ClassReflection\:
+ Use isSubclassOfClass instead\.$#
+ '''
+ identifier: method.deprecated
+ count: 1
+ path: src/Reflection/ClassReflection.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
path: src/Reflection/ClassReflection.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\ClassReflection\\:\\:getNativeReflection\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
path: src/Reflection/ClassReflection.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\ClassReflection\\:\\:getCacheKey\\(\\) should return string but returns string\\|null\\.$#"
+ message: '#^Method PHPStan\\Reflection\\ClassReflection\:\:getCacheKey\(\) should return string but returns string\|null\.$#'
+ identifier: return.type
count: 1
path: src/Reflection/ClassReflection.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\BuiltinMethodReflection\\:\\:getDeclaringClass\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Binary operation "&" between bool\|float\|int\|string\|null and bool\|float\|int\|string\|null results in an error\.$#'
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Binary operation "\*" between bool\|float\|int\|string\|null and bool\|float\|int\|string\|null results in an error\.$#'
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Binary operation "\+" between bool\|float\|int\|string\|null and bool\|float\|int\|string\|null results in an error\.$#'
+ identifier: binaryOp.invalid
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Binary operation "\-" between bool\|float\|int\|string\|null and bool\|float\|int\|string\|null results in an error\.$#'
+ identifier: binaryOp.invalid
count: 1
- path: src/Reflection/Php/BuiltinMethodReflection.php
+ path: src/Reflection/InitializerExprTypeResolver.php
-
- message: "#^Property PHPStan\\\\Reflection\\\\Php\\\\FakeBuiltinMethodReflection\\:\\:\\$declaringClass with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Binary operation "\^" between bool\|float\|int\|string\|null and bool\|float\|int\|string\|null results in an error\.$#'
+ identifier: binaryOp.invalid
count: 1
- path: src/Reflection/Php/FakeBuiltinMethodReflection.php
+ path: src/Reflection/InitializerExprTypeResolver.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\FakeBuiltinMethodReflection\\:\\:__construct\\(\\) has parameter \\$declaringClass with generic class ReflectionClass but does not specify its types\\: T$#"
+ message: '#^Binary operation "\|" between bool\|float\|int\|string\|null and bool\|float\|int\|string\|null results in an error\.$#'
+ identifier: binaryOp.invalid
count: 1
- path: src/Reflection/Php/FakeBuiltinMethodReflection.php
+ path: src/Reflection/InitializerExprTypeResolver.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\FakeBuiltinMethodReflection\\:\\:getDeclaringClass\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 22
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 10
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^PHPDoc tag @var with type float\|int is not subtype of native type int\.$#'
+ identifier: varTag.nativeType
+ count: 1
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^PHPDoc tag @var with type float\|int is not subtype of type int\.$#'
+ identifier: varTag.type
+ count: 4
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^PHPDoc tag @var with type float\|int\|null is not subtype of type int\|null\.$#'
+ identifier: varTag.type
+ count: 6
+ path: src/Reflection/InitializerExprTypeResolver.php
+
+ -
+ message: '#^Creating new PHPStan\\Php8StubsMap is not covered by backward compatibility promise\. The class might change in a minor PHPStan version\.$#'
+ identifier: phpstanApi.constructor
+ count: 1
+ path: src/Reflection/SignatureMap/Php8SignatureMapProvider.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Classes/ImpossibleInstanceOfRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Classes/RequireImplementsRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 6
+ path: src/Rules/Comparison/BooleanAndConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/BooleanNotConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 6
+ path: src/Rules/Comparison/BooleanOrConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/DoWhileLoopConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/ElseIfConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/IfConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\TypeWithClassName is error\-prone and deprecated\. Use Type\:\:getObjectClassNames\(\) or Type\:\:getObjectClassReflections\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/ImpossibleCheckTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Rules/Comparison/LogicalXorConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Rules/Comparison/MatchExpressionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/NumberComparisonOperatorsConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/StrictComparisonOfDifferentTypesRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Rules/Comparison/TernaryOperatorConstantConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/WhileLoopAlwaysFalseConditionRule.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Comparison/WhileLoopAlwaysTrueConditionRule.php
+
+ -
+ message: '#^Function class_implements\(\) is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Rules/DirectRegistry.php
+
+ -
+ message: '#^Function class_parents\(\) is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Rules/DirectRegistry.php
+
+ -
+ message: '#^Method PHPStan\\Rules\\DirectRegistry\:\:__construct\(\) has parameter \$rules with generic interface PHPStan\\Rules\\Rule but does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Rules/DirectRegistry.php
+
+ -
+ message: '#^Property PHPStan\\Rules\\DirectRegistry\:\:\$cache with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Rules/DirectRegistry.php
+
+ -
+ message: '#^Property PHPStan\\Rules\\DirectRegistry\:\:\$rules with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Rules/DirectRegistry.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Generics/GenericAncestorsCheck.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Rules/Generics/TemplateTypeCheck.php
+
+ -
+ message: '#^Function class_implements\(\) is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Rules/LazyRegistry.php
+
+ -
+ message: '#^Function class_parents\(\) is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Rules/LazyRegistry.php
+
+ -
+ message: '#^Method PHPStan\\Rules\\LazyRegistry\:\:getRulesFromContainer\(\) return type with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: src/Rules/LazyRegistry.php
+
+ -
+ message: '#^Property PHPStan\\Rules\\LazyRegistry\:\:\$cache with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
count: 1
- path: src/Reflection/Php/FakeBuiltinMethodReflection.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\NativeBuiltinMethodReflection\\:\\:getDeclaringClass\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Property PHPStan\\Rules\\LazyRegistry\:\:\$rules with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
count: 1
- path: src/Reflection/Php/NativeBuiltinMethodReflection.php
+ path: src/Rules/LazyRegistry.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\PhpClassReflectionExtension\\:\\:collectTraits\\(\\) has parameter \\$class with generic class ReflectionClass but does not specify its types\\: T$#"
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Reflection/Php/PhpClassReflectionExtension.php
+ path: src/Rules/Methods/MethodParameterComparisonHelper.php
-
- message: "#^Method PHPStan\\\\Reflection\\\\Php\\\\PhpClassReflectionExtension\\:\\:collectTraits\\(\\) return type with generic class ReflectionClass does not specify its types\\: T$#"
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Reflection/Php/PhpClassReflectionExtension.php
+ path: src/Rules/Methods/MethodParameterComparisonHelper.php
-
- message: "#^Property PHPStan\\\\Rules\\\\Registry\\:\\:\\$rules with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ message: '#^Doing instanceof PHPStan\\Type\\IterableType is error\-prone and deprecated\. Use Type\:\:isIterable\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Registry.php
+ path: src/Rules/Methods/MethodParameterComparisonHelper.php
-
- message: "#^Property PHPStan\\\\Rules\\\\Registry\\:\\:\\$cache with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Registry.php
+ path: src/Rules/Methods/StaticMethodCallCheck.php
-
- message: "#^Method PHPStan\\\\Rules\\\\Registry\\:\\:__construct\\(\\) has parameter \\$rules with generic interface PHPStan\\\\Rules\\\\Rule but does not specify its types\\: TNodeType$#"
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: src/Rules/Registry.php
+ path: src/Rules/PhpDoc/VarTagTypeRuleHelper.php
-
- message: "#^Cannot call method getActiveTemplateTypeMap\\(\\) on PHPStan\\\\Reflection\\\\ClassReflection\\|null\\.$#"
+ message: '#^Access to an undefined property T of PHPStan\\Rules\\RuleError\:\:\$tip\.$#'
+ identifier: property.notFound
count: 2
- path: src/Type/Generic/GenericObjectType.php
+ path: src/Rules/RuleErrorBuilder.php
-
- message: "#^Unreachable statement \\- code above always terminates\\.$#"
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/AnalyserTest.php
+ path: src/Rules/RuleLevelHelper.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\AnonymousClassNameRule implements generic interface PHPStan\\\\Rules\\\\Rule but does not specify its types\\: TNodeType$#"
+ message: '''
+ #^Call to deprecated method assertFileNotExists\(\) of class PHPUnit\\Framework\\Assert\:
+ https\://github\.com/sebastianbergmann/phpunit/issues/4077$#
+ '''
+ identifier: staticMethod.deprecated
count: 1
- path: tests/PHPStan/Analyser/AnonymousClassNameRule.php
+ path: src/Testing/LevelsTestCase.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\AnonymousClassNameRuleTest extends generic class PHPStan\\\\Testing\\\\RuleTestCase but does not specify its types\\: TRule$#"
+ message: '#^Call to function method_exists\(\) with ''PHPUnit\\\\Framework\\\\TestCase'' and ''assertFileDoesNotEx…'' will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
count: 1
- path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+ path: src/Testing/LevelsTestCase.php
+
+ -
+ message: '#^Catching internal class PHPUnit\\Framework\\AssertionFailedError\.$#'
+ identifier: catch.internalClass
+ count: 2
+ path: src/Testing/LevelsTestCase.php
-
- message: "#^Method PHPStan\\\\Analyser\\\\AnonymousClassNameRuleTest\\:\\:getRule\\(\\) return type with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ message: '#^Return type of method PHPStan\\Testing\\LevelsTestCase\:\:compareFiles\(\) has typehint with internal class PHPUnit\\Framework\\AssertionFailedError\.$#'
+ identifier: return.internalClass
count: 1
- path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+ path: src/Testing/LevelsTestCase.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\EvaluationOrderRule implements generic interface PHPStan\\\\Rules\\\\Rule but does not specify its types\\: TNodeType$#"
+ message: '#^Anonymous function has an unused use \$container\.$#'
+ identifier: closure.unusedUse
count: 1
- path: tests/PHPStan/Analyser/EvaluationOrderRule.php
+ path: src/Testing/PHPStanTestCase.php
-
- message: "#^Class PHPStan\\\\Analyser\\\\EvaluationOrderTest extends generic class PHPStan\\\\Testing\\\\RuleTestCase but does not specify its types\\: TRule$#"
+ message: '#^Catching internal class PHPUnit\\Framework\\ExpectationFailedException\.$#'
+ identifier: catch.internalClass
count: 1
- path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+ path: src/Testing/PHPStanTestCase.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Testing/TypeInferenceTestCase.php
-
- message: "#^Method PHPStan\\\\Analyser\\\\EvaluationOrderTest\\:\\:getRule\\(\\) return type with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+ path: src/Type/Accessory/AccessoryArrayListType.php
-
- message: "#^Constant SOME_CONSTANT_IN_AUTOLOAD_FILE not found\\.$#"
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Command/AnalyseCommandTest.php
+ path: src/Type/Accessory/AccessoryLiteralStringType.php
-
- message: "#^Class PHPStan\\\\Node\\\\FileNodeTest extends generic class PHPStan\\\\Testing\\\\RuleTestCase but does not specify its types\\: TRule$#"
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Node/FileNodeTest.php
+ path: src/Type/Accessory/AccessoryLowercaseStringType.php
-
- message: "#^Method PHPStan\\\\Node\\\\FileNodeTest\\:\\:getRule\\(\\) return type with generic interface PHPStan\\\\Rules\\\\Rule does not specify its types\\: TNodeType$#"
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
count: 1
- path: tests/PHPStan/Node/FileNodeTest.php
+ path: src/Type/Accessory/AccessoryNonEmptyStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/AccessoryNonEmptyStringType.php
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/AccessoryNonFalsyStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/AccessoryNumericStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/AccessoryNumericStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/AccessoryUppercaseStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/HasMethodType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/HasOffsetType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Accessory/HasOffsetValueType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Accessory/HasOffsetValueType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/HasOffsetValueType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/HasPropertyType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/NonEmptyArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Accessory/OversizedArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/ArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\BooleanType is error\-prone and deprecated\. Use Type\:\:isBoolean\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/BooleanType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/BooleanType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\CallableType is error\-prone and deprecated\. Use Type\:\:isCallable\(\) and Type\:\:getCallableParametersAcceptors\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/CallableType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/CallableType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ClosureType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ message: '#^PHPDoc tag @var assumes the expression with type PHPStan\\Type\\Type is always PHPStan\\Type\\Constant\\ConstantIntegerType\|PHPStan\\Type\\Constant\\ConstantStringType but it''s error\-prone and dangerous\.$#'
+ identifier: phpstanApi.varTagAssumption
+ count: 2
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ message: '#^PHPDoc tag @var with type float\|int is not subtype of native type int\.$#'
+ identifier: varTag.nativeType
+ count: 2
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ message: '#^PHPDoc tag @var with type float\|int is not subtype of type int\.$#'
+ identifier: varTag.type
+ count: 1
+ path: src/Type/Constant/ConstantArrayTypeBuilder.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\BooleanType is error\-prone and deprecated\. Use Type\:\:isBoolean\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantBooleanType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantBooleanType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Constant/ConstantBooleanType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantFloatType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\FloatType is error\-prone and deprecated\. Use Type\:\:isFloat\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantFloatType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantIntegerType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntegerType is error\-prone and deprecated\. Use Type\:\:isInteger\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantIntegerType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\StringType is error\-prone and deprecated\. Use Type\:\:isString\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ message: '#^PHPDoc tag @var with type int\|string is not subtype of type string\.$#'
+ identifier: varTag.type
+ count: 1
+ path: src/Type/Constant/ConstantStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Constant/OversizedArrayBuilder.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Enum\\EnumCaseObjectType is error\-prone and deprecated\. Use Type\:\:getEnumCases\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Enum/EnumCaseObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ExponentiateHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/FileTypeMapper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\FloatType is error\-prone and deprecated\. Use Type\:\:isFloat\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/FloatType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\StringType is error\-prone and deprecated\. Use Type\:\:isString\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/GenericClassStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\TypeWithClassName is error\-prone and deprecated\. Use Type\:\:getObjectClassNames\(\) or Type\:\:getObjectClassReflections\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/GenericObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericStaticType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\TypeWithClassName is error\-prone and deprecated\. Use Type\:\:getObjectClassNames\(\) or Type\:\:getObjectClassReflections\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/GenericStaticType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateBenevolentUnionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateBooleanType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateConstantArrayType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateConstantIntegerType.php
+
+ -
+ message: '#^Method PHPStan\\Type\\Generic\\TemplateConstantIntegerType\:\:toPhpDocNode\(\) should return PHPStan\\PhpDocParser\\Ast\\Type\\ConstTypeNode but returns PHPStan\\PhpDocParser\\Ast\\Type\\IdentifierTypeNode\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Type/Generic/TemplateConstantIntegerType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateConstantStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateFloatType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateGenericObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateIntegerType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateIntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateKeyOfType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/TemplateMixedType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateObjectShapeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateObjectWithoutClassType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Generic/TemplateStrictMixedType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateStringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\BooleanType is error\-prone and deprecated\. Use Type\:\:isBoolean\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\FloatType is error\-prone and deprecated\. Use Type\:\:isFloat\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntegerType is error\-prone and deprecated\. Use Type\:\:isInteger\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectShapeType is error\-prone and deprecated\. Use Type\:\:isObject\(\) and Type\:\:hasProperty\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectWithoutClassType is error\-prone and deprecated\. Use Type\:\:isObject\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\StringType is error\-prone and deprecated\. Use Type\:\:isString\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Generic/TemplateTypeFactory.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/Generic/TemplateUnionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntegerRangeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntegerType is error\-prone and deprecated\. Use Type\:\:isInteger\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/IntegerRangeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntegerRangeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntegerType is error\-prone and deprecated\. Use Type\:\:isInteger\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IntegerType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/IntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\BooleanType is error\-prone and deprecated\. Use Type\:\:isBoolean\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\CallableType is error\-prone and deprecated\. Use Type\:\:isCallable\(\) and Type\:\:getCallableParametersAcceptors\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/IntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/IntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/IntersectionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IterableType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IterableType is error\-prone and deprecated\. Use Type\:\:isIterable\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/IterableType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/NullType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\NullType is error\-prone and deprecated\. Use Type\:\:isNull\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/NullType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectShapeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectShapeType is error\-prone and deprecated\. Use Type\:\:isObject\(\) and Type\:\:hasProperty\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ObjectShapeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectWithoutClassType is error\-prone and deprecated\. Use Type\:\:isObject\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectShapeType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Enum\\EnumCaseObjectType is error\-prone and deprecated\. Use Type\:\:getEnumCases\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericObjectType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/ObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/ObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectWithoutClassType is error\-prone and deprecated\. Use Type\:\:isObject\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/ObjectType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectShapeType is error\-prone and deprecated\. Use Type\:\:isObject\(\) and Type\:\:hasProperty\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/ObjectWithoutClassType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectWithoutClassType is error\-prone and deprecated\. Use Type\:\:isObject\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/ObjectWithoutClassType.php
+
+ -
+ message: '#^Creating new ReflectionClass is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine\. Use objects retrieved from ReflectionProvider instead\.$#'
+ identifier: phpstanApi.runtimeReflection
+ count: 1
+ path: src/Type/PHPStan/ClassNameUsageLocationCreateIdentifierDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ArrayKeyExistsFunctionTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 16
+ path: src/Type/Php/BcMathStringOrNullReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ClassExistsFunctionTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/CompactFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/CompactFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/DefineConstantTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/DefinedConstantTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\TypeWithClassName is error\-prone and deprecated\. Use Type\:\:getObjectClassNames\(\) or Type\:\:getObjectClassReflections\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/DsMapDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/FilterFunctionReturnTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/FilterFunctionReturnTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/FunctionExistsFunctionTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/IsAFunctionTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/IsSubclassOfFunctionTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/JsonThrowOnErrorDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/LtrimFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/MbSubstituteCharacterDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/MethodExistsTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/MinMaxFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/MinMaxFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/NumberFormatFunctionDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/PropertyExistsTypeSpecifyingExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/Php/RangeFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/ReflectionMethodConstructorThrowTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/SscanfFunctionDynamicReturnTypeExtension.php
+
+ -
+ message: '#^Cannot access offset int\<0, max\> on \(float\|int\)\.$#'
+ identifier: offsetAccess.nonOffsetAccessible
+ count: 2
+ path: src/Type/Php/StrIncrementDecrementFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/Php/StrRepeatFunctionReturnTypeExtension.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectType is error\-prone and deprecated\. Use Type\:\:isObject\(\) or Type\:\:getObjectClassNames\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/StaticType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectWithoutClassType is error\-prone and deprecated\. Use Type\:\:isObject\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/StaticType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/StringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\StringType is error\-prone and deprecated\. Use Type\:\:isString\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/StringType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\BooleanType is error\-prone and deprecated\. Use Type\:\:isBoolean\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\CallableType is error\-prone and deprecated\. Use Type\:\:isCallable\(\) and Type\:\:getCallableParametersAcceptors\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 16
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 5
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\FloatType is error\-prone and deprecated\. Use Type\:\:isFloat\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntegerType is error\-prone and deprecated\. Use Type\:\:isInteger\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IterableType is error\-prone and deprecated\. Use Type\:\:isIterable\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 8
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\NullType is error\-prone and deprecated\. Use Type\:\:isNull\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ObjectShapeType is error\-prone and deprecated\. Use Type\:\:isObject\(\) and Type\:\:hasProperty\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\StringType is error\-prone and deprecated\. Use Type\:\:isString\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Instanceof between PHPStan\\Type\\Constant\\ConstantIntegerType and PHPStan\\Type\\Constant\\ConstantIntegerType will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Result of \|\| is always true\.$#'
+ identifier: booleanOr.alwaysTrue
+ count: 1
+ path: src/Type/TypeCombinator.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/TypeUtils.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypeUtils.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ArrayType is error\-prone and deprecated\. Use Type\:\:isArray\(\) or Type\:\:getArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypehintHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantArrayType is error\-prone and deprecated\. Use Type\:\:getConstantArrays\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 3
+ path: src/Type/TypehintHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IterableType is error\-prone and deprecated\. Use Type\:\:isIterable\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/TypehintHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\CallableType is error\-prone and deprecated\. Use Type\:\:isCallable\(\) and Type\:\:getCallableParametersAcceptors\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Generic\\GenericClassStringType is error\-prone and deprecated\. Use Type\:\:isClassStringType\(\) and Type\:\:getClassStringObjectType\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/UnionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntersectionType is error\-prone and deprecated\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IterableType is error\-prone and deprecated\. Use Type\:\:isIterable\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 1
+ path: src/Type/UnionType.php
+
+ -
+ message: '#^PHPDoc tag @var assumes the expression with type PHPStan\\Type\\Type is always PHPStan\\Type\\BooleanType but it''s error\-prone and dangerous\.$#'
+ identifier: phpstanApi.varTagAssumption
+ count: 1
+ path: src/Type/UnionType.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\CallableType is error\-prone and deprecated\. Use Type\:\:isCallable\(\) and Type\:\:getCallableParametersAcceptors\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\ConstantScalarType is error\-prone and deprecated\. Use Type\:\:isConstantScalarValue\(\) or Type\:\:getConstantScalarTypes\(\) or Type\:\:getConstantScalarValues\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 4
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantBooleanType is error\-prone and deprecated\. Use Type\:\:isTrue\(\) or Type\:\:isFalse\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\Constant\\ConstantStringType is error\-prone and deprecated\. Use Type\:\:getConstantStrings\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\IntegerType is error\-prone and deprecated\. Use Type\:\:isInteger\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\NullType is error\-prone and deprecated\. Use Type\:\:isNull\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/UnionTypeHelper.php
+
+ -
+ message: '#^Doing instanceof PHPStan\\Type\\VoidType is error\-prone and deprecated\. Use Type\:\:isVoid\(\) instead\.$#'
+ identifier: phpstanApi.instanceofType
+ count: 2
+ path: src/Type/VoidType.php
+
+ -
+ message: '#^Unreachable statement \- code above always terminates\.$#'
+ identifier: deadCode.unreachable
+ count: 1
+ path: tests/PHPStan/Analyser/AnalyserTest.php
+
+ -
+ message: '#^Class PHPStan\\Analyser\\AnonymousClassNameRuleTest extends generic class PHPStan\\Testing\\RuleTestCase but does not specify its types\: TRule$#'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+
+ -
+ message: '#^Method PHPStan\\Analyser\\AnonymousClassNameRuleTest\:\:getRule\(\) return type with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/AnonymousClassNameRuleTest.php
+
+ -
+ message: '#^Class PHPStan\\Analyser\\EvaluationOrderTest extends generic class PHPStan\\Testing\\RuleTestCase but does not specify its types\: TRule$#'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+
+ -
+ message: '#^Method PHPStan\\Analyser\\EvaluationOrderTest\:\:getRule\(\) return type with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Analyser/EvaluationOrderTest.php
+
+ -
+ message: '#^Constant SOME_CONSTANT_IN_AUTOLOAD_FILE not found\.$#'
+ identifier: constant.notFound
+ count: 1
+ path: tests/PHPStan/Command/AnalyseCommandTest.php
+
+ -
+ message: '#^Class PHPStan\\Node\\FileNodeTest extends generic class PHPStan\\Testing\\RuleTestCase but does not specify its types\: TRule$#'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Node/FileNodeTest.php
+
+ -
+ message: '#^Method PHPStan\\Node\\FileNodeTest\:\:getRule\(\) return type with generic interface PHPStan\\Rules\\Rule does not specify its types\: TNodeType$#'
+ identifier: missingType.generics
+ count: 1
+ path: tests/PHPStan/Node/FileNodeTest.php
+
+ -
+ message: '#^Access to constant on internal class InternalAnnotations\\InternalFoo\.$#'
+ identifier: classConstant.internalClass
+ count: 1
+ path: tests/PHPStan/Reflection/Annotations/InternalAnnotationsTest.php
+
+ -
+ message: '#^Access to constant on internal interface InternalAnnotations\\InternalFooInterface\.$#'
+ identifier: classConstant.internalInterface
+ count: 1
+ path: tests/PHPStan/Reflection/Annotations/InternalAnnotationsTest.php
+
+ -
+ message: '#^Access to constant on internal trait InternalAnnotations\\InternalFooTrait\.$#'
+ identifier: classConstant.internalTrait
+ count: 1
+ path: tests/PHPStan/Reflection/Annotations/InternalAnnotationsTest.php
+
+ -
+ message: '#^PHPDoc tag @var with type string is not subtype of type class\-string\.$#'
+ identifier: varTag.type
+ count: 1
+ path: tests/PHPStan/Reflection/BetterReflection/SourceLocator/OptimizedDirectorySourceLocatorTest.php
+
+ -
+ message: '#^Creating new PHPStan\\Php8StubsMap is not covered by backward compatibility promise\. The class might change in a minor PHPStan version\.$#'
+ identifier: phpstanApi.constructor
+ count: 1
+ path: tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+ -
+ message: '#^Instanceof references internal interface PHPUnit\\Exception\.$#'
+ identifier: instanceof.internalInterface
+ count: 1
+ path: tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+ -
+ message: '#^Creating new PHPStan\\Php8StubsMap is not covered by backward compatibility promise\. The class might change in a minor PHPStan version\.$#'
+ identifier: phpstanApi.constructor
+ count: 1
+ path: tests/PHPStan/Reflection/SignatureMap/Php8SignatureMapProviderTest.php
+
+ -
+ message: '#^Catching internal class PHPUnit\\Framework\\AssertionFailedError\.$#'
+ identifier: catch.internalClass
+ count: 1
+ path: tests/PHPStan/Rules/WarningEmittingRuleTest.php
+
+ -
+ message: '#^Call to method getComparisonFailure\(\) of internal class PHPUnit\\Framework\\ExpectationFailedException from outside its root namespace PHPUnit\.$#'
+ identifier: method.internalClass
+ count: 2
+ path: tests/PHPStan/Testing/NonexistentAnalysedClassRuleTest.php
+
+ -
+ message: '#^Catching internal class PHPUnit\\Framework\\ExpectationFailedException\.$#'
+ identifier: catch.internalClass
+ count: 1
+ path: tests/PHPStan/Testing/NonexistentAnalysedClassRuleTest.php
+
+ -
+ message: '#^Access to constant on internal class PHPUnit\\Framework\\AssertionFailedError\.$#'
+ identifier: classConstant.internalClass
+ count: 1
+ path: tests/PHPStan/Testing/TypeInferenceTestCaseTest.php
+
+ -
+ message: '#^Catching internal class PHPUnit\\Framework\\AssertionFailedError\.$#'
+ identifier: catch.internalClass
+ count: 1
+ path: tests/PHPStan/Testing/TypeInferenceTestCaseTest.php
+
+ -
+ message: '#^PHPDoc tag @var assumes the expression with type PHPStan\\Type\\Generic\\TemplateType is always PHPStan\\Type\\Generic\\TemplateMixedType but it''s error\-prone and dangerous\.$#'
+ identifier: phpstanApi.varTagAssumption
+ count: 1
+ path: tests/PHPStan/Type/IterableTypeTest.php
diff --git a/phpstan-baseline.php b/phpstan-baseline.php
new file mode 100644
index 0000000000..646cbdbef6
--- /dev/null
+++ b/phpstan-baseline.php
@@ -0,0 +1,3 @@
+
+
+
+
+ src
+
+
+
+
+
+
+
+
+
+ tests/PHPStan
+ tests/PHPStan/Reflection/ReflectionProviderGoldenTest.php
+
+
+
+
+
+ exec
+ levels
+
+
+
+
diff --git a/resources/RegexGrammar.pp b/resources/RegexGrammar.pp
new file mode 100644
index 0000000000..3f49912a36
--- /dev/null
+++ b/resources/RegexGrammar.pp
@@ -0,0 +1,224 @@
+//
+// Hoa
+//
+//
+// @license
+//
+// New BSD License
+//
+// Copyright © 2007-2017, Hoa community. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Hoa nor the names of its contributors may be
+// used to endorse or promote products derived from this software without
+// specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// Grammar \Hoa\Regex\Grammar.
+//
+// Provide grammar of PCRE (Perl Compatible Regular Expression)for the LL(k)
+// parser. More informations at http://pcre.org/pcre.txt, sections pcrepattern &
+// pcresyntax.
+//
+// @copyright Copyright © 2007-2017 Hoa community.
+// @license New BSD License
+//
+
+// Character classes.
+// tokens suffixed with "fc_" are the same as without such suffix but followed by "class:_class"
+%token negative_class_fc_ \[\^(?=\]) -> class_fc
+%token class_fc_ \[(?=\]) -> class_fc
+%token class_fc:_class \] -> class
+%token negative_class_ \[\^ -> class
+%token class_ \[ -> class
+%token class:posix_class \[:\^?[a-z]+:\]
+%token class:class_ \[
+%token class:_class \] -> default
+%token class:range \-
+// taken over from literals but class:character has \b support on top (backspace in character classes)
+%token class:character \\([aefnrtb]|c[\x00-\x7f])
+%token class:dynamic_character \\([0-7]{3}|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+})
+%token class:character_type \\([CdDhHNRsSvVwWX]|[pP]{[^}]+})
+%token class:literal \\.|.|\n
+
+// Internal options.
+// See https://www.regular-expressions.info/refmodifiers.html
+// and https://www.php.net/manual/en/regexp.reference.internal-options.php
+%token internal_option \(\?[imsxnJUX^]*-?[imsxnJUX^]+\)
+
+// Lookahead and lookbehind assertions.
+%token lookahead_ \(\?=
+%token negative_lookahead_ \(\?!
+%token lookbehind_ \(\?<=
+%token negative_lookbehind_ \(\? nc
+%token absolute_reference_ \(\?\((?=\d) -> c
+%token relative_reference_ \(\?\((?=[\+\-]) -> c
+%token c:index [\+\-]?\d+ -> default
+%token assertion_reference_ \(\?\(
+
+// Comments.
+%token comment_ \(\?# -> co
+%token co:_comment \) -> default
+%token co:comment .*?(?=(? mark
+%token mark:name [^)]+
+%token mark:_marker \) -> default
+
+// Capturing group.
+%token named_capturing_ \(\?P?< -> nc
+%token nc:_named_capturing > -> default
+%token nc:capturing_name .+?(?=(?)
+%token non_capturing_ \(\?:
+%token non_capturing_internal_option \(\?[imsxnJUX^]*-?[imsxnJUX^]+:
+%token non_capturing_reset_ \(\?\|
+%token atomic_group_ \(\?>
+%token capturing_ \(
+%token _capturing \)
+
+// Quantifiers (by default, greedy).
+%token zero_or_one_possessive \?\+
+%token zero_or_one_lazy \?\?
+%token zero_or_one \?
+%token zero_or_more_possessive \*\+
+%token zero_or_more_lazy \*\?
+%token zero_or_more \*
+%token one_or_more_possessive \+\+
+%token one_or_more_lazy \+\?
+%token one_or_more \+
+%token exactly_n \{[0-9]+\}
+%token n_to_m_possessive \{[0-9]+,[0-9]+\}\+
+%token n_to_m_lazy \{[0-9]+,[0-9]+\}\?
+%token n_to_m \{[0-9]+,[0-9]+\}
+%token n_or_more_possessive \{[0-9]+,\}\+
+%token n_or_more_lazy \{[0-9]+,\}\?
+%token n_or_more \{[0-9]+,\}
+
+// Alternation.
+%token alternation \|
+
+// Literal.
+%token character \\([aefnrt]|c[\x00-\x7f])
+%token dynamic_character \\([0-7]{3}|x[0-9a-zA-Z]{2}|x{[0-9a-zA-Z]+})
+// Please, see PCRESYNTAX(3), General Category properties, PCRE special category
+// properties and script names for \p{} and \P{}.
+%token character_type \\([CdDhHNRsSvVwWX]|[pP]{[^}]+})
+%token anchor \\([bBAZzG])|\^|\$
+%token match_point_reset \\K
+%token literal \\.|.|\n
+
+
+// Rules.
+
+#expression:
+ alternation()
+
+alternation:
+ concatenation()? ( concatenation()? #alternation )*
+
+concatenation:
+ ( internal_options() | assertion() | quantification() | condition() )
+ ( ( internal_options() | assertion() | quantification() | condition() ) #concatenation )*
+
+#internal_options:
+
+
+#condition:
+ (
+ ::named_reference_:: ::_named_capturing:: #namedcondition
+ | (
+ ::relative_reference_:: #relativecondition
+ | ::absolute_reference_:: #absolutecondition
+ )
+
+ | ::assertion_reference_:: alternation() #assertioncondition
+ )
+ ::_capturing::
+ alternation()
+ ::_capturing::
+
+assertion:
+ (
+ ::lookahead_:: #lookahead
+ | ::negative_lookahead_:: #negativelookahead
+ | ::lookbehind_:: #lookbehind
+ | ::negative_lookbehind_:: #negativelookbehind
+ )
+ alternation()
+ ::_capturing::
+
+quantification:
+ ( class() | simple() ) ( quantifier() #quantification )?
+
+quantifier:
+ | |
+ | | |
+ | | |
+ |
+ | | |
+ | | |
+
+#class:
+ (
+ ::negative_class_fc_:: #negativeclass
+ <_class>
+ | ::class_fc_::
+ <_class>
+ | ::negative_class_:: #negativeclass
+ | ::class_::
+ )
+ ? ( | | range() ? | literal() )* ?
+ ::_class::
+
+#range:
+ literal() ::range:: literal()
+
+simple:
+ capturing()
+ | literal()
+
+#capturing:
+ ::marker_:: ::_marker:: #mark
+ | ::comment_:: ? ::_comment:: #comment
+ | (
+ ::named_capturing_:: ::_named_capturing:: #namedcapturing
+ | ::non_capturing_:: #noncapturing
+ | non_capturing_internal_options() #noncapturing
+ | ::non_capturing_reset_:: #noncapturingreset
+ | ::atomic_group_:: #atomicgroup
+ | ::capturing_::
+ )
+ alternation()
+ ::_capturing::
+
+non_capturing_internal_options:
+
+
+literal:
+
+ |
+ |
+ |
+ |
+ |
diff --git a/src/Reflection/SignatureMap/functionMap.php b/resources/functionMap.php
similarity index 81%
rename from src/Reflection/SignatureMap/functionMap.php
rename to resources/functionMap.php
index 84fdf667b3..aea642904a 100644
--- a/src/Reflection/SignatureMap/functionMap.php
+++ b/resources/functionMap.php
@@ -57,10 +57,7 @@
return [
'_' => ['string', 'message'=>'string'],
-'__halt_compiler' => ['void'],
-'abs' => ['int', 'number'=>'int'],
-'abs\'1' => ['float', 'number'=>'float'],
-'abs\'2' => ['float|int', 'number'=>'string'],
+'abs' => ['float|0|positive-int', 'num'=>'int|float'],
'accelerator_get_configuration' => ['array'],
'accelerator_get_scripts' => ['array'],
'accelerator_get_status' => ['array', 'fetch_scripts'=>'bool'],
@@ -70,110 +67,110 @@
'acosh' => ['float', 'number'=>'float'],
'addcslashes' => ['string', 'str'=>'string', 'charlist'=>'string'],
'addslashes' => ['string', 'str'=>'string'],
-'AMQPChannel::__construct' => ['void', 'amqp_connection'=>'AMQPConnection'],
-'AMQPChannel::basicRecover' => ['', 'requeue='=>'bool|true'],
-'AMQPChannel::commitTransaction' => ['bool'],
-'AMQPChannel::getChannelId' => ['int'],
+'AMQPChannel::__construct' => ['void', 'connection'=>'AMQPConnection'],
+'AMQPChannel::basicRecover' => ['void', 'requeue='=>'bool'],
+'AMQPChannel::commitTransaction' => ['void'],
+'AMQPChannel::getChannelId' => ['int<1, 65535>'],
'AMQPChannel::getConnection' => ['AMQPConnection'],
-'AMQPChannel::getPrefetchCount' => ['int'],
-'AMQPChannel::getPrefetchSize' => ['int'],
+'AMQPChannel::getPrefetchCount' => ['int<0, 65535>'],
+'AMQPChannel::getPrefetchSize' => ['int<0, max>'],
'AMQPChannel::isConnected' => ['bool'],
-'AMQPChannel::qos' => ['bool', 'size'=>'int', 'count'=>'int'],
-'AMQPChannel::rollbackTransaction' => ['bool'],
-'AMQPChannel::setPrefetchCount' => ['bool', 'count'=>'int'],
-'AMQPChannel::setPrefetchSize' => ['bool', 'size'=>'int'],
-'AMQPChannel::startTransaction' => ['bool'],
+'AMQPChannel::qos' => ['void', 'size'=>'int', 'count'=>'int', 'global='=>'bool'],
+'AMQPChannel::rollbackTransaction' => ['void'],
+'AMQPChannel::setPrefetchCount' => ['void', 'count'=>'int'],
+'AMQPChannel::setPrefetchSize' => ['void', 'size'=>'int'],
+'AMQPChannel::startTransaction' => ['void'],
'AMQPConnection::__construct' => ['void', 'credentials='=>'array'],
-'AMQPConnection::connect' => ['bool'],
-'AMQPConnection::disconnect' => ['bool'],
+'AMQPConnection::connect' => ['void'],
+'AMQPConnection::disconnect' => ['void'],
'AMQPConnection::getHost' => ['string'],
'AMQPConnection::getLogin' => ['string'],
-'AMQPConnection::getMaxChannels' => ['int|null'],
+'AMQPConnection::getMaxChannels' => ['int<1, 65535>'],
'AMQPConnection::getPassword' => ['string'],
-'AMQPConnection::getPort' => ['int'],
+'AMQPConnection::getPort' => ['int<1, 65535>'],
'AMQPConnection::getReadTimeout' => ['float'],
'AMQPConnection::getTimeout' => ['float'],
-'AMQPConnection::getUsedChannels' => ['int'],
+'AMQPConnection::getUsedChannels' => ['int<1, 65535>'],
'AMQPConnection::getVhost' => ['string'],
'AMQPConnection::getWriteTimeout' => ['float'],
'AMQPConnection::isConnected' => ['bool'],
-'AMQPConnection::isPersistent' => ['bool|null'],
-'AMQPConnection::pconnect' => ['bool'],
-'AMQPConnection::pdisconnect' => ['bool'],
-'AMQPConnection::preconnect' => ['bool'],
-'AMQPConnection::reconnect' => ['bool'],
-'AMQPConnection::setHost' => ['bool', 'host'=>'string'],
-'AMQPConnection::setLogin' => ['bool', 'login'=>'string'],
-'AMQPConnection::setPassword' => ['bool', 'password'=>'string'],
-'AMQPConnection::setPort' => ['bool', 'port'=>'int'],
-'AMQPConnection::setReadTimeout' => ['bool', 'timeout'=>'int'],
-'AMQPConnection::setTimeout' => ['bool', 'timeout'=>'int'],
-'AMQPConnection::setVhost' => ['bool', 'vhost'=>'string'],
-'AMQPConnection::setWriteTimeout' => ['bool', 'timeout'=>'int'],
-'AMQPEnvelope::getAppId' => ['string'],
+'AMQPConnection::isPersistent' => ['bool'],
+'AMQPConnection::pconnect' => ['void'],
+'AMQPConnection::pdisconnect' => ['void'],
+'AMQPConnection::preconnect' => ['void'],
+'AMQPConnection::reconnect' => ['void'],
+'AMQPConnection::setHost' => ['void', 'host'=>'string'],
+'AMQPConnection::setLogin' => ['void', 'login'=>'string'],
+'AMQPConnection::setPassword' => ['void', 'password'=>'string'],
+'AMQPConnection::setPort' => ['void', 'port'=>'int'],
+'AMQPConnection::setReadTimeout' => ['void', 'timeout'=>'float'],
+'AMQPConnection::setTimeout' => ['void', 'timeout'=>'float'],
+'AMQPConnection::setVhost' => ['void', 'vhost'=>'string'],
+'AMQPConnection::setWriteTimeout' => ['void', 'timeout'=>'float'],
+'AMQPEnvelope::getAppId' => ['string|null'],
'AMQPEnvelope::getBody' => ['string'],
-'AMQPEnvelope::getContentEncoding' => ['string'],
-'AMQPEnvelope::getContentType' => ['string'],
-'AMQPEnvelope::getCorrelationId' => ['string'],
+'AMQPEnvelope::getContentEncoding' => ['string|null'],
+'AMQPEnvelope::getContentType' => ['string|null'],
+'AMQPEnvelope::getCorrelationId' => ['string|null'],
'AMQPEnvelope::getDeliveryMode' => ['int'],
-'AMQPEnvelope::getDeliveryTag' => ['string'],
-'AMQPEnvelope::getExchangeName' => ['string'],
-'AMQPEnvelope::getExpiration' => ['string'],
-'AMQPEnvelope::getHeader' => ['bool|string', 'header_key'=>'string'],
-'AMQPEnvelope::getHeaders' => ['array'],
-'AMQPEnvelope::getMessageId' => ['string'],
-'AMQPEnvelope::getPriority' => ['int'],
-'AMQPEnvelope::getReplyTo' => ['string'],
+'AMQPEnvelope::getDeliveryTag' => ['int|null'],
+'AMQPEnvelope::getExchangeName' => ['string|null'],
+'AMQPEnvelope::getExpiration' => ['string|null'],
+'AMQPEnvelope::getHeader' => ['mixed', 'headerName'=>'string'],
+'AMQPEnvelope::getHeaders' => ['array'],
+'AMQPEnvelope::getMessageId' => ['string|null'],
+'AMQPEnvelope::getPriority' => ['int<0, max>'],
+'AMQPEnvelope::getReplyTo' => ['string|null'],
'AMQPEnvelope::getRoutingKey' => ['string'],
-'AMQPEnvelope::getTimeStamp' => ['string'],
-'AMQPEnvelope::getType' => ['string'],
-'AMQPEnvelope::getUserId' => ['string'],
+'AMQPEnvelope::getTimestamp' => ['int|null'],
+'AMQPEnvelope::getType' => ['string|null'],
+'AMQPEnvelope::getUserId' => ['string|null'],
'AMQPEnvelope::isRedelivery' => ['bool'],
-'AMQPExchange::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'],
-'AMQPExchange::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
-'AMQPExchange::declareExchange' => ['bool'],
-'AMQPExchange::delete' => ['bool', 'exchangeName='=>'string', 'flags='=>'int'],
-'AMQPExchange::getArgument' => ['bool|int|string', 'key'=>'string'],
-'AMQPExchange::getArguments' => ['array'],
+'AMQPExchange::__construct' => ['void', 'channel'=>'AMQPChannel'],
+'AMQPExchange::bind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
+'AMQPExchange::declareExchange' => ['void'],
+'AMQPExchange::delete' => ['void', 'exchangeName='=>'string', 'flags='=>'int'],
+'AMQPExchange::getArgument' => ['scalar|null', 'argumentName'=>'string'],
+'AMQPExchange::getArguments' => ['array'],
'AMQPExchange::getChannel' => ['AMQPChannel'],
'AMQPExchange::getConnection' => ['AMQPConnection'],
'AMQPExchange::getFlags' => ['int'],
-'AMQPExchange::getName' => ['string'],
-'AMQPExchange::getType' => ['string'],
-'AMQPExchange::publish' => ['bool', 'message'=>'string', 'routing_key='=>'string', 'flags='=>'int', 'attributes='=>'array'],
-'AMQPExchange::setArgument' => ['bool', 'key'=>'string', 'value'=>'int|string'],
-'AMQPExchange::setArguments' => ['bool', 'arguments'=>'array'],
-'AMQPExchange::setFlags' => ['bool', 'flags'=>'int'],
-'AMQPExchange::setName' => ['bool', 'exchange_name'=>'string'],
-'AMQPExchange::setType' => ['bool', 'exchange_type'=>'string'],
-'AMQPExchange::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
-'AMQPQueue::__construct' => ['void', 'amqp_channel'=>'AMQPChannel'],
-'AMQPQueue::ack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'],
-'AMQPQueue::bind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
-'AMQPQueue::cancel' => ['bool', 'consumer_tag='=>'string'],
-'AMQPQueue::consume' => ['void', 'callback='=>'?callable', 'flags='=>'int', 'consumerTag='=>'string'],
+'AMQPExchange::getName' => ['string|null'],
+'AMQPExchange::getType' => ['string|null'],
+'AMQPExchange::publish' => ['void', 'message'=>'string', 'routingKey='=>'string|null', 'flags='=>'int|null', 'header='=>'array'],
+'AMQPExchange::setArgument' => ['void', 'argumentName'=>'string', 'argumentValue'=>'scalar|null'],
+'AMQPExchange::setArguments' => ['void', 'arguments'=>'array'],
+'AMQPExchange::setFlags' => ['void', 'flags'=>'int|null'],
+'AMQPExchange::setName' => ['void', 'exchangeName'=>'string|null'],
+'AMQPExchange::setType' => ['void', 'exchangeType'=>'string|null'],
+'AMQPExchange::unbind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
+'AMQPQueue::__construct' => ['void', 'channel'=>'AMQPChannel'],
+'AMQPQueue::ack' => ['void', 'deliveryTag'=>'int', 'flags='=>'int|null'],
+'AMQPQueue::bind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
+'AMQPQueue::cancel' => ['void', 'consumerTag='=>'string'],
+'AMQPQueue::consume' => ['void', 'callback='=>'null|callable(AMQPEnvelope, AMQPQueue): mixed', 'flags='=>'int|null', 'consumerTag='=>'string|null'],
'AMQPQueue::declareQueue' => ['int'],
-'AMQPQueue::delete' => ['int', 'flags='=>'int'],
-'AMQPQueue::get' => ['AMQPEnvelope|bool', 'flags='=>'int'],
-'AMQPQueue::getArgument' => ['bool|int|string', 'key'=>'string'],
+'AMQPQueue::delete' => ['int', 'flags='=>'int|null'],
+'AMQPQueue::get' => ['AMQPEnvelope|null', 'flags='=>'int|null'],
+'AMQPQueue::getArgument' => ['scalar|null|array|AMQPValue|AMQPDecimal|AMQPTimestamp', 'argumentName'=>'string'],
'AMQPQueue::getArguments' => ['array'],
'AMQPQueue::getChannel' => ['AMQPChannel'],
'AMQPQueue::getConnection' => ['AMQPConnection'],
'AMQPQueue::getFlags' => ['int'],
-'AMQPQueue::getName' => ['string'],
-'AMQPQueue::nack' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'],
-'AMQPQueue::purge' => ['bool'],
-'AMQPQueue::reject' => ['bool', 'delivery_tag'=>'string', 'flags='=>'int'],
-'AMQPQueue::setArgument' => ['bool', 'key'=>'string', 'value'=>'mixed'],
-'AMQPQueue::setArguments' => ['bool', 'arguments'=>'array'],
-'AMQPQueue::setFlags' => ['bool', 'flags'=>'int'],
-'AMQPQueue::setName' => ['bool', 'queue_name'=>'string'],
-'AMQPQueue::unbind' => ['bool', 'exchange_name'=>'string', 'routing_key='=>'string', 'arguments='=>'array'],
+'AMQPQueue::getName' => ['string|null'],
+'AMQPQueue::nack' => ['void', 'deliveryTag'=>'int', 'flags='=>'int|null'],
+'AMQPQueue::purge' => ['int'],
+'AMQPQueue::reject' => ['void', 'deliveryTag'=>'int', 'flags='=>'int|null'],
+'AMQPQueue::setArgument' => ['void', 'argumentName'=>'string', 'argumentValue'=>'scalar|null|array|AMQPValue|AMQPDecimal|AMQPTimestamp'],
+'AMQPQueue::setArguments' => ['void', 'arguments'=>'array'],
+'AMQPQueue::setFlags' => ['void', 'flags'=>'int|null'],
+'AMQPQueue::setName' => ['void', 'name'=>'string'],
+'AMQPQueue::unbind' => ['void', 'exchangeName'=>'string', 'routingKey='=>'string|null', 'arguments='=>'array'],
'apache_child_terminate' => ['bool'],
'apache_get_modules' => ['array'],
'apache_get_version' => ['string|false'],
'apache_getenv' => ['string|false', 'variable'=>'string', 'walk_to_top='=>'bool'],
-'apache_lookup_uri' => ['object', 'filename'=>'string'],
+'apache_lookup_uri' => ['object|false', 'filename'=>'string'],
'apache_note' => ['string|false', 'note_name'=>'string', 'note_value='=>'string'],
'apache_request_headers' => ['array|false'],
'apache_reset_timeout' => ['bool'],
@@ -212,29 +209,29 @@
'APCIterator::valid' => ['bool'],
'apcu_add' => ['bool', 'key'=>'string', 'var'=>'', 'ttl='=>'int'],
'apcu_add\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'],
-'apcu_cache_info' => ['array', 'limited='=>'bool'],
+'apcu_cache_info' => ['__benevolent|false>', 'limited='=>'bool'],
'apcu_cas' => ['bool', 'key'=>'string', 'old'=>'int', 'new'=>'int'],
'apcu_clear_cache' => ['bool'],
'apcu_dec' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'],
-'apcu_delete' => ['bool', 'key'=>'string|APCUIterator'],
-'apcu_delete\'1' => ['array', 'key'=>'string[]'],
+'apcu_delete' => ['bool', 'key'=>'string|APCuIterator'],
+'apcu_delete\'1' => ['list', 'key'=>'string[]'],
'apcu_entry' => ['mixed', 'key'=>'string', 'generator'=>'callable', 'ttl='=>'int'],
'apcu_exists' => ['bool', 'keys'=>'string'],
'apcu_exists\'1' => ['array', 'keys'=>'string[]'],
'apcu_fetch' => ['mixed', 'key'=>'string|string[]', '&w_success='=>'bool'],
'apcu_inc' => ['int', 'key'=>'string', 'step='=>'int', '&w_success='=>'bool', 'ttl='=>'int'],
-'apcu_sma_info' => ['array', 'limited='=>'bool'],
+'apcu_sma_info' => ['__benevolent', 'limited='=>'bool'],
'apcu_store' => ['bool', 'key'=>'string', 'var='=>'', 'ttl='=>'int'],
'apcu_store\'1' => ['array', 'values'=>'array', 'unused='=>'', 'ttl='=>'int'],
-'APCUIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'],
-'APCUIterator::current' => ['mixed'],
-'APCUIterator::getTotalCount' => ['int'],
-'APCUIterator::getTotalHits' => ['int'],
-'APCUIterator::getTotalSize' => ['int'],
-'APCUIterator::key' => ['string'],
-'APCUIterator::next' => ['void'],
-'APCUIterator::rewind' => ['void'],
-'APCUIterator::valid' => ['bool'],
+'APCuIterator::__construct' => ['void', 'search='=>'string|string[]|null', 'format='=>'int', 'chunk_size='=>'int', 'list='=>'int'],
+'APCuIterator::current' => ['mixed'],
+'APCuIterator::getTotalCount' => ['int'],
+'APCuIterator::getTotalHits' => ['int'],
+'APCuIterator::getTotalSize' => ['int'],
+'APCuIterator::key' => ['string'],
+'APCuIterator::next' => ['void'],
+'APCuIterator::rewind' => ['void'],
+'APCuIterator::valid' => ['bool'],
'apd_breakpoint' => ['bool', 'debug_level'=>'int'],
'apd_callstack' => ['array'],
'apd_clunk' => ['void', 'warning'=>'string', 'delimiter='=>'string'],
@@ -250,7 +247,7 @@
'apd_set_session_trace' => ['void', 'debug_level'=>'int', 'dump_directory='=>'string'],
'apd_set_session_trace_socket' => ['bool', 'tcp_server'=>'string', 'socket_type'=>'int', 'port'=>'int', 'debug_level'=>'int'],
'AppendIterator::__construct' => ['void'],
-'AppendIterator::append' => ['void', 'it'=>'iterator'],
+'AppendIterator::append' => ['void', 'iterator'=>'Iterator'],
'AppendIterator::current' => ['mixed'],
'AppendIterator::getArrayIterator' => ['ArrayIterator'],
'AppendIterator::getInnerIterator' => ['iterator'],
@@ -260,10 +257,10 @@
'AppendIterator::rewind' => ['void'],
'AppendIterator::valid' => ['bool'],
'array_change_key_case' => ['array', 'input'=>'array', 'case='=>'int'],
-'array_chunk' => ['array[]', 'input'=>'array', 'size'=>'int', 'preserve_keys='=>'bool'],
+'array_chunk' => ['list', 'input'=>'array', 'size'=>'positive-int', 'preserve_keys='=>'bool'],
'array_column' => ['array', 'array'=>'array', 'column_key'=>'mixed', 'index_key='=>'mixed'],
'array_combine' => ['array|false', 'keys'=>'array', 'values'=>'array'],
-'array_count_values' => ['int[]', 'input'=>'array'],
+'array_count_values' => ['array', 'input'=>'array'],
'array_diff' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
'array_diff_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
'array_diff_key' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
@@ -274,7 +271,7 @@
'array_fill' => ['array', 'start_key'=>'int', 'num'=>'int', 'val'=>'mixed'],
'array_fill_keys' => ['array', 'keys'=>'array', 'val'=>'mixed'],
'array_filter' => ['array', 'input'=>'array', 'callback='=>'callable(mixed,mixed):bool|callable(mixed):bool', 'flag='=>'int'],
-'array_flip' => ['array', 'input'=>'array'],
+'array_flip' => ['array', 'input'=>'array'],
'array_intersect' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
'array_intersect_assoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
'array_intersect_key' => ['array', 'arr1'=>'array', 'arr2'=>'array', '...args='=>'array'],
@@ -283,13 +280,13 @@
'array_intersect_ukey' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'key_compare_func'=>'callable(mixed,mixed):int'],
'array_intersect_ukey\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest'=>'array|callable(mixed,mixed):int'],
'array_key_exists' => ['bool', 'key'=>'string|int', 'search'=>'array'],
-'array_key_first' => ['int|string|null', 'array' => 'array'],
-'array_key_last' => ['int|string|null', 'array' => 'array'],
-'array_keys' => ['array', 'input'=>'array', 'search_value='=>'mixed', 'strict='=>'bool'],
-'array_map' => ['array', 'callback'=>'?callable', 'input1'=>'array', '...args='=>'array'],
+'array_key_first' => ['int|string|null', 'array'=>'array'],
+'array_key_last' => ['int|string|null', 'array'=>'array'],
+'array_keys' => ['list', 'input'=>'array', 'search_value='=>'mixed', 'strict='=>'bool'],
+'array_map' => ['array', 'callback'=>'?callable', 'array'=>'array', '...args='=>'array'],
'array_merge' => ['array', 'arr1'=>'array', '...args='=>'array'],
'array_merge_recursive' => ['array', 'arr1'=>'array', '...args='=>'array'],
-'array_multisort' => ['bool', '&rw_array1'=>'array', 'array1_sort_order='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'],
+'array_multisort' => ['bool', 'array1'=>'array', 'array1_sort_order='=>'array|int', 'array1_sort_flags='=>'array|int', '...args='=>'array|int'],
'array_pad' => ['array', 'input'=>'array', 'pad_size'=>'int', 'pad_value'=>'mixed'],
'array_pop' => ['mixed', '&rw_stack'=>'array'],
'array_product' => ['int|float', 'input'=>'array'],
@@ -303,7 +300,7 @@
'array_search' => ['int|string|false', 'needle'=>'mixed', 'haystack'=>'array', 'strict='=>'bool'],
'array_shift' => ['mixed', '&rw_stack'=>'array'],
'array_slice' => ['array', 'input'=>'array', 'offset'=>'int', 'length='=>'?int', 'preserve_keys='=>'bool'],
-'array_splice' => ['array', '&rw_input'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'array|string'],
+'array_splice' => ['array', '&rw_input'=>'array', 'offset'=>'int', 'length='=>'int', 'replacement='=>'mixed'],
'array_sum' => ['int|float', 'input'=>'array'],
'array_udiff' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_comp_func'=>'callable(mixed,mixed):int'],
'array_udiff\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'],
@@ -317,11 +314,11 @@
'array_uintersect_assoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'],
'array_uintersect_uassoc' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'data_compare_func'=>'callable(mixed,mixed):int', 'key_compare_func'=>'callable(mixed,mixed):int'],
'array_uintersect_uassoc\'1' => ['array', 'arr1'=>'array', 'arr2'=>'array', 'arr3'=>'array', 'arg4'=>'array|callable(mixed,mixed):int', 'arg5'=>'array|callable(mixed,mixed):int', '...rest='=>'array|callable(mixed,mixed):int'],
-'array_unique' => ['array', 'input'=>'array', 'sort_flags='=>'int'],
-'array_unshift' => ['int', '&rw_stack'=>'array', 'var'=>'mixed', '...vars='=>'mixed'],
-'array_values' => ['array', 'input'=>'array'],
-'array_walk' => ['bool', '&rw_input'=>'array', 'callback'=>'callable', 'userdata='=>'mixed'],
-'array_walk_recursive' => ['bool', '&rw_input'=>'array', 'callback'=>'callable', 'userdata='=>'mixed'],
+'array_unique' => ['array', 'array'=>'array', 'flags='=>'int'],
+'array_unshift' => ['positive-int', '&rw_stack'=>'array', 'var'=>'mixed', '...vars='=>'mixed'],
+'array_values' => ['list', 'input'=>'array'],
+'array_walk' => ['bool', '&rw_input'=>'array|object', 'callback'=>'callable', 'userdata='=>'mixed'],
+'array_walk_recursive' => ['bool', '&rw_input'=>'array|object', 'callback'=>'callable', 'userdata='=>'mixed'],
'ArrayAccess::offsetExists' => ['bool', 'offset'=>'mixed'],
'ArrayAccess::offsetGet' => ['mixed', 'offset'=>'mixed'],
'ArrayAccess::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'],
@@ -329,7 +326,7 @@
'ArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'],
'ArrayIterator::append' => ['void', 'value'=>'mixed'],
'ArrayIterator::asort' => ['void'],
-'ArrayIterator::count' => ['int'],
+'ArrayIterator::count' => ['0|positive-int'],
'ArrayIterator::current' => ['mixed'],
'ArrayIterator::getArrayCopy' => ['array'],
'ArrayIterator::getFlags' => ['int'],
@@ -346,14 +343,14 @@
'ArrayIterator::seek' => ['void', 'position'=>'int'],
'ArrayIterator::serialize' => ['string'],
'ArrayIterator::setFlags' => ['void', 'flags'=>'string'],
-'ArrayIterator::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'],
-'ArrayIterator::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'],
+'ArrayIterator::uasort' => ['void', 'callback'=>'callable(mixed,mixed):int'],
+'ArrayIterator::uksort' => ['void', 'callback'=>'callable(array-key,array-key):int'],
'ArrayIterator::unserialize' => ['void', 'serialized'=>'string'],
'ArrayIterator::valid' => ['bool'],
-'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'string'],
+'ArrayObject::__construct' => ['void', 'input='=>'array|object', 'flags='=>'int', 'iterator_class='=>'class-string'],
'ArrayObject::append' => ['void', 'value'=>'mixed'],
'ArrayObject::asort' => ['void'],
-'ArrayObject::count' => ['int'],
+'ArrayObject::count' => ['0|positive-int'],
'ArrayObject::exchangeArray' => ['array', 'ar'=>'mixed'],
'ArrayObject::getArrayCopy' => ['array'],
'ArrayObject::getFlags' => ['int'],
@@ -369,8 +366,8 @@
'ArrayObject::serialize' => ['string'],
'ArrayObject::setFlags' => ['void', 'flags'=>'int'],
'ArrayObject::setIteratorClass' => ['void', 'iterator_class'=>'string'],
-'ArrayObject::uasort' => ['void', 'cmp_function'=>'callable'],
-'ArrayObject::uksort' => ['void', 'cmp_function'=>'callable'],
+'ArrayObject::uasort' => ['void', 'callback'=>'callable'],
+'ArrayObject::uksort' => ['void', 'callback'=>'callable(array-key,array-key):int'],
'ArrayObject::unserialize' => ['void', 'serialized'=>'string'],
'arsort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'],
'asin' => ['float', 'number'=>'float'],
@@ -396,7 +393,7 @@
'BadFunctionCallException::getLine' => ['int'],
'BadFunctionCallException::getMessage' => ['string'],
'BadFunctionCallException::getPrevious' => ['(?Throwable)|(?BadFunctionCallException)'],
-'BadFunctionCallException::getTrace' => ['array'],
+'BadFunctionCallException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'BadFunctionCallException::getTraceAsString' => ['string'],
'BadMethodCallException::__clone' => ['void'],
'BadMethodCallException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?BadMethodCallException)'],
@@ -406,9 +403,10 @@
'BadMethodCallException::getLine' => ['int'],
'BadMethodCallException::getMessage' => ['string'],
'BadMethodCallException::getPrevious' => ['(?Throwable)|(?BadMethodCallException)'],
-'BadMethodCallException::getTrace' => ['array'],
+'BadMethodCallException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'BadMethodCallException::getTraceAsString' => ['string'],
-'base64_decode' => ['string|false', 'str'=>'string', 'strict='=>'bool'],
+'base64_decode' => ['string', 'str'=>'string', 'strict='=>'false'],
+'base64_decode\'1' => ['string|false', 'str'=>'string', 'strict='=>'true'],
'base64_encode' => ['string', 'str'=>'string'],
'base_convert' => ['string', 'number'=>'string', 'frombase'=>'int', 'tobase'=>'int'],
'basename' => ['string', 'path'=>'string', 'suffix='=>'string'],
@@ -419,11 +417,11 @@
'bbcode_parse' => ['string', 'bbcode_container'=>'resource', 'to_parse'=>'string'],
'bbcode_set_arg_parser' => ['bool', 'bbcode_container'=>'resource', 'bbcode_arg_parser'=>'resource'],
'bbcode_set_flags' => ['bool', 'bbcode_container'=>'resource', 'flags'=>'int', 'mode='=>'int'],
-'bcadd' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bccomp' => ['int', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bcdiv' => ['string|null', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bcmod' => ['string|null', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
-'bcmul' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
+'bcadd' => ['numeric-string', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bccomp' => ['0|1|-1', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bcdiv' => ['numeric-string|null', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bcmod' => ['numeric-string|null', 'left_operand'=>'string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
+'bcmul' => ['numeric-string', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
'bcompiler_load' => ['bool', 'filename'=>'string'],
'bcompiler_load_exe' => ['bool', 'filename'=>'string'],
'bcompiler_parse_class' => ['bool', 'class'=>'string', 'callback'=>'string'],
@@ -437,15 +435,15 @@
'bcompiler_write_functions_from_file' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'],
'bcompiler_write_header' => ['bool', 'filehandle'=>'resource', 'write_ver='=>'string'],
'bcompiler_write_included_filename' => ['bool', 'filehandle'=>'resource', 'filename'=>'string'],
-'bcpow' => ['string', 'base'=>'string', 'exponent'=>'string', 'scale='=>'int'],
-'bcpowmod' => ['string|null', 'base'=>'string', 'exponent'=>'string', 'modulus'=>'string', 'scale='=>'int'],
+'bcpow' => ['numeric-string', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'scale='=>'int'],
+'bcpowmod' => ['numeric-string|null', 'base'=>'numeric-string', 'exponent'=>'numeric-string', 'modulus'=>'string', 'scale='=>'int'],
'bcscale' => ['int', 'scale='=>'int'],
-'bcsqrt' => ['string', 'operand'=>'string', 'scale='=>'int'],
-'bcsub' => ['string', 'left_operand'=>'string', 'right_operand'=>'string', 'scale='=>'int'],
+'bcsqrt' => ['numeric-string', 'operand'=>'numeric-string', 'scale='=>'int'],
+'bcsub' => ['numeric-string', 'left_operand'=>'numeric-string', 'right_operand'=>'numeric-string', 'scale='=>'int'],
'bin2hex' => ['string', 'data'=>'string'],
-'bind_textdomain_codeset' => ['string', 'domain'=>'string', 'codeset'=>'string'],
-'bindec' => ['int', 'binary_number'=>'string'],
-'bindtextdomain' => ['string', 'domain_name'=>'string', 'dir'=>'string'],
+'bind_textdomain_codeset' => ['string|false', 'domain'=>'string', 'codeset'=>'string'],
+'bindec' => ['float|int', 'binary_number'=>'string'],
+'bindtextdomain' => ['string|false', 'domain_name'=>'string', 'dir'=>'string'],
'birdstep_autocommit' => ['bool', 'index'=>'int'],
'birdstep_close' => ['bool', 'id'=>'int'],
'birdstep_commit' => ['bool', 'index'=>'int'],
@@ -483,18 +481,18 @@
'bson_decode' => ['array', 'bson'=>'string'],
'bson_encode' => ['string', 'anything'=>'mixed'],
'bzclose' => ['bool', 'bz'=>'resource'],
-'bzcompress' => ['string', 'source'=>'string', 'blocksize100k='=>'int', 'workfactor='=>'int'],
-'bzdecompress' => ['string', 'source'=>'string', 'small='=>'int'],
+'bzcompress' => ['string|int', 'source'=>'string', 'blocksize100k='=>'int', 'workfactor='=>'int'],
+'bzdecompress' => ['string|false', 'source'=>'string', 'small='=>'int'],
'bzerrno' => ['int', 'bz'=>'resource'],
'bzerror' => ['array', 'bz'=>'resource'],
'bzerrstr' => ['string', 'bz'=>'resource'],
'bzflush' => ['bool', 'bz'=>'resource'],
-'bzopen' => ['resource', 'file'=>'string|resource', 'mode'=>'string'],
-'bzread' => ['string', 'bz'=>'resource', 'length='=>'int'],
-'bzwrite' => ['int', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'],
-'CachingIterator::__construct' => ['void', 'it'=>'iterator', 'flags='=>''],
+'bzopen' => ['resource|false', 'file'=>'string|resource', 'mode'=>'string'],
+'bzread' => ['string|false', 'bz'=>'resource', 'length='=>'int'],
+'bzwrite' => ['int|false', 'bz'=>'resource', 'data'=>'string', 'length='=>'int'],
+'CachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags='=>''],
'CachingIterator::__toString' => ['string'],
-'CachingIterator::count' => ['int'],
+'CachingIterator::count' => ['0|positive-int'],
'CachingIterator::current' => ['mixed'],
'CachingIterator::getCache' => ['array'],
'CachingIterator::getFlags' => ['int'],
@@ -925,15 +923,15 @@
'call_user_func_array' => ['mixed', 'function'=>'callable', 'parameters'=>'array'],
'call_user_method' => ['mixed', 'method_name'=>'string', 'obj'=>'object', 'parameter='=>'mixed', '...args='=>'mixed'],
'call_user_method_array' => ['mixed', 'method_name'=>'string', 'obj'=>'object', 'params'=>'array'],
-'CallbackFilterIterator::__construct' => ['void', 'it'=>'iterator', 'func'=>'callable'],
+'CallbackFilterIterator::__construct' => ['void', 'iterator'=>'Iterator', 'func'=>'callable'],
'CallbackFilterIterator::accept' => ['bool'],
'CallbackFilterIterator::current' => ['mixed'],
-'CallbackFilterIterator::getInnerIterator' => ['iterator'],
+'CallbackFilterIterator::getInnerIterator' => ['Iterator'],
'CallbackFilterIterator::key' => ['mixed'],
'CallbackFilterIterator::next' => ['void'],
'CallbackFilterIterator::rewind' => ['void'],
'CallbackFilterIterator::valid' => ['bool'],
-'ceil' => ['float|int', 'number'=>'float'],
+'ceil' => ['__benevolent', 'number'=>'float'],
'chdb::__construct' => ['void', 'pathname'=>'string'],
'chdb::get' => ['string', 'key'=>'string'],
'chdb_create' => ['bool', 'pathname'=>'string', 'data'=>'array'],
@@ -944,14 +942,14 @@
'chmod' => ['bool', 'filename'=>'string', 'mode'=>'int'],
'chop' => ['string', 'str'=>'string', 'character_mask='=>'string'],
'chown' => ['bool', 'filename'=>'string', 'user'=>'string|int'],
-'chr' => ['string', 'ascii'=>'int'],
+'chr' => ['non-empty-string', 'ascii'=>'int'],
'chroot' => ['bool', 'directory'=>'string'],
-'chunk_split' => ['string', 'str'=>'string', 'chunklen='=>'int', 'ending='=>'string'],
+'chunk_split' => ['string', 'str'=>'string', 'chunklen='=>'positive-int', 'ending='=>'string'],
'class_alias' => ['bool', 'user_class_name'=>'string', 'alias_name'=>'string', 'autoload='=>'bool'],
'class_exists' => ['bool', 'classname'=>'string', 'autoload='=>'bool'],
-'class_implements' => ['array', 'what'=>'object|string', 'autoload='=>'bool'],
-'class_parents' => ['array', 'instance'=>'object|string', 'autoload='=>'bool'],
-'class_uses' => ['array', 'what'=>'object|string', 'autoload='=>'bool'],
+'class_implements' => ['array|false', 'what'=>'object|string', 'autoload='=>'bool'],
+'class_parents' => ['array|false', 'instance'=>'object|string', 'autoload='=>'bool'],
+'class_uses' => ['array|false', 'what'=>'object|string', 'autoload='=>'bool'],
'classkit_import' => ['array', 'filename'=>'string'],
'classkit_method_add' => ['bool', 'classname'=>'string', 'methodname'=>'string', 'args'=>'string', 'code'=>'string', 'flags='=>'int'],
'classkit_method_copy' => ['bool', 'dclass'=>'string', 'dmethod'=>'string', 'sclass'=>'string', 'smethod='=>'string'],
@@ -990,14 +988,14 @@
'ClosedGeneratorException::getLine' => ['int'],
'ClosedGeneratorException::getMessage' => ['string'],
'ClosedGeneratorException::getPrevious' => ['Throwable|ClosedGeneratorException|null'],
-'ClosedGeneratorException::getTrace' => ['array'],
+'ClosedGeneratorException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'ClosedGeneratorException::getTraceAsString' => ['string'],
'closedir' => ['void', 'dir_handle='=>'resource'],
'closelog' => ['bool'],
'Closure::__construct' => ['void'],
'Closure::__invoke' => ['', '...args='=>''],
-'Closure::bind' => ['Closure', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|string'],
-'Closure::bindTo' => ['Closure', 'new'=>'?object', 'newscope='=>'object|string'],
+'Closure::bind' => ['__benevolent', 'old'=>'Closure', 'to'=>'?object', 'scope='=>'object|class-string|\'static\'|null'],
+'Closure::bindTo' => ['__benevolent', 'new'=>'?object', 'newscope='=>'object|class-string|\'static\'|null'],
'Closure::call' => ['', 'to'=>'object', '...parameters='=>''],
'Closure::fromCallable' => ['Closure', 'callable'=>'callable'],
'clusterObj::convertToString' => ['string'],
@@ -1007,8 +1005,8 @@
'clusterObj::setGroup' => ['int', 'expression'=>'string'],
'Collator::__construct' => ['void', 'locale'=>'string'],
'Collator::asort' => ['bool', '&rw_arr'=>'array', 'sort_flag='=>'int'],
-'Collator::compare' => ['int', 'str1'=>'string', 'str2'=>'string'],
-'Collator::create' => ['Collator', 'locale'=>'string'],
+'Collator::compare' => ['int|false', 'str1'=>'string', 'str2'=>'string'],
+'Collator::create' => ['?Collator', 'locale'=>'string'],
'Collator::getAttribute' => ['int', 'attr'=>'int'],
'Collator::getErrorCode' => ['int'],
'Collator::getErrorMessage' => ['string'],
@@ -1020,13 +1018,13 @@
'Collator::sort' => ['bool', '&rw_arr'=>'array', 'sort_flags='=>'int'],
'Collator::sortWithSortKeys' => ['bool', '&rw_arr'=>'array'],
'collator_asort' => ['bool', 'coll'=>'collator', '&rw_arr'=>'array', 'sort_flag='=>'int'],
-'collator_compare' => ['int', 'coll'=>'collator', 'str1'=>'string', 'str2'=>'string'],
-'collator_create' => ['Collator', 'locale'=>'string'],
-'collator_get_attribute' => ['int', 'coll'=>'collator', 'attr'=>'int'],
-'collator_get_error_code' => ['int', 'coll'=>'collator'],
-'collator_get_error_message' => ['string', 'coll'=>'collator'],
-'collator_get_locale' => ['string', 'coll'=>'collator', 'type'=>'int'],
-'collator_get_sort_key' => ['string', 'coll'=>'collator', 'str'=>'string'],
+'collator_compare' => ['int|false', 'coll'=>'collator', 'str1'=>'string', 'str2'=>'string'],
+'collator_create' => ['?Collator', 'locale'=>'string'],
+'collator_get_attribute' => ['int|false', 'coll'=>'collator', 'attr'=>'int'],
+'collator_get_error_code' => ['int|false', 'coll'=>'collator'],
+'collator_get_error_message' => ['string|false', 'coll'=>'collator'],
+'collator_get_locale' => ['string|false', 'coll'=>'collator', 'type'=>'int'],
+'collator_get_sort_key' => ['string|false', 'coll'=>'collator', 'str'=>'string'],
'collator_get_strength' => ['int', 'coll'=>'collator'],
'collator_set_attribute' => ['bool', 'coll'=>'collator', 'attr'=>'int', 'val'=>'int'],
'collator_set_strength' => ['bool', 'coll'=>'collator', 'strength'=>'int'],
@@ -1040,7 +1038,7 @@
'COM::__get' => ['', 'name'=>''],
'COM::__set' => ['', 'name'=>'', 'value'=>''],
'com_addref' => [''],
-'com_create_guid' => ['string'],
+'com_create_guid' => ['string|false'],
'com_event_sink' => ['bool', 'comobject'=>'object', 'sinkobject'=>'object', 'sinkinterface='=>'mixed'],
'com_get_active_object' => ['object', 'progid'=>'string', 'code_page='=>'int'],
'com_isenum' => ['bool', 'com_module'=>'variant'],
@@ -1048,7 +1046,7 @@
'com_message_pump' => ['bool', 'timeoutms='=>'int'],
'com_print_typeinfo' => ['bool', 'comobject_or_typelib'=>'object', 'dispinterface='=>'string', 'wantsink='=>'bool'],
'com_release' => [''],
-'compact' => ['array', '...var_names='=>'string|array'],
+'compact' => ['array', '...var_names='=>'string|array'],
'COMPersistHelper::__construct' => ['void', 'com_object'=>'object'],
'COMPersistHelper::GetCurFile' => ['string'],
'COMPersistHelper::GetMaxStreamSize' => ['int'],
@@ -1060,12 +1058,12 @@
'componere\cast' => ['Type', 'arg1'=>'', 'object'=>''],
'componere\cast_by_ref' => ['Type', 'arg1'=>'', 'object'=>''],
'confirm_pdo_ibm_compiled' => [''],
-'connection_aborted' => ['int'],
-'connection_status' => ['int'],
+'connection_aborted' => ['0|1'],
+'connection_status' => ['int-mask'],
'connection_timeout' => ['int'],
'constant' => ['mixed', 'const_name'=>'string'],
'convert_cyr_string' => ['string', 'str'=>'string', 'from'=>'string', 'to'=>'string'],
-'convert_uudecode' => ['string', 'data'=>'string'],
+'convert_uudecode' => ['string|false', 'data'=>'string'],
'convert_uuencode' => ['string', 'data'=>'string'],
'copy' => ['bool', 'source_file'=>'string', 'destination_file'=>'string', 'context='=>'resource'],
'cos' => ['float', 'number'=>'float'],
@@ -1365,9 +1363,9 @@
'Couchbase\WildcardSearchQuery::jsonSerialize' => ['array'],
'Couchbase\zlibCompress' => ['string', 'data'=>'string'],
'Couchbase\zlibDecompress' => ['string', 'data'=>'string'],
-'count' => ['int', 'var'=>'Countable|array', 'mode='=>'int'],
-'count_chars' => ['mixed', 'input'=>'string', 'mode='=>'int'],
-'Countable::count' => ['int'],
+'count' => ['0|positive-int', 'var'=>'Countable|array', 'mode='=>'0|1'],
+'count_chars' => ['mixed', 'input'=>'string', 'mode='=>'0|1|2|3|4'],
+'Countable::count' => ['0|positive-int'],
'crack_check' => ['bool', 'dictionary'=>'', 'password'=>'string'],
'crack_closedict' => ['bool', 'dictionary='=>'resource'],
'crack_getlastmessage' => ['string'],
@@ -1375,18 +1373,18 @@
'crash' => [''],
'crc32' => ['int', 'str'=>'string'],
'create_function' => ['string', 'args'=>'string', 'code'=>'string'],
-'crypt' => ['string', 'str'=>'string', 'salt='=>'string'],
-'ctype_alnum' => ['bool', 'c'=>'string|int'],
-'ctype_alpha' => ['bool', 'c'=>'string|int'],
-'ctype_cntrl' => ['bool', 'c'=>'string|int'],
-'ctype_digit' => ['bool', 'c'=>'string|int'],
-'ctype_graph' => ['bool', 'c'=>'string|int'],
-'ctype_lower' => ['bool', 'c'=>'string|int'],
-'ctype_print' => ['bool', 'c'=>'string|int'],
-'ctype_punct' => ['bool', 'c'=>'string|int'],
-'ctype_space' => ['bool', 'c'=>'string|int'],
-'ctype_upper' => ['bool', 'c'=>'string|int'],
-'ctype_xdigit' => ['bool', 'c'=>'string|int'],
+'crypt' => ['non-empty-string', 'str'=>'string', 'salt='=>'string'],
+'ctype_alnum' => ['bool', 'c'=>'mixed'],
+'ctype_alpha' => ['bool', 'c'=>'mixed'],
+'ctype_cntrl' => ['bool', 'c'=>'mixed'],
+'ctype_digit' => ['bool', 'c'=>'mixed'],
+'ctype_graph' => ['bool', 'c'=>'mixed'],
+'ctype_lower' => ['bool', 'c'=>'mixed'],
+'ctype_print' => ['bool', 'c'=>'mixed'],
+'ctype_punct' => ['bool', 'c'=>'mixed'],
+'ctype_space' => ['bool', 'c'=>'mixed'],
+'ctype_upper' => ['bool', 'c'=>'mixed'],
+'ctype_xdigit' => ['bool', 'c'=>'mixed'],
'cubrid_affected_rows' => ['int', 'req_identifier='=>''],
'cubrid_bind' => ['bool', 'req_identifier'=>'resource', 'bind_param'=>'int', 'bind_value'=>'mixed', 'bind_value_type='=>'string'],
'cubrid_client_encoding' => ['string', 'conn_identifier='=>''],
@@ -1487,21 +1485,21 @@
'cubrid_unbuffered_query' => ['resource', 'query'=>'string', 'conn_identifier='=>''],
'cubrid_version' => ['string'],
'curl_close' => ['void', 'ch'=>'resource'],
-'curl_copy_handle' => ['resource', 'ch'=>'resource'],
+'curl_copy_handle' => ['resource|false', 'ch'=>'resource'],
'curl_errno' => ['int', 'ch'=>'resource'],
'curl_error' => ['string', 'ch'=>'resource'],
-'curl_escape' => ['string', 'ch'=>'resource', 'str'=>'string'],
+'curl_escape' => ['string|false', 'ch'=>'resource', 'str'=>'string'],
'curl_exec' => ['bool|string', 'ch'=>'resource'],
'curl_file_create' => ['CURLFile', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'],
'curl_getinfo' => ['mixed', 'ch'=>'resource', 'option='=>'int'],
-'curl_init' => ['resource|false', 'url='=>'string'],
+'curl_init' => ['__benevolent', 'url='=>'string'],
'curl_multi_add_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'],
'curl_multi_close' => ['void', 'mh'=>'resource'],
'curl_multi_errno' => ['int', 'mh'=>'resource'],
'curl_multi_exec' => ['int', 'mh'=>'resource', '&w_still_running'=>'int'],
-'curl_multi_getcontent' => ['string', 'ch'=>'resource'],
+'curl_multi_getcontent' => ['string|null', 'ch'=>'resource'],
'curl_multi_info_read' => ['array|false', 'mh'=>'resource', '&w_msgs_in_queue='=>'int'],
-'curl_multi_init' => ['resource|false'],
+'curl_multi_init' => ['resource'],
'curl_multi_remove_handle' => ['int', 'mh'=>'resource', 'ch'=>'resource'],
'curl_multi_select' => ['int', 'mh'=>'resource', 'timeout='=>'float'],
'curl_multi_setopt' => ['bool', 'mh'=>'resource', 'option'=>'int', 'value'=>'mixed'],
@@ -1516,8 +1514,8 @@
'curl_share_setopt' => ['bool', 'sh'=>'resource', 'option'=>'int', 'value'=>'mixed'],
'curl_share_strerror' => ['string', 'code'=>'int'],
'curl_strerror' => ['string', 'code'=>'int'],
-'curl_unescape' => ['string', 'ch'=>'resource', 'str'=>'string'],
-'curl_version' => ['array', 'version='=>'int'],
+'curl_unescape' => ['string|false', 'ch'=>'resource', 'str'=>'string'],
+'curl_version' => ['array|false', 'version='=>'int'],
'CURLFile::__construct' => ['void', 'filename'=>'string', 'mimetype='=>'string', 'postfilename='=>'string'],
'CURLFile::__wakeup' => ['void'],
'CURLFile::getFilename' => ['string'],
@@ -1525,7 +1523,7 @@
'CURLFile::getPostFilename' => ['string'],
'CURLFile::setMimeType' => ['void', 'mime'=>'string'],
'CURLFile::setPostFilename' => ['void', 'name'=>'string'],
-'current' => ['mixed', 'array_arg'=>'array'],
+'current' => ['mixed', 'array_arg'=>'array|object'],
'cyrus_authenticate' => ['void', 'connection'=>'resource', 'mechlist='=>'string', 'service='=>'string', 'user='=>'string', 'minssf='=>'int', 'maxssf='=>'int', 'authname='=>'string', 'password='=>'string'],
'cyrus_bind' => ['bool', 'connection'=>'resource', 'callbacks'=>'array'],
'cyrus_close' => ['bool', 'connection'=>'resource'],
@@ -1534,64 +1532,64 @@
'cyrus_unbind' => ['bool', 'connection'=>'resource', 'trigger_name'=>'string'],
'date' => ['string', 'format'=>'string', 'timestamp='=>'int'],
'date_add' => ['DateTime|false', 'object'=>'', 'interval'=>''],
-'date_create' => ['DateTime|false', 'time='=>'string|null', 'timezone='=>'?\DateTimeZone'],
-'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?\DateTimeZone'],
-'date_create_immutable' => ['DateTimeImmutable|false', 'time='=>'string', 'timezone='=>'?\DateTimeZone'],
-'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?\DateTimeZone'],
+'date_create' => ['DateTime|false', 'time='=>'string|null', 'timezone='=>'?DateTimeZone'],
+'date_create_from_format' => ['DateTime|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'],
+'date_create_immutable' => ['DateTimeImmutable|false', 'time='=>'string', 'timezone='=>'?DateTimeZone'],
+'date_create_immutable_from_format' => ['DateTimeImmutable|false', 'format'=>'string', 'time'=>'string', 'timezone='=>'?DateTimeZone'],
'date_date_set' => ['DateTime|false', 'object'=>'', 'year'=>'', 'month'=>'', 'day'=>''],
'date_default_timezone_get' => ['string'],
'date_default_timezone_set' => ['bool', 'timezone_identifier'=>'string'],
'date_diff' => ['DateInterval', 'obj1'=>'DateTimeInterface', 'obj2'=>'DateTimeInterface', 'absolute='=>'bool'],
'date_format' => ['string', 'obj'=>'DateTimeInterface', 'format'=>'string'],
-'date_get_last_errors' => ['array{warning_count: int, warnings: array, error_count: int, errors: array}'],
-'date_interval_create_from_date_string' => ['DateInterval', 'time'=>'string'],
+'date_get_last_errors' => ['array{warning_count: 0|positive-int, warnings: list, error_count: 0|positive-int, errors: list}|false'],
+'date_interval_create_from_date_string' => ['DateInterval|false', 'time'=>'string'],
'date_interval_format' => ['string', 'object'=>'DateInterval', 'format'=>'string'],
'date_isodate_set' => ['DateTime|false', 'object'=>'DateTime', 'year'=>'int', 'week'=>'int', 'day='=>'int|mixed'],
'date_modify' => ['DateTime|false', 'object'=>'DateTime', 'modify'=>'string'],
'date_offset_get' => ['int', 'obj'=>'DateTimeInterface'],
-'date_parse' => ['array|false', 'date'=>'string'],
-'date_parse_from_format' => ['array', 'format'=>'string', 'date'=>'string'],
+'date_parse' => ['array{year: int|false, month: int|false, day: int|false, hour: int|false, minute: int|false, second: int|false, fraction: float|false, warning_count: int, warnings: string[], error_count: int, errors: string[], is_localtime: bool, zone_type?: int|bool, zone?: int|bool, is_dst?: bool, tz_abbr?: string, tz_id?: string, relative?: array{year: int, month: int, day: int, hour: int, minute: int, second: int, weekday?: int, weekdays?: int, first_day_of_month?: bool, last_day_of_month?: bool}}', 'date'=>'string'],
+'date_parse_from_format' => ['array{year: int|false, month: int|false, day: int|false, hour: int|false, minute: int|false, second: int|false, fraction: float|false, warning_count: int, warnings: string[], error_count: int, errors: string[], is_localtime: bool, zone_type?: int|bool, zone?: int|bool, is_dst?: bool, tz_abbr?: string, tz_id?: string, relative?: array{year: int, month: int, day: int, hour: int, minute: int, second: int, weekday?: int, weekdays?: int, first_day_of_month?: bool, last_day_of_month?: bool}}', 'format'=>'string', 'date'=>'string'],
'date_sub' => ['DateTime|false', 'object'=>'DateTime', 'interval'=>'DateInterval'],
-'date_sun_info' => ['array', 'time'=>'int', 'latitude'=>'float', 'longitude'=>'float'],
+'date_sun_info' => ['__benevolent', 'time'=>'int', 'latitude'=>'float', 'longitude'=>'float'],
'date_sunrise' => ['mixed', 'time'=>'int', 'format='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'gmt_offset='=>'float'],
'date_sunset' => ['mixed', 'time'=>'int', 'format='=>'int', 'latitude='=>'float', 'longitude='=>'float', 'zenith='=>'float', 'gmt_offset='=>'float'],
-'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second'=>'', 'microseconds'=>''],
+'date_time_set' => ['DateTime|false', 'object'=>'', 'hour'=>'', 'minute'=>'', 'second='=>'', 'microseconds='=>''],
'date_timestamp_get' => ['int', 'obj'=>'DateTimeInterface'],
'date_timestamp_set' => ['DateTime|false', 'object'=>'DateTime', 'unixtimestamp'=>'int'],
-'date_timezone_get' => ['DateTimeZone', 'obj'=>'DateTimeInterface'],
+'date_timezone_get' => ['DateTimeZone|false', 'obj'=>'DateTimeInterface'],
'date_timezone_set' => ['DateTime|false', 'object'=>'DateTime', 'timezone'=>'DateTimeZone'],
'datefmt_create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'string|DateTimeZone|IntlTimeZone|null', 'calendar='=>'int|IntlCalendar|null', 'pattern='=>'string'],
-'datefmt_format' => ['string', 'fmt'=>'IntlDateFormatter', 'value'=>'DateTime|IntlCalendar|array|int'],
-'datefmt_format_object' => ['string', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
-'datefmt_get_calendar' => ['int', 'fmt'=>'IntlDateFormatter'],
-'datefmt_get_calendar_object' => ['IntlCalendar', 'fmt'=>'IntlDateFormatter'],
-'datefmt_get_datetype' => ['int', 'fmt'=>'IntlDateFormatter'],
+'datefmt_format' => ['string|false', 'fmt'=>'IntlDateFormatter', 'value'=>'DateTime|IntlCalendar|array|int'],
+'datefmt_format_object' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
+'datefmt_get_calendar' => ['int|false', 'fmt'=>'IntlDateFormatter'],
+'datefmt_get_calendar_object' => ['IntlCalendar|false|null', 'fmt'=>'IntlDateFormatter'],
+'datefmt_get_datetype' => ['int|false', 'fmt'=>'IntlDateFormatter'],
'datefmt_get_error_code' => ['int', 'fmt'=>'IntlDateFormatter'],
'datefmt_get_error_message' => ['string', 'fmt'=>'IntlDateFormatter'],
-'datefmt_get_locale' => ['string', 'fmt'=>'IntlDateFormatter', 'which='=>'int'],
-'datefmt_get_pattern' => ['string', 'fmt'=>'IntlDateFormatter'],
-'datefmt_get_timetype' => ['int', 'fmt'=>'IntlDateFormatter'],
-'datefmt_get_timezone' => ['IntlTimeZone'],
-'datefmt_get_timezone_id' => ['string', 'fmt'=>'IntlDateFormatter'],
+'datefmt_get_locale' => ['string|false', 'fmt'=>'IntlDateFormatter', 'which='=>'int'],
+'datefmt_get_pattern' => ['string|false', 'fmt'=>'IntlDateFormatter'],
+'datefmt_get_timetype' => ['int|false', 'fmt'=>'IntlDateFormatter'],
+'datefmt_get_timezone' => ['IntlTimeZone|false'],
+'datefmt_get_timezone_id' => ['string|false', 'fmt'=>'IntlDateFormatter'],
'datefmt_is_lenient' => ['bool', 'fmt'=>'IntlDateFormatter'],
-'datefmt_localtime' => ['array|bool', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
-'datefmt_parse' => ['int|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
+'datefmt_localtime' => ['array|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
+'datefmt_parse' => ['int|float|false', 'fmt'=>'IntlDateFormatter', 'text_to_parse='=>'string', '&rw_parse_pos='=>'int'],
'datefmt_set_calendar' => ['bool', 'fmt'=>'IntlDateFormatter', 'which'=>'int'],
-'datefmt_set_lenient' => ['?bool', 'fmt'=>'IntlDateFormatter', 'lenient'=>'bool'],
+'datefmt_set_lenient' => ['void', 'fmt'=>'IntlDateFormatter', 'lenient'=>'bool'],
'datefmt_set_pattern' => ['bool', 'fmt'=>'IntlDateFormatter', 'pattern'=>'string'],
'datefmt_set_timezone' => ['bool', 'zone'=>'mixed'],
'datefmt_set_timezone_id' => ['bool', 'fmt'=>'IntlDateFormatter', 'zone'=>'string'],
'DateInterval::__construct' => ['void', 'spec'=>'string'],
'DateInterval::__set_state' => ['DateInterval', 'array'=>'array'],
'DateInterval::__wakeup' => ['void'],
-'DateInterval::createFromDateString' => ['DateInterval', 'time'=>'string'],
+'DateInterval::createFromDateString' => ['DateInterval|false', 'time'=>'string'],
'DateInterval::format' => ['string', 'format'=>'string'],
'DatePeriod::__construct' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'recur'=>'int', 'options='=>'int'],
'DatePeriod::__construct\'1' => ['void', 'start'=>'DateTimeInterface', 'interval'=>'DateInterval', 'end'=>'DateTimeInterface', 'options='=>'int'],
'DatePeriod::__construct\'2' => ['void', 'iso'=>'string', 'options='=>'int'],
'DatePeriod::__wakeup' => ['void'],
'DatePeriod::getDateInterval' => ['DateInterval'],
-'DatePeriod::getEndDate' => ['DateTimeInterface'],
+'DatePeriod::getEndDate' => ['?DateTimeInterface'],
'DatePeriod::getStartDate' => ['DateTimeInterface'],
'DateTime::__construct' => ['void', 'time='=>'string', 'timezone='=>'?DateTimeZone'],
'DateTime::__set_state' => ['static', 'array'=>'array'],
@@ -1601,11 +1599,11 @@
'DateTime::createFromImmutable' => ['static', 'object'=>'DateTimeImmutable'],
'DateTime::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'],
'DateTime::format' => ['string', 'format'=>'string'],
-'DateTime::getLastErrors' => ['array{warning_count: int, warnings: array, error_count: int, errors: array}'],
+'DateTime::getLastErrors' => ['array{warning_count: 0|positive-int, warnings: list, error_count: 0|positive-int, errors: list}|false'],
'DateTime::getOffset' => ['int'],
'DateTime::getTimestamp' => ['int'],
'DateTime::getTimezone' => ['DateTimeZone'],
-'DateTime::modify' => ['static', 'modify'=>'string'],
+'DateTime::modify' => ['__benevolent', 'modify'=>'string'],
'DateTime::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'],
'DateTime::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'],
'DateTime::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'],
@@ -1620,11 +1618,11 @@
'DateTimeImmutable::createFromMutable' => ['static', 'datetime'=>'DateTime'],
'DateTimeImmutable::diff' => ['DateInterval', 'datetime2'=>'DateTimeInterface', 'absolute='=>'bool'],
'DateTimeImmutable::format' => ['string', 'format'=>'string'],
-'DateTimeImmutable::getLastErrors' => ['array{warning_count: int, warnings: array, error_count: int, errors: array}'],
+'DateTimeImmutable::getLastErrors' => ['array{warning_count: 0|positive-int, warnings: list, error_count: 0|positive-int, errors: list}|false'],
'DateTimeImmutable::getOffset' => ['int'],
'DateTimeImmutable::getTimestamp' => ['int'],
'DateTimeImmutable::getTimezone' => ['DateTimeZone'],
-'DateTimeImmutable::modify' => ['static', 'modify'=>'string'],
+'DateTimeImmutable::modify' => ['__benevolent', 'modify'=>'string'],
'DateTimeImmutable::setDate' => ['static', 'year'=>'int', 'month'=>'int', 'day'=>'int'],
'DateTimeImmutable::setISODate' => ['static', 'year'=>'int', 'week'=>'int', 'day='=>'int'],
'DateTimeImmutable::setTime' => ['static', 'hour'=>'int', 'minute'=>'int', 'second='=>'int', 'microseconds='=>'int'],
@@ -1639,15 +1637,15 @@
'DateTimeZone::__construct' => ['void', 'timezone'=>'string'],
'DateTimeZone::__set_state' => ['DateTimeZone', 'array'=>'array'],
'DateTimeZone::__wakeup' => ['void'],
-'DateTimeZone::getLocation' => ['array'],
+'DateTimeZone::getLocation' => ['array{country_code: string, latitude: float, longitude: float, comments: string}|false'],
'DateTimeZone::getName' => ['string'],
'DateTimeZone::getOffset' => ['int', 'datetime'=>'DateTimeInterface'],
-'DateTimeZone::getTransitions' => ['array', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'],
-'DateTimeZone::listAbbreviations' => ['array'],
-'DateTimeZone::listIdentifiers' => ['array', 'what='=>'int', 'country='=>'string'],
-'db2_autocommit' => ['mixed', 'connection'=>'resource', 'value='=>'int'],
+'DateTimeZone::getTransitions' => ['list', 'timestamp_begin='=>'int', 'timestamp_end='=>'int'],
+'DateTimeZone::listAbbreviations' => ['array>'],
+'DateTimeZone::listIdentifiers' => ['list', 'what='=>'int', 'country='=>'string'],
+'db2_autocommit' => ['DB2_AUTOCOMMIT_OFF|DB2_AUTOCOMMIT_ON|bool', 'connection'=>'resource', 'value='=>'DB2_AUTOCOMMIT_OFF|DB2_AUTOCOMMIT_ON'],
'db2_bind_param' => ['bool', 'stmt'=>'resource', 'parameter_number'=>'int', 'variable_name'=>'string', 'parameter_type='=>'int', 'data_type='=>'int', 'precision='=>'int', 'scale='=>'int'],
-'db2_client_info' => ['object|false', 'connection'=>'resource'],
+'db2_client_info' => ['stdClass|false', 'connection'=>'resource'],
'db2_close' => ['bool', 'connection'=>'resource'],
'db2_column_privileges' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
'db2_columns' => ['resource|false', 'connection'=>'resource', 'qualifier='=>'string', 'schema='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
@@ -1659,10 +1657,10 @@
'db2_escape_string' => ['string', 'string_literal'=>'string'],
'db2_exec' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'],
'db2_execute' => ['bool', 'stmt'=>'resource', 'parameters='=>'array'],
-'db2_fetch_array' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'],
-'db2_fetch_assoc' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'],
+'db2_fetch_array' => ['non-empty-list|false', 'stmt'=>'resource', 'row_number='=>'int'],
+'db2_fetch_assoc' => ['non-empty-array|false', 'stmt'=>'resource', 'row_number='=>'int'],
'db2_fetch_both' => ['array|false', 'stmt'=>'resource', 'row_number='=>'int'],
-'db2_fetch_object' => ['object|false', 'stmt'=>'resource', 'row_number='=>'int'],
+'db2_fetch_object' => ['stdClass|false', 'stmt'=>'resource', 'row_number='=>'int'],
'db2_fetch_row' => ['bool', 'stmt'=>'resource', 'row_number='=>'int'],
'db2_field_display_size' => ['int|false', 'stmt'=>'resource', 'column'=>'mixed'],
'db2_field_name' => ['string|false', 'stmt'=>'resource', 'column'=>'mixed'],
@@ -1675,11 +1673,11 @@
'db2_free_result' => ['bool', 'stmt'=>'resource'],
'db2_free_stmt' => ['bool', 'stmt'=>'resource'],
'db2_get_option' => ['string|false', 'resource'=>'resource', 'option'=>'string'],
-'db2_last_insert_id' => ['string', 'resource'=>'resource'],
+'db2_last_insert_id' => ['string|null', 'resource'=>'resource'],
'db2_lob_read' => ['string|false', 'stmt'=>'resource', 'colnum'=>'int', 'length'=>'int'],
'db2_next_result' => ['resource|false', 'stmt'=>'resource'],
-'db2_num_fields' => ['int|false', 'stmt'=>'resource'],
-'db2_num_rows' => ['int', 'stmt'=>'resource'],
+'db2_num_fields' => ['0|positive-int|false', 'stmt'=>'resource'],
+'db2_num_rows' => ['0|positive-int|false', 'stmt'=>'resource'],
'db2_pclose' => ['bool', 'resource'=>'resource'],
'db2_pconnect' => ['resource|false', 'database'=>'string', 'username'=>'string', 'password'=>'string', 'options='=>'array'],
'db2_prepare' => ['resource|false', 'connection'=>'resource', 'statement'=>'string', 'options='=>'array'],
@@ -1690,7 +1688,7 @@
'db2_procedures' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'procedure'=>'string'],
'db2_result' => ['mixed', 'stmt'=>'resource', 'column'=>'mixed'],
'db2_rollback' => ['bool', 'connection'=>'resource'],
-'db2_server_info' => ['object|false', 'connection'=>'resource'],
+'db2_server_info' => ['stdClass|false', 'connection'=>'resource'],
'db2_set_option' => ['bool', 'resource'=>'resource', 'options'=>'array', 'type'=>'int'],
'db2_setoption' => [''],
'db2_special_columns' => ['resource|false', 'connection'=>'resource', 'qualifier'=>'string', 'schema'=>'string', 'table_name'=>'string', 'scope'=>'int'],
@@ -1717,18 +1715,18 @@
'dba_popen' => ['resource|false', 'path'=>'string', 'mode'=>'string', 'handlername='=>'string', '...args='=>'string'],
'dba_replace' => ['bool', 'key'=>'string', 'value'=>'string', 'handle'=>'resource'],
'dba_sync' => ['bool', 'handle'=>'resource'],
-'dbase_add_record' => ['bool', 'dbase_identifier'=>'int', 'record'=>'array'],
-'dbase_close' => ['bool', 'dbase_identifier'=>'int'],
-'dbase_create' => ['int', 'filename'=>'string', 'fields'=>'array'],
-'dbase_delete_record' => ['bool', 'dbase_identifier'=>'int', 'record_number'=>'int'],
-'dbase_get_header_info' => ['array', 'dbase_identifier'=>'int'],
-'dbase_get_record' => ['array', 'dbase_identifier'=>'int', 'record_number'=>'int'],
-'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'int', 'record_number'=>'int'],
-'dbase_numfields' => ['int', 'dbase_identifier'=>'int'],
-'dbase_numrecords' => ['int', 'dbase_identifier'=>'int'],
-'dbase_open' => ['int', 'filename'=>'string', 'mode'=>'int'],
-'dbase_pack' => ['bool', 'dbase_identifier'=>'int'],
-'dbase_replace_record' => ['bool', 'dbase_identifier'=>'int', 'record'=>'array', 'record_number'=>'int'],
+'dbase_add_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array'],
+'dbase_close' => ['bool', 'dbase_identifier'=>'resource'],
+'dbase_create' => ['resource|false', 'filename'=>'string', 'fields'=>'array'],
+'dbase_delete_record' => ['bool', 'dbase_identifier'=>'resource', 'record_number'=>'int'],
+'dbase_get_header_info' => ['array', 'dbase_identifier'=>'resource'],
+'dbase_get_record' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'],
+'dbase_get_record_with_names' => ['array', 'dbase_identifier'=>'resource', 'record_number'=>'int'],
+'dbase_numfields' => ['int', 'dbase_identifier'=>'resource'],
+'dbase_numrecords' => ['int', 'dbase_identifier'=>'resource'],
+'dbase_open' => ['resource|false', 'filename'=>'string', 'mode'=>'int'],
+'dbase_pack' => ['bool', 'dbase_identifier'=>'resource'],
+'dbase_replace_record' => ['bool', 'dbase_identifier'=>'resource', 'record'=>'array', 'record_number'=>'int'],
'dbplus_add' => ['int', 'relation'=>'resource', 'tuple'=>'array'],
'dbplus_aql' => ['resource', 'query'=>'string', 'server='=>'string', 'dbpath='=>'string'],
'dbplus_chdir' => ['string', 'newdir='=>'string'],
@@ -1787,7 +1785,7 @@
'dcgettext' => ['string', 'domain_name'=>'string', 'msgid'=>'string', 'category'=>'int'],
'dcngettext' => ['string', 'domain'=>'string', 'msgid1'=>'string', 'msgid2'=>'string', 'n'=>'int', 'category'=>'int'],
'deaggregate' => ['', 'object'=>'object', 'class_name='=>'string'],
-'debug_backtrace' => ['array', 'options='=>'int|bool', 'limit='=>'int'],
+'debug_backtrace' => ['list\',args?:mixed[],object?:object}>', 'options='=>'int|bool', 'limit='=>'int'],
'debug_print_backtrace' => ['void', 'options='=>'int|bool', 'limit='=>'int'],
'debug_zval_dump' => ['void', '...var'=>'mixed'],
'debugger_connect' => [''],
@@ -1796,7 +1794,7 @@
'debugger_print' => [''],
'debugger_start_debug' => [''],
'decbin' => ['string', 'decimal_number'=>'int'],
-'dechex' => ['string', 'decimal_number'=>'int'],
+'dechex' => ['string', 'num'=>'int'],
'decoct' => ['string', 'decimal_number'=>'int'],
'define' => ['bool', 'constant_name'=>'string', 'value'=>'mixed', 'case_insensitive='=>'bool'],
'define_syslog_variables' => ['void'],
@@ -1807,7 +1805,7 @@
'dgettext' => ['string', 'domain_name'=>'string', 'msgid'=>'string'],
'dio_close' => ['void', 'fd'=>'resource'],
'dio_fcntl' => ['mixed', 'fd'=>'resource', 'cmd'=>'int', 'args='=>'mixed'],
-'dio_open' => ['resource', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'],
+'dio_open' => ['resource|false', 'filename'=>'string', 'flags'=>'int', 'mode='=>'int'],
'dio_read' => ['string', 'fd'=>'resource', 'len='=>'int'],
'dio_seek' => ['int', 'fd'=>'resource', 'pos'=>'int', 'whence='=>'int'],
'dio_stat' => ['array|null', 'fd'=>'resource'],
@@ -1855,7 +1853,7 @@
'DirectoryIterator::setFileClass' => ['void', 'class_name='=>'string'],
'DirectoryIterator::setInfoClass' => ['void', 'class_name='=>'string'],
'DirectoryIterator::valid' => ['bool'],
-'dirname' => ['string', 'path'=>'string', 'levels='=>'int'],
+'dirname' => ['string', 'path'=>'string', 'levels='=>'positive-int'],
'disk_free_space' => ['float|false', 'path'=>'string'],
'disk_total_space' => ['float|false', 'path'=>'string'],
'diskfreespace' => ['float|false', 'path'=>'string'],
@@ -1864,7 +1862,7 @@
'dngettext' => ['string', 'domain'=>'string', 'msgid1'=>'string', 'msgid2'=>'string', 'count'=>'int'],
'dns_check_record' => ['bool', 'host'=>'string', 'type='=>'string'],
'dns_get_mx' => ['bool', 'hostname'=>'string', '&w_mxhosts'=>'array', '&w_weight'=>'array'],
-'dns_get_record' => ['array|false', 'hostname'=>'string', 'type='=>'int', '&w_authns='=>'array', '&w_addtl='=>'array', 'raw='=>'bool'],
+'dns_get_record' => ['list|false', 'hostname'=>'string', 'type='=>'int', '&w_authns='=>'array', '&w_addtl='=>'array', 'raw='=>'bool'],
'dom_document_relaxNG_validate_file' => ['bool', 'filename'=>'string'],
'dom_document_relaxNG_validate_xml' => ['bool', 'source'=>'string'],
'dom_document_schema_validate' => ['bool', 'source'=>'string', 'flags'=>'int'],
@@ -1884,7 +1882,7 @@
'DomainException::getLine' => ['int'],
'DomainException::getMessage' => ['string'],
'DomainException::getPrevious' => ['Throwable|DomainException|null'],
-'DomainException::getTrace' => ['array'],
+'DomainException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'DomainException::getTraceAsString' => ['string'],
'DOMAttr::__construct' => ['void', 'name'=>'string', 'value='=>'string'],
'DOMAttr::isId' => ['bool'],
@@ -1900,29 +1898,29 @@
'DOMCharacterData::substringData' => ['string', 'offset'=>'int', 'count'=>'int'],
'DOMComment::__construct' => ['void', 'value='=>'string'],
'DOMDocument::__construct' => ['void', 'version='=>'string', 'encoding='=>'string'],
-'DOMDocument::createAttribute' => ['DOMAttr', 'name'=>'string'],
-'DOMDocument::createAttributeNS' => ['DOMAttr', 'namespaceuri'=>'string', 'qualifiedname'=>'string'],
-'DOMDocument::createCDATASection' => ['DOMCDATASection', 'data'=>'string'],
+'DOMDocument::createAttribute' => ['__benevolent', 'name'=>'string'],
+'DOMDocument::createAttributeNS' => ['__benevolent', 'namespaceuri'=>'string', 'qualifiedname'=>'string'],
+'DOMDocument::createCDATASection' => ['__benevolent', 'data'=>'string'],
'DOMDocument::createComment' => ['DOMComment', 'data'=>'string'],
'DOMDocument::createDocumentFragment' => ['DOMDocumentFragment'],
-'DOMDocument::createElement' => ['DOMElement', 'name'=>'string', 'value='=>'string'],
-'DOMDocument::createElementNS' => ['DOMElement', 'namespaceuri'=>'string', 'qualifiedname'=>'string', 'value='=>'string'],
-'DOMDocument::createEntityReference' => ['DOMEntityReference', 'name'=>'string'],
-'DOMDocument::createProcessingInstruction' => ['DOMProcessingInstruction', 'target'=>'string', 'data='=>'string'],
+'DOMDocument::createElement' => ['__benevolent', 'name'=>'string', 'value='=>'string'],
+'DOMDocument::createElementNS' => ['__benevolent', 'namespaceuri'=>'string', 'qualifiedname'=>'string', 'value='=>'string'],
+'DOMDocument::createEntityReference' => ['__benevolent', 'name'=>'string'],
+'DOMDocument::createProcessingInstruction' => ['__benevolent', 'target'=>'string', 'data='=>'string'],
'DOMDocument::createTextNode' => ['DOMText', 'content'=>'string'],
'DOMDocument::getElementById' => ['DOMElement|null', 'elementid'=>'string'],
'DOMDocument::getElementsByTagName' => ['DOMNodeList', 'name'=>'string'],
'DOMDocument::getElementsByTagNameNS' => ['DOMNodeList', 'namespaceuri'=>'string', 'localname'=>'string'],
'DOMDocument::importNode' => ['DOMNode', 'importednode'=>'DOMNode', 'deep='=>'bool'],
-'DOMDocument::load' => ['mixed', 'filename'=>'string', 'options='=>'int'],
+'DOMDocument::load' => ['bool', 'filename'=>'string', 'options='=>'int'],
'DOMDocument::loadHTML' => ['bool', 'source'=>'string', 'options='=>'int'],
'DOMDocument::loadHTMLFile' => ['bool', 'filename'=>'string', 'options='=>'int'],
-'DOMDocument::loadXML' => ['mixed', 'source'=>'string', 'options='=>'int'],
+'DOMDocument::loadXML' => ['bool', 'source'=>'string', 'options='=>'int'],
'DOMDocument::normalizeDocument' => ['void'],
'DOMDocument::registerNodeClass' => ['bool', 'baseclass'=>'string', 'extendedclass'=>'string'],
'DOMDocument::relaxNGValidate' => ['bool', 'filename'=>'string'],
'DOMDocument::relaxNGValidateSource' => ['bool', 'source'=>'string'],
-'DOMDocument::save' => ['int', 'filename'=>'string', 'options='=>'int'],
+'DOMDocument::save' => ['int|false', 'filename'=>'string', 'options='=>'int'],
'DOMDocument::saveHTML' => ['string|false', 'node='=>'?DOMNode'],
'DOMDocument::saveHTMLFile' => ['int|false', 'filename'=>'string'],
'DOMDocument::saveXML' => ['string|false', 'node='=>'?DOMNode', 'options='=>'int'],
@@ -1970,7 +1968,7 @@
'DOMImplementation::createDocument' => ['DOMDocument', 'namespaceuri='=>'string', 'qualifiedname='=>'string', 'doctype='=>'DOMDocumentType'],
'DOMImplementation::createDocumentType' => ['DOMDocumentType', 'qualifiedname='=>'string', 'publicid='=>'string', 'systemid='=>'string'],
'DOMImplementation::hasFeature' => ['bool', 'feature'=>'string', 'version'=>'string'],
-'DOMNamedNodeMap::count' => ['int'],
+'DOMNamedNodeMap::count' => ['0|positive-int'],
'DOMNamedNodeMap::getNamedItem' => ['?DOMNode', 'name'=>'string'],
'DOMNamedNodeMap::getNamedItemNS' => ['?DOMNode', 'namespaceuri'=>'string', 'localname'=>'string'],
'DOMNamedNodeMap::item' => ['?DOMNode', 'index'=>'int'],
@@ -1988,12 +1986,12 @@
'DOMNode::isDefaultNamespace' => ['bool', 'namespaceuri'=>'string'],
'DOMNode::isSameNode' => ['bool', 'node'=>'DOMNode'],
'DOMNode::isSupported' => ['bool', 'feature'=>'string', 'version'=>'string'],
-'DOMNode::lookupNamespaceURI' => ['string', 'prefix'=>'string'],
+'DOMNode::lookupNamespaceURI' => ['?string', 'prefix'=>'?string'],
'DOMNode::lookupPrefix' => ['string', 'namespaceuri'=>'string'],
'DOMNode::normalize' => ['void'],
'DOMNode::removeChild' => ['DOMNode', 'oldnode'=>'DOMNode'],
'DOMNode::replaceChild' => ['DOMNode', 'newnode'=>'DOMNode', 'oldnode'=>'DOMNode'],
-'DOMNodeList::count' => ['int'],
+'DOMNodeList::count' => ['0|positive-int'],
'DOMNodeList::item' => ['?DOMNode', 'index'=>'int'],
'DOMProcessingInstruction::__construct' => ['void', 'name'=>'string', 'value'=>'string'],
'DomProcessingInstruction::data' => ['string'],
@@ -2001,7 +1999,7 @@
'DOMText::__construct' => ['void', 'value='=>'string'],
'DOMText::isElementContentWhitespace' => ['bool'],
'DOMText::isWhitespaceInElementContent' => ['bool'],
-'DOMText::splitText' => ['DOMText', 'offset'=>'int'],
+'DOMText::splitText' => ['DOMText|false', 'offset'=>'int'],
'domxml_new_doc' => ['DomDocument', 'version'=>'string'],
'domxml_open_file' => ['DomDocument', 'filename'=>'string', 'mode='=>'int', 'error='=>'array'],
'domxml_open_mem' => ['DomDocument', 'str'=>'string', 'mode='=>'int', 'error='=>'array'],
@@ -2012,8 +2010,8 @@
'domxml_xslt_stylesheet_file' => ['DomXsltStylesheet', 'xsl_file'=>'string'],
'domxml_xslt_version' => ['int'],
'DOMXPath::__construct' => ['void', 'doc'=>'DOMDocument'],
-'DOMXPath::evaluate' => ['mixed', 'expression'=>'string', 'contextnode='=>'DOMNode', 'registernodens='=>'bool'],
-'DOMXPath::query' => ['DOMNodeList|false', 'expression'=>'string', 'contextnode='=>'DOMNode', 'registernodens='=>'bool'],
+'DOMXPath::evaluate' => ['mixed', 'expression'=>'string', 'contextnode='=>'?DOMNode', 'registernodens='=>'bool'],
+'DOMXPath::query' => ['DOMNodeList|false', 'expression'=>'string', 'contextnode='=>'?DOMNode', 'registernodens='=>'bool'],
'DOMXPath::registerNamespace' => ['bool', 'prefix'=>'string', 'namespaceuri'=>'string'],
'DOMXPath::registerPhpFunctions' => ['void', 'restrict='=>'mixed'],
'DomXsltStylesheet::process' => ['DomDocument', 'xml_doc'=>'DOMDocument', 'xslt_params='=>'array', 'is_xpath_param='=>'bool', 'profile_filename='=>'string'],
@@ -2021,7 +2019,7 @@
'DomXsltStylesheet::result_dump_mem' => ['string', 'xmldoc'=>'DOMDocument'],
'DOTNET::__construct' => ['void', 'assembly_name'=>'string', 'class_name'=>'string', 'codepage='=>'int'],
'dotnet_load' => ['int', 'assembly_name'=>'string', 'datatype_name='=>'string', 'codepage='=>'int'],
-'doubleval' => ['float', 'var'=>'mixed'],
+'doubleval' => ['float', 'var'=>'scalar|array|resource|null'],
'Ds\Collection::clear' => ['void'],
'Ds\Collection::copy' => ['Ds\Collection'],
'Ds\Collection::isEmpty' => ['bool'],
@@ -2033,7 +2031,7 @@
'Ds\Deque::clear' => ['void'],
'Ds\Deque::contains' => ['bool', '...values='=>'mixed'],
'Ds\Deque::copy' => ['Ds\Deque'],
-'Ds\Deque::count' => ['int'],
+'Ds\Deque::count' => ['0|positive-int'],
'Ds\Deque::filter' => ['Ds\Deque', 'callback='=>'callable'],
'Ds\Deque::find' => ['mixed', 'value'=>'mixed'],
'Ds\Deque::first' => ['mixed'],
@@ -2068,7 +2066,7 @@
'Ds\Map::capacity' => ['int'],
'Ds\Map::clear' => ['void'],
'Ds\Map::copy' => ['Ds\Map'],
-'Ds\Map::count' => ['int'],
+'Ds\Map::count' => ['0|positive-int'],
'Ds\Map::diff' => ['Ds\Map', 'map'=>'Ds\Map'],
'Ds\Map::filter' => ['Ds\Map', 'callback='=>'callable'],
'Ds\Map::first' => ['Ds\Pair'],
@@ -2109,7 +2107,7 @@
'Ds\PriorityQueue::capacity' => ['int'],
'Ds\PriorityQueue::clear' => ['void'],
'Ds\PriorityQueue::copy' => ['Ds\PriorityQueue'],
-'Ds\PriorityQueue::count' => ['int'],
+'Ds\PriorityQueue::count' => ['0|positive-int'],
'Ds\PriorityQueue::isEmpty' => ['bool'],
'Ds\PriorityQueue::jsonSerialize' => ['array'],
'Ds\PriorityQueue::peek' => ['mixed'],
@@ -2121,7 +2119,7 @@
'Ds\Queue::capacity' => ['int'],
'Ds\Queue::clear' => ['void'],
'Ds\Queue::copy' => ['Ds\Queue'],
-'Ds\Queue::count' => ['int'],
+'Ds\Queue::count' => ['0|positive-int'],
'Ds\Queue::isEmpty' => ['bool'],
'Ds\Queue::jsonSerialize' => ['array'],
'Ds\Queue::peek' => ['mixed'],
@@ -2162,7 +2160,7 @@
'Ds\Set::clear' => ['void'],
'Ds\Set::contains' => ['bool', '...values='=>'mixed'],
'Ds\Set::copy' => ['Ds\Set'],
-'Ds\Set::count' => ['int'],
+'Ds\Set::count' => ['0|positive-int'],
'Ds\Set::diff' => ['Ds\Set', 'set'=>'Ds\Set'],
'Ds\Set::filter' => ['Ds\Set', 'callback='=>'callable'],
'Ds\Set::first' => ['mixed'],
@@ -2172,6 +2170,7 @@
'Ds\Set::join' => ['string', 'glue='=>'string'],
'Ds\Set::jsonSerialize' => ['array'],
'Ds\Set::last' => ['mixed'],
+'Ds\Set::map' => ['Ds\Set', 'callback='=>'callable'],
'Ds\Set::merge' => ['Ds\Set', 'values'=>'mixed'],
'Ds\Set::reduce' => ['mixed', 'callback'=>'callable', 'initial='=>'mixed'],
'Ds\Set::remove' => ['void', '...values='=>'mixed'],
@@ -2189,7 +2188,7 @@
'Ds\Stack::capacity' => ['int'],
'Ds\Stack::clear' => ['void'],
'Ds\Stack::copy' => ['Ds\Stack'],
-'Ds\Stack::count' => ['int'],
+'Ds\Stack::count' => ['0|positive-int'],
'Ds\Stack::isEmpty' => ['bool'],
'Ds\Stack::jsonSerialize' => ['array'],
'Ds\Stack::peek' => ['mixed'],
@@ -2203,7 +2202,7 @@
'Ds\Vector::clear' => ['void'],
'Ds\Vector::contains' => ['bool', '...values='=>'mixed'],
'Ds\Vector::copy' => ['Ds\Vector'],
-'Ds\Vector::count' => ['int'],
+'Ds\Vector::count' => ['0|positive-int'],
'Ds\Vector::filter' => ['Ds\Vector', 'callback='=>'callable'],
'Ds\Vector::find' => ['mixed', 'value'=>'mixed'],
'Ds\Vector::first' => ['mixed'],
@@ -2233,7 +2232,6 @@
'each' => ['array', '&rw_arr'=>'array'],
'easter_date' => ['int', 'year='=>'int'],
'easter_days' => ['int', 'year='=>'int', 'method='=>'int'],
-'echo' => ['void', 'arg1'=>'string', '...args='=>'string'],
'eio_busy' => ['resource', 'delay'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_cancel' => ['void', 'req'=>'resource'],
'eio_chmod' => ['resource', 'path'=>'string', 'mode'=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
@@ -2293,7 +2291,6 @@
'eio_unlink' => ['resource', 'path'=>'string', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_utime' => ['resource', 'path'=>'string', 'atime'=>'float', 'mtime'=>'float', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
'eio_write' => ['resource', 'fd'=>'mixed', 'str'=>'string', 'length='=>'int', 'offset='=>'int', 'pri='=>'int', 'callback='=>'callable', 'data='=>'mixed'],
-'empty' => ['bool', 'var'=>'mixed'],
'EmptyIterator::current' => ['mixed'],
'EmptyIterator::key' => ['mixed'],
'EmptyIterator::next' => ['void'],
@@ -2303,19 +2300,19 @@
'enchant_broker_dict_exists' => ['bool', 'broker'=>'resource', 'tag'=>'string'],
'enchant_broker_free' => ['bool', 'broker'=>'resource'],
'enchant_broker_free_dict' => ['bool', 'dict'=>'resource'],
-'enchant_broker_get_dict_path' => ['string', 'broker'=>'resource', 'dict_type'=>'int'],
-'enchant_broker_get_error' => ['string', 'broker'=>'resource'],
-'enchant_broker_init' => ['resource'],
-'enchant_broker_list_dicts' => ['string', 'broker'=>'resource'],
-'enchant_broker_request_dict' => ['resource', 'broker'=>'resource', 'tag'=>'string'],
-'enchant_broker_request_pwl_dict' => ['resource', 'broker'=>'resource', 'filename'=>'string'],
+'enchant_broker_get_dict_path' => ['string|false', 'broker'=>'resource', 'dict_type'=>'int'],
+'enchant_broker_get_error' => ['string|false', 'broker'=>'resource'],
+'enchant_broker_init' => ['resource|false'],
+'enchant_broker_list_dicts' => ['array|false', 'broker'=>'resource'],
+'enchant_broker_request_dict' => ['resource|false', 'broker'=>'resource', 'tag'=>'string'],
+'enchant_broker_request_pwl_dict' => ['resource|false', 'broker'=>'resource', 'filename'=>'string'],
'enchant_broker_set_dict_path' => ['bool', 'broker'=>'resource', 'dict_type'=>'int', 'value'=>'string'],
'enchant_broker_set_ordering' => ['bool', 'broker'=>'resource', 'tag'=>'string', 'ordering'=>'string'],
'enchant_dict_add_to_personal' => ['void', 'dict'=>'resource', 'word'=>'string'],
'enchant_dict_add_to_session' => ['void', 'dict'=>'resource', 'word'=>'string'],
'enchant_dict_check' => ['bool', 'dict'=>'resource', 'word'=>'string'],
'enchant_dict_describe' => ['array', 'dict'=>'resource'],
-'enchant_dict_get_error' => ['string', 'dict'=>'resource'],
+'enchant_dict_get_error' => ['string|false', 'dict'=>'resource'],
'enchant_dict_is_in_session' => ['bool', 'dict'=>'resource', 'word'=>'string'],
'enchant_dict_quick_check' => ['bool', 'dict'=>'resource', 'word'=>'string', 'suggestions='=>'array'],
'enchant_dict_store_replacement' => ['void', 'dict'=>'resource', 'mis'=>'string', 'cor'=>'string'],
@@ -2333,11 +2330,11 @@
'Error::getLine' => ['int'],
'Error::getMessage' => ['string'],
'Error::getPrevious' => ['Throwable|Error|null'],
-'Error::getTrace' => ['array'],
+'Error::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'Error::getTraceAsString' => ['string'],
'error_clear_last' => ['void'],
'error_get_last' => ['?array{type:int,message:string,file:string,line:int}'],
-'error_log' => ['bool', 'message'=>'string', 'message_type='=>'int', 'destination='=>'string', 'extra_headers='=>'string'],
+'error_log' => ['bool', 'message'=>'string', 'message_type='=>'0|1|2|3|4', 'destination='=>'string', 'extra_headers='=>'string'],
'error_reporting' => ['int', 'new_error_level='=>'int'],
'ErrorException::__clone' => ['void'],
'ErrorException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'severity='=>'int', 'filename='=>'string', 'lineno='=>'int', 'previous='=>'(?Throwable)|(?ErrorException)'],
@@ -2348,7 +2345,7 @@
'ErrorException::getMessage' => ['string'],
'ErrorException::getPrevious' => ['Throwable|ErrorException|null'],
'ErrorException::getSeverity' => ['int'],
-'ErrorException::getTrace' => ['array'],
+'ErrorException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'ErrorException::getTraceAsString' => ['string'],
'escapeshellarg' => ['string', 'arg'=>'string'],
'escapeshellcmd' => ['string', 'command'=>'string'],
@@ -2369,7 +2366,6 @@
'Ev::suspend' => ['void'],
'Ev::time' => ['float'],
'Ev::verify' => ['void'],
-'eval' => ['mixed', 'code_str'=>'string'],
'EvCheck::__construct' => ['void', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'],
'EvCheck::createStopped' => ['object', 'callback'=>'string', 'data='=>'string', 'priority='=>'string'],
'EvChild::__construct' => ['void', 'pid'=>'int', 'trace'=>'bool', 'callback'=>'callable', 'data='=>'mixed', 'priority='=>'int'],
@@ -2628,21 +2624,20 @@
'Exception::getLine' => ['int'],
'Exception::getMessage' => ['string'],
'Exception::getPrevious' => ['(?Throwable)|(?Exception)'],
-'Exception::getTrace' => ['array'],
+'Exception::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'Exception::getTraceAsString' => ['string'],
-'exec' => ['string', 'command'=>'string', '&w_output='=>'array', '&w_return_value='=>'int'],
+'exec' => ['string|false', 'command'=>'string', '&w_output='=>'array', '&w_return_value='=>'int'],
'exif_imagetype' => ['int|false', 'imagefile'=>'string'],
'exif_read_data' => ['array|false', 'filename'=>'string|resource', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'],
-'exif_tagname' => ['string', 'index'=>'int'],
-'exif_thumbnail' => ['string', 'filename'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_imagetype='=>'int'],
-'exit' => ['', 'status'=>'string|int'],
+'exif_tagname' => ['string|false', 'index'=>'int'],
+'exif_thumbnail' => ['string|false', 'filename'=>'string', '&w_width='=>'int', '&w_height='=>'int', '&w_imagetype='=>'int'],
'exp' => ['float', 'number'=>'float'],
'expect_expectl' => ['int', 'expect'=>'resource', 'cases'=>'array', 'match='=>'array'],
-'expect_popen' => ['resource', 'command'=>'string'],
-'explode' => ['array|false', 'separator'=>'string', 'str'=>'string', 'limit='=>'int'],
+'expect_popen' => ['resource|false', 'command'=>'string'],
+'explode' => ['list|false', 'separator'=>'string', 'str'=>'string', 'limit='=>'int'],
'expm1' => ['float', 'number'=>'float'],
'extension_loaded' => ['bool', 'extension_name'=>'string'],
-'extract' => ['int', '&rw_var_array'=>'array', 'extract_type='=>'int', 'prefix='=>'string|null'],
+'extract' => ['0|positive-int', 'array'=>'array', 'flags='=>'EXTR_OVERWRITE|EXTR_SKIP|EXTR_PREFIX_SAME|EXTR_PREFIX_ALL|EXTR_PREFIX_INVALID|EXTR_IF_EXISTS|EXTR_PREFIX_IF_EXISTS|EXTR_REFS', 'prefix='=>'string|null'],
'ezmlm_hash' => ['int', 'addr'=>'string'],
'fam_cancel_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'],
'fam_close' => ['void', 'fam'=>'resource'],
@@ -2650,7 +2645,7 @@
'fam_monitor_directory' => ['resource', 'fam'=>'resource', 'dirname'=>'string'],
'fam_monitor_file' => ['resource', 'fam'=>'resource', 'filename'=>'string'],
'fam_next_event' => ['array', 'fam'=>'resource'],
-'fam_open' => ['resource', 'appname='=>'string'],
+'fam_open' => ['resource|false', 'appname='=>'string'],
'fam_pending' => ['int', 'fam'=>'resource'],
'fam_resume_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'],
'fam_suspend_monitor' => ['bool', 'fam'=>'resource', 'fam_monitor'=>'resource'],
@@ -2879,7 +2874,7 @@
'fdf_get_version' => ['string', 'fdf_document='=>'resource'],
'fdf_header' => ['void'],
'fdf_next_field_name' => ['string', 'fdf_document'=>'resource', 'fieldname='=>'string'],
-'fdf_open' => ['resource', 'filename'=>'string'],
+'fdf_open' => ['resource|false', 'filename'=>'string'],
'fdf_open_string' => ['resource', 'fdf_data'=>'string'],
'fdf_remove_item' => ['bool', 'fdf_document'=>'resource', 'fieldname'=>'string', 'item'=>'int'],
'fdf_save' => ['bool', 'fdf_document'=>'resource', 'filename='=>'string'],
@@ -2937,13 +2932,13 @@
'ffmpeg_movie::hasAudio' => ['bool'],
'ffmpeg_movie::hasVideo' => ['bool'],
'fgetc' => ['string|false', 'fp'=>'resource'],
-'fgetcsv' => ['(?array)|(?false)', 'fp'=>'resource', 'length='=>'int', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
-'fgets' => ['string|false', 'fp'=>'resource', 'length='=>'int'],
-'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'int', 'allowable_tags='=>'string'],
-'file' => ['array|false', 'filename'=>'string', 'flags='=>'int', 'context='=>'resource'],
+'fgetcsv' => ['list|array{0: null}|false|null', 'fp'=>'resource', 'length='=>'0|positive-int|null', 'delimiter='=>'string', 'enclosure='=>'string', 'escape='=>'string'],
+'fgets' => ['string|false', 'fp'=>'resource', 'length='=>'0|positive-int'],
+'fgetss' => ['string|false', 'fp'=>'resource', 'length='=>'0|positive-int', 'allowable_tags='=>'string'],
+'file' => ['list|false', 'filename'=>'string', 'flags='=>'int-mask', 'context='=>'resource'],
'file_exists' => ['bool', 'filename'=>'string'],
-'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'maxlen='=>'int'],
-'file_put_contents' => ['int|false', 'file'=>'string', 'data'=>'mixed', 'flags='=>'int', 'context='=>'resource'],
+'file_get_contents' => ['string|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'?resource', 'offset='=>'int', 'maxlen='=>'0|positive-int'],
+'file_put_contents' => ['0|positive-int|false', 'file'=>'string', 'data'=>'mixed', 'flags='=>'int', 'context='=>'?resource'],
'fileatime' => ['int|false', 'filename'=>'string'],
'filectime' => ['int|false', 'filename'=>'string'],
'filegroup' => ['int|false', 'filename'=>'string'],
@@ -2958,7 +2953,7 @@
'filepro_fieldwidth' => ['int', 'field_number'=>'int'],
'filepro_retrieve' => ['string', 'row_number'=>'int', 'field_number'=>'int'],
'filepro_rowcount' => ['int'],
-'filesize' => ['int|false', 'filename'=>'string'],
+'filesize' => ['0|positive-int|false', 'filename'=>'string'],
'FilesystemIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'],
'FilesystemIterator::current' => ['string|SplFileInfo'],
'FilesystemIterator::getFlags' => ['int'],
@@ -2970,11 +2965,11 @@
'filter_has_var' => ['bool', 'type'=>'int', 'variable_name'=>'string'],
'filter_id' => ['int|false', 'filtername'=>'string'],
'filter_input' => ['mixed', 'type'=>'int', 'variable_name'=>'string', 'filter='=>'int', 'options='=>'array|int'],
-'filter_input_array' => ['mixed', 'type'=>'int', 'definition='=>'int|array', 'add_empty='=>'bool'],
-'filter_list' => ['array'],
+'filter_input_array' => ['array|false|null', 'type'=>'int', 'definition='=>'int|array', 'add_empty='=>'bool'],
+'filter_list' => ['non-empty-list'],
'filter_var' => ['mixed', 'variable'=>'mixed', 'filter='=>'int', 'options='=>'mixed'],
-'filter_var_array' => ['mixed', 'data'=>'array', 'definition='=>'mixed', 'add_empty='=>'bool'],
-'FilterIterator::__construct' => ['void', 'it'=>'iterator'],
+'filter_var_array' => ['array|false|null', 'data'=>'array', 'definition='=>'mixed', 'add_empty='=>'bool'],
+'FilterIterator::__construct' => ['void', 'iterator'=>'Iterator'],
'FilterIterator::accept' => ['bool'],
'FilterIterator::current' => ['mixed'],
'FilterIterator::getInnerIterator' => ['Iterator'],
@@ -2992,31 +2987,31 @@
'finfo_file' => ['string|false', 'finfo'=>'resource', 'file_name'=>'string', 'options='=>'int', 'context='=>'resource'],
'finfo_open' => ['resource|false', 'options='=>'int', 'arg='=>'string'],
'finfo_set_flags' => ['bool', 'finfo'=>'resource', 'options'=>'int'],
-'floatval' => ['float', 'var'=>'mixed'],
-'flock' => ['bool', 'fp'=>'resource', 'operation'=>'int', '&w_wouldblock='=>'int'],
-'floor' => ['float', 'number'=>'float'],
+'floatval' => ['float', 'var'=>'scalar|array|resource|null'],
+'flock' => ['bool', 'fp'=>'resource', 'operation'=>'int-mask', '&w_wouldblock='=>'0|1'],
+'floor' => ['__benevolent', 'number'=>'float'],
'flush' => ['void'],
'fmod' => ['float', 'x'=>'float', 'y'=>'float'],
'fnmatch' => ['bool', 'pattern'=>'string', 'filename'=>'string', 'flags='=>'int'],
-'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'],
+'fopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'bool', 'context='=>'resource|null'],
'forward_static_call' => ['mixed', 'function'=>'callable', '...parameters='=>'mixed'],
'forward_static_call_array' => ['mixed', 'function'=>'callable', 'parameters'=>'array'],
-'fpassthru' => ['int|false', 'fp'=>'resource'],
-'fpm_get_status' => ['array|false'],
-'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...args='=>'string|int|float'],
-'fputcsv' => ['int|false', 'fp'=>'resource', 'fields'=>'array', 'delimiter='=>'string', 'enclosure='=>'string', 'escape_char='=>'string'],
-'fputs' => ['int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'int'],
-'fread' => ['string|false', 'fp'=>'resource', 'length'=>'int'],
+'fpassthru' => ['0|positive-int|false', 'fp'=>'resource'],
+'fpm_get_status' => ['array{pool: string, process-manager: \'dynamic\'|\'ondemand\'|\'static\', start-time: int<0, max>, start-since: int<0, max>, accepted-conn: int<0, max>, listen-queue: int<0, max>, max-listen-queue: int<0, max>, listen-queue-len: int<0, max>, idle-processes: int<0, max>, active-processes: int<1, max>, total-processes: int<1, max>, max-active-processes: int<1, max>, max-children-reached: 0|1, slow-requests: int<0, max>, procs: array, state: \'Idle\'|\'Running\', start-time: int<0, max>, start-since: int<0, max>, requests: int<0, max>, request-duration: int<0, max>, request-method: string, request-uri: string, query-string: string, request-length: int<0, max>, user: string, script: string, last-request-cpu: float, last-request-memory: int<0, max>}>}|false'],
+'fprintf' => ['int', 'stream'=>'resource', 'format'=>'string', '...values='=>'__stringAndStringable|int|float|null|bool'],
+'fputcsv' => ['0|positive-int|false', 'fp'=>'resource', 'fields'=>'array', 'delimiter='=>'string', 'enclosure='=>'string', 'escape_char='=>'string'],
+'fputs' => ['0|positive-int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'0|positive-int'],
+'fread' => ['string', 'fp'=>'resource', 'length'=>'positive-int'],
'frenchtojd' => ['int', 'month'=>'int', 'day'=>'int', 'year'=>'int'],
'fribidi_log2vis' => ['string', 'str'=>'string', 'direction'=>'string', 'charset'=>'int'],
-'fscanf' => ['array|int', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float|null'],
-'fseek' => ['int', 'fp'=>'resource', 'offset'=>'int', 'whence='=>'int'],
+'fscanf' => ['list|int|false', 'stream'=>'resource', 'format'=>'string', '&...w_vars='=>'string|int|float|null'],
+'fseek' => ['0|-1', 'fp'=>'resource', 'offset'=>'int', 'whence='=>'int'],
'fsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_errno='=>'int', '&w_errstr='=>'string', 'timeout='=>'float'],
'fstat' => ['array|false', 'fp'=>'resource'],
'ftell' => ['int|false', 'fp'=>'resource'],
'ftok' => ['int', 'pathname'=>'string', 'proj'=>'string'],
'ftp_alloc' => ['bool', 'stream'=>'resource', 'size'=>'int', '&w_response='=>'string'],
-'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'int'],
+'ftp_append' => ['bool', 'ftp'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY'],
'ftp_cdup' => ['bool', 'stream'=>'resource'],
'ftp_chdir' => ['bool', 'stream'=>'resource', 'directory'=>'string'],
'ftp_chmod' => ['int|false', 'stream'=>'resource', 'mode'=>'int', 'filename'=>'string'],
@@ -3024,22 +3019,22 @@
'ftp_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'],
'ftp_delete' => ['bool', 'stream'=>'resource', 'file'=>'string'],
'ftp_exec' => ['bool', 'stream'=>'resource', 'command'=>'string'],
-'ftp_fget' => ['bool', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'int', 'resumepos='=>'int'],
-'ftp_fput' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'int', 'startpos='=>'int'],
-'ftp_get' => ['bool', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'int', 'resume_pos='=>'int'],
+'ftp_fget' => ['bool', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resumepos='=>'int'],
+'ftp_fput' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
+'ftp_get' => ['bool', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resume_pos='=>'int'],
'ftp_get_option' => ['mixed', 'stream'=>'resource', 'option'=>'int'],
'ftp_login' => ['bool', 'stream'=>'resource', 'username'=>'string', 'password'=>'string'],
'ftp_mdtm' => ['int', 'stream'=>'resource', 'filename'=>'string'],
'ftp_mkdir' => ['string|false', 'stream'=>'resource', 'directory'=>'string'],
-'ftp_mlsd' => ['array', 'ftp_stream'=>'resource', 'directory'=>'string'],
+'ftp_mlsd' => ['array|false', 'ftp_stream'=>'resource', 'directory'=>'string'],
'ftp_nb_continue' => ['int', 'stream'=>'resource'],
-'ftp_nb_fget' => ['int', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode'=>'int', 'resumepos='=>'int'],
-'ftp_nb_fput' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode'=>'int', 'startpos='=>'int'],
-'ftp_nb_get' => ['int', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode'=>'int', 'resume_pos='=>'int'],
-'ftp_nb_put' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode'=>'int', 'startpos='=>'int'],
+'ftp_nb_fget' => ['int', 'stream'=>'resource', 'fp'=>'resource', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resumepos='=>'int'],
+'ftp_nb_fput' => ['int', 'stream'=>'resource', 'remote_file'=>'string', 'fp'=>'resource', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
+'ftp_nb_get' => ['int|false', 'stream'=>'resource', 'local_file'=>'string', 'remote_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'resume_pos='=>'int'],
+'ftp_nb_put' => ['int|false', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
'ftp_nlist' => ['array|false', 'stream'=>'resource', 'directory'=>'string'],
'ftp_pasv' => ['bool', 'stream'=>'resource', 'pasv'=>'bool'],
-'ftp_put' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode'=>'int', 'startpos='=>'int'],
+'ftp_put' => ['bool', 'stream'=>'resource', 'remote_file'=>'string', 'local_file'=>'string', 'mode='=>'FTP_ASCII|FTP_BINARY', 'startpos='=>'int'],
'ftp_pwd' => ['string|false', 'stream'=>'resource'],
'ftp_raw' => ['array', 'stream'=>'resource', 'command'=>'string'],
'ftp_rawlist' => ['array|false', 'stream'=>'resource', 'directory'=>'string', 'recursive='=>'bool'],
@@ -3050,12 +3045,12 @@
'ftp_size' => ['int', 'stream'=>'resource', 'filename'=>'string'],
'ftp_ssl_connect' => ['resource|false', 'host'=>'string', 'port='=>'int', 'timeout='=>'int'],
'ftp_systype' => ['string|false', 'stream'=>'resource'],
-'ftruncate' => ['bool', 'fp'=>'resource', 'size'=>'int'],
-'func_get_arg' => ['mixed', 'arg_num'=>'int'],
-'func_get_args' => ['array'],
-'func_num_args' => ['int'],
+'ftruncate' => ['bool', 'fp'=>'resource', 'size'=>'0|positive-int'],
+'func_get_arg' => ['mixed', 'arg_num'=>'0|positive-int'],
+'func_get_args' => ['list'],
+'func_num_args' => ['0|positive-int'],
'function_exists' => ['bool', 'function_name'=>'string'],
-'fwrite' => ['int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'int'],
+'fwrite' => ['0|positive-int|false', 'fp'=>'resource', 'str'=>'string', 'length='=>'0|positive-int'],
'gc_collect_cycles' => ['int'],
'gc_disable' => ['void'],
'gc_enable' => ['void'],
@@ -3302,60 +3297,60 @@
'get_called_class' => ['class-string'],
'get_cfg_var' => ['mixed', 'option_name'=>'string'],
'get_class' => ['class-string', 'object='=>'object'],
-'get_class_methods' => ['array', 'class'=>'mixed'],
+'get_class_methods' => ['list', 'class'=>'mixed'],
'get_class_vars' => ['array', 'class_name'=>'string'],
'get_current_user' => ['string'],
-'get_declared_classes' => ['array'],
-'get_declared_interfaces' => ['array'],
-'get_declared_traits' => ['array'],
-'get_defined_constants' => ['array', 'categorize='=>'bool'],
-'get_defined_functions' => ['array>', 'exclude_disabled='=>'bool'],
-'get_defined_vars' => ['array'],
-'get_extension_funcs' => ['array', 'extension_name'=>'string'],
+'get_declared_classes' => ['list'],
+'get_declared_interfaces' => ['list'],
+'get_declared_traits' => ['list'],
+'get_defined_constants' => ['array', 'categorize='=>'bool'],
+'get_defined_functions' => ['array{internal:non-empty-list,user:list}', 'exclude_disabled='=>'bool'],
+'get_defined_vars' => ['array'],
+'get_extension_funcs' => ['list|false', 'extension_name'=>'string'],
'get_headers' => ['array|false', 'url'=>'string', 'format='=>'int', 'context='=>'resource'],
'get_html_translation_table' => ['array', 'table='=>'int', 'flags='=>'int', 'encoding='=>'string'],
-'get_include_path' => ['string'],
-'get_included_files' => ['array'],
-'get_loaded_extensions' => ['array', 'zend_extensions='=>'bool'],
-'get_magic_quotes_gpc' => ['bool'],
-'get_magic_quotes_runtime' => ['bool'],
-'get_meta_tags' => ['array', 'filename'=>'string', 'use_include_path='=>'bool'],
+'get_include_path' => ['__benevolent'],
+'get_included_files' => ['list'],
+'get_loaded_extensions' => ['list', 'zend_extensions='=>'bool'],
+'get_magic_quotes_gpc' => ['false'],
+'get_magic_quotes_runtime' => ['false'],
+'get_meta_tags' => ['array|false', 'filename'=>'string', 'use_include_path='=>'bool'],
'get_object_vars' => ['array', 'obj'=>'object'],
'get_parent_class' => ['class-string|false', 'object='=>'mixed'],
-'get_required_files' => ['string[]'],
+'get_required_files' => ['list'],
'get_resource_type' => ['string', 'res'=>'resource'],
-'get_resources' => ['resource[]', 'resource_type'=>'string'],
+'get_resources' => ['array', 'type='=>'string'],
'getallheaders' => ['array'],
-'getcwd' => ['string|false'],
-'getdate' => ['array', 'timestamp='=>'int'],
+'getcwd' => ['non-empty-string|false'],
+'getdate' => ['array{seconds: int<0, 59>, minutes: int<0, 59>, hours: int<0, 23>, mday: int<1, 31>, wday: int<0, 6>, mon: int<1, 12>, year: int, yday: int<0, 365>, weekday: "Monday"|"Tuesday"|"Wednesday"|"Thursday"|"Friday"|"Saturday"|"Sunday", month: "January"|"February"|"March"|"April"|"May"|"June"|"July"|"August"|"September"|"October"|"November"|"December", 0: int}', 'timestamp='=>'int'],
'getenv' => ['string|false', 'varname'=>'string', 'local_only='=>'bool'],
-'getenv\'1' => ['string[]'],
+'getenv\'1' => ['array'],
'gethostbyaddr' => ['string|false', 'ip_address'=>'string'],
'gethostbyname' => ['string', 'hostname'=>'string'],
-'gethostbynamel' => ['array|false', 'hostname'=>'string'],
+'gethostbynamel' => ['list|false', 'hostname'=>'string'],
'gethostname' => ['string|false'],
-'getimagesize' => ['array|false', 'imagefile'=>'string', '&w_info='=>'array'],
-'getimagesizefromstring' => ['array|false', 'data'=>'string', '&w_info='=>'array'],
-'getlastmod' => ['int'],
+'getimagesize' => ['array{0: 0|positive-int, 1: 0|positive-int, 2: int, 3: string, mime: string, channels?: int, bits?: int}|false', 'imagefile'=>'string', '&w_info='=>'array'],
+'getimagesizefromstring' => ['array{0: 0|positive-int, 1: 0|positive-int, 2: int, 3: string, mime: string, channels?: int, bits?: int}|false', 'data'=>'string', '&w_info='=>'array'],
+'getlastmod' => ['int|false'],
'getmxrr' => ['bool', 'hostname'=>'string', '&w_mxhosts'=>'array', '&w_weight='=>'array'],
-'getmygid' => ['int'],
-'getmyinode' => ['int'],
-'getmypid' => ['int'],
-'getmyuid' => ['int'],
-'getopt' => ['array|array|array>', 'options'=>'string', 'longopts='=>'array', '&w_optind='=>'int'],
+'getmygid' => ['int|false'],
+'getmyinode' => ['int|false'],
+'getmypid' => ['int|false'],
+'getmyuid' => ['int|false'],
+'getopt' => ['__benevolent|array|array>|false>', 'options'=>'string', 'longopts='=>'array', '&w_optind='=>'int'],
'getprotobyname' => ['int|false', 'name'=>'string'],
-'getprotobynumber' => ['string', 'proto'=>'int'],
+'getprotobynumber' => ['string|false', 'proto'=>'int'],
'getrandmax' => ['int'],
-'getrusage' => ['array', 'who='=>'int'],
+'getrusage' => ['array|false', 'who='=>'int'],
'getservbyname' => ['int|false', 'service'=>'string', 'protocol'=>'string'],
'getservbyport' => ['string|false', 'port'=>'int', 'protocol'=>'string'],
'gettext' => ['string', 'msgid'=>'string'],
'gettimeofday' => ['array|float', 'get_as_float='=>'bool'],
'gettype' => ['string', 'var'=>'mixed'],
-'glob' => ['array|false', 'pattern'=>'string', 'flags='=>'int'],
+'glob' => ['list|false', 'pattern'=>'string', 'flags='=>'int'],
'GlobIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'],
'GlobIterator::cont' => ['int'],
-'GlobIterator::count' => ['int'],
+'GlobIterator::count' => ['0|positive-int'],
'Gmagick::__construct' => ['void', 'filename='=>'string'],
'Gmagick::addimage' => ['Gmagick', 'gmagick'=>'gmagick'],
'Gmagick::addnoiseimage' => ['Gmagick', 'noise'=>'int'],
@@ -3538,7 +3533,7 @@
'GmagickPixel::setcolor' => ['GmagickPixel', 'color'=>'string'],
'GmagickPixel::setcolorvalue' => ['GmagickPixel', 'color'=>'int', 'value'=>'float'],
'gmdate' => ['string', 'format'=>'string', 'timestamp='=>'int'],
-'gmmktime' => ['int', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'],
+'gmmktime' => ['int|false', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'],
'GMP::__construct' => ['void'],
'GMP::__toString' => ['string'],
'GMP::serialize' => ['string'],
@@ -3550,7 +3545,7 @@
'gmp_clrbit' => ['void', 'a'=>'GMP|string|int', 'index'=>'int'],
'gmp_cmp' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
'gmp_com' => ['GMP', 'a'=>'GMP|string|int'],
-'gmp_div' => ['resource', 'a'=>'GMP|resource|string', 'b'=>'GMP|resource|string', 'round='=>'int'],
+'gmp_div' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
'gmp_div_q' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
'gmp_div_qr' => ['array', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
'gmp_div_r' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int', 'round='=>'int'],
@@ -3563,7 +3558,7 @@
'gmp_import' => ['GMP', 'data'=>'string', 'word_size='=>'int', 'options='=>'int'],
'gmp_init' => ['GMP', 'number'=>'int|string', 'base='=>'int'],
'gmp_intval' => ['int', 'gmpnumber'=>'GMP|string|int'],
-'gmp_invert' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
+'gmp_invert' => ['GMP|false', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
'gmp_jacobi' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
'gmp_kronecker' => ['int', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
'gmp_lcm' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
@@ -3595,54 +3590,62 @@
'gmp_sub' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
'gmp_testbit' => ['bool', 'a'=>'GMP|string|int', 'index'=>'int'],
'gmp_xor' => ['GMP', 'a'=>'GMP|string|int', 'b'=>'GMP|string|int'],
-'gmstrftime' => ['string', 'format'=>'string', 'timestamp='=>'int'],
+'gmstrftime' => ['string|false', 'format'=>'string', 'timestamp='=>'int'],
'gnupg::adddecryptkey' => ['bool', 'fingerprint'=>'string', 'passphrase'=>'string'],
'gnupg::addencryptkey' => ['bool', 'fingerprint'=>'string'],
'gnupg::addsignkey' => ['bool', 'fingerprint'=>'string', 'passphrase='=>'string'],
'gnupg::cleardecryptkeys' => ['bool'],
'gnupg::clearencryptkeys' => ['bool'],
'gnupg::clearsignkeys' => ['bool'],
-'gnupg::decrypt' => ['string', 'text'=>'string'],
-'gnupg::decryptverify' => ['array', 'text'=>'string', '&plaintext'=>'string'],
-'gnupg::encrypt' => ['string', 'plaintext'=>'string'],
-'gnupg::encryptsign' => ['string', 'plaintext'=>'string'],
-'gnupg::export' => ['string', 'fingerprint'=>'string'],
-'gnupg::geterror' => ['string'],
+'gnupg::decrypt' => ['string|false', 'text'=>'string'],
+'gnupg::deletekey' => ['bool', 'key'=>'string', 'allow_secret'=>'bool'],
+'gnupg::decryptverify' => ['array|false', 'text'=>'string', '&plaintext'=>'string'],
+'gnupg::encrypt' => ['string|false', 'plaintext'=>'string'],
+'gnupg::encryptsign' => ['string|false', 'plaintext'=>'string'],
+'gnupg::export' => ['string|false', 'fingerprint'=>'string'],
+'gnupg::getengineinfo' => ['array'],
+'gnupg::geterror' => ['string|false'],
'gnupg::getprotocol' => ['int'],
-'gnupg::import' => ['array', 'keydata'=>'string'],
-'gnupg::init' => ['resource'],
-'gnupg::keyinfo' => ['array', 'pattern'=>'string'],
+'gnupg::gettrustlist' => ['array', 'pattern'=>'string'],
+'gnupg::import' => ['array|false', 'keydata'=>'string'],
+'gnupg::init' => ['resource', 'options'=>'?array{file_name?:string,home_dir?:string}'],
+'gnupg::keyinfo' => ['array|false', 'pattern'=>'string'],
+'gnupg::listsignatures' => ['?array', 'keyid'=>'string'],
'gnupg::setarmor' => ['bool', 'armor'=>'int'],
'gnupg::seterrormode' => ['void', 'errormode'=>'int'],
'gnupg::setsignmode' => ['bool', 'signmode'=>'int'],
-'gnupg::sign' => ['string', 'plaintext'=>'string'],
-'gnupg::verify' => ['array', 'signed_text'=>'string', 'signature'=>'string', '&plaintext='=>'string'],
+'gnupg::sign' => ['string|false', 'plaintext'=>'string'],
+'gnupg::verify' => ['array|false', 'signed_text'=>'string', 'signature'=>'string|false', '&plaintext='=>'string'],
'gnupg_adddecryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase'=>'string'],
'gnupg_addencryptkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string'],
'gnupg_addsignkey' => ['bool', 'identifier'=>'resource', 'fingerprint'=>'string', 'passphrase='=>'string'],
'gnupg_cleardecryptkeys' => ['bool', 'identifier'=>'resource'],
'gnupg_clearencryptkeys' => ['bool', 'identifier'=>'resource'],
'gnupg_clearsignkeys' => ['bool', 'identifier'=>'resource'],
-'gnupg_decrypt' => ['string', 'identifier'=>'resource', 'text'=>'string'],
+'gnupg_decrypt' => ['string|false', 'identifier'=>'resource', 'text'=>'string'],
'gnupg_decryptverify' => ['array', 'identifier'=>'resource', 'text'=>'string', 'plaintext'=>'string'],
-'gnupg_encrypt' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'],
-'gnupg_encryptsign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'],
-'gnupg_export' => ['string', 'identifier'=>'resource', 'fingerprint'=>'string'],
-'gnupg_geterror' => ['string', 'identifier'=>'resource'],
+'gnupg_deletekey' => ['bool', 'identifier'=>'resource', 'key'=>'string', 'allow_secret'=>'bool'],
+'gnupg_encrypt' => ['string|false', 'identifier'=>'resource', 'plaintext'=>'string'],
+'gnupg_encryptsign' => ['string|false', 'identifier'=>'resource', 'plaintext'=>'string'],
+'gnupg_export' => ['string|false', 'identifier'=>'resource', 'fingerprint'=>'string'],
+'gnupg_getengineinfo' => ['array', 'identifier'=>'resource'],
+'gnupg_geterror' => ['string|false', 'identifier'=>'resource'],
'gnupg_getprotocol' => ['int', 'identifier'=>'resource'],
-'gnupg_import' => ['array', 'identifier'=>'resource', 'keydata'=>'string'],
-'gnupg_init' => ['resource'],
-'gnupg_keyinfo' => ['array', 'identifier'=>'resource', 'pattern'=>'string'],
+'gnupg_gettrustlist' => ['array', 'identifier'=>'resource', 'pattern'=>'string'],
+'gnupg_import' => ['array|false', 'identifier'=>'resource', 'keydata'=>'string'],
+'gnupg_init' => ['resource', 'options='=>'?array{file_name?:string,home_dir?:string}'],
+'gnupg_keyinfo' => ['array|false', 'identifier'=>'resource', 'pattern'=>'string'],
+'gnupg_listsignatures' => ['?array', 'identifier'=>'resource', 'keyid'=>'string'],
'gnupg_setarmor' => ['bool', 'identifier'=>'resource', 'armor'=>'int'],
'gnupg_seterrormode' => ['void', 'identifier'=>'resource', 'errormode'=>'int'],
'gnupg_setsignmode' => ['bool', 'identifier'=>'resource', 'signmode'=>'int'],
-'gnupg_sign' => ['string', 'identifier'=>'resource', 'plaintext'=>'string'],
-'gnupg_verify' => ['array', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string', 'plaintext='=>'string'],
+'gnupg_sign' => ['string|false', 'identifier'=>'resource', 'plaintext'=>'string'],
+'gnupg_verify' => ['array|false', 'identifier'=>'resource', 'signed_text'=>'string', 'signature'=>'string|false', '&plaintext='=>'string'],
'gopher_parsedir' => ['array', 'dirent'=>'string'],
'grapheme_extract' => ['string|false', 'str'=>'string', 'size'=>'int', 'extract_type='=>'int', 'start='=>'int', '&w_next='=>'int'],
'grapheme_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
'grapheme_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool'],
-'grapheme_strlen' => ['int|false', 'str'=>'string'],
+'grapheme_strlen' => ['0|positive-int|false', 'str'=>'string'],
'grapheme_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
'grapheme_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
'grapheme_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int'],
@@ -3665,7 +3668,7 @@
'Grpc\ChannelCredentials::createComposite' => ['Grpc\ChannelCredentials', 'cred1'=>'Grpc\ChannelCredentials', 'cred2'=>'Grpc\CallCredentials'],
'Grpc\ChannelCredentials::createDefault' => ['Grpc\ChannelCredentials'],
'Grpc\ChannelCredentials::createInsecure' => ['null'],
-'Grpc\ChannelCredentials::createSsl' => ['Grpc\ChannelCredentials', 'pem_root_certs'=>'string', 'pem_private_key='=>'string', 'pem_cert_chain='=>'string'],
+'Grpc\ChannelCredentials::createSsl' => ['Grpc\ChannelCredentials', 'pem_root_certs='=>'string|null', 'pem_private_key='=>'string|null', 'pem_cert_chain='=>'string|null'],
'Grpc\ChannelCredentials::setDefaultRootsPem' => ['', 'pem_roots'=>'string'],
'Grpc\Server::__construct' => ['void', 'args'=>'array'],
'Grpc\Server::addHttp2Port' => ['bool', 'addr'=>'string'],
@@ -3727,21 +3730,21 @@
'gzdecode' => ['string|false', 'data'=>'string', 'length='=>'int'],
'gzdeflate' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding='=>'int'],
'gzencode' => ['string|false', 'data'=>'string', 'level='=>'int', 'encoding_mode='=>'int'],
-'gzeof' => ['int', 'zp'=>'resource'],
-'gzfile' => ['array', 'filename'=>'string', 'use_include_path='=>'int'],
+'gzeof' => ['bool', 'zp'=>'resource'],
+'gzfile' => ['list|false', 'filename'=>'string', 'use_include_path='=>'int'],
'gzgetc' => ['string|false', 'zp'=>'resource'],
'gzgets' => ['string|false', 'zp'=>'resource', 'length='=>'int'],
'gzgetss' => ['string|false', 'zp'=>'resource', 'length'=>'int', 'allowable_tags='=>'string'],
'gzinflate' => ['string|false', 'data'=>'string', 'length='=>'int'],
'gzopen' => ['resource|false', 'filename'=>'string', 'mode'=>'string', 'use_include_path='=>'int'],
'gzpassthru' => ['int|false', 'zp'=>'resource'],
-'gzputs' => ['int', 'zp'=>'resource', 'string'=>'string', 'length='=>'int'],
-'gzread' => ['string', 'zp'=>'resource', 'length'=>'int'],
+'gzputs' => ['int|false', 'zp'=>'resource', 'string'=>'string', 'length='=>'int'],
+'gzread' => ['string|false', 'zp'=>'resource', 'length'=>'int'],
'gzrewind' => ['bool', 'zp'=>'resource'],
'gzseek' => ['int', 'zp'=>'resource', 'offset'=>'int', 'whence='=>'int'],
'gztell' => ['int|false', 'zp'=>'resource'],
'gzuncompress' => ['string|false', 'data'=>'string', 'length='=>'int'],
-'gzwrite' => ['int', 'zp'=>'resource', 'string'=>'string', 'length='=>'int'],
+'gzwrite' => ['int|false', 'zp'=>'resource', 'string'=>'string', 'length='=>'int'],
'HaruAnnotation::setBorderStyle' => ['bool', 'width'=>'float', 'dash_on'=>'int', 'dash_off'=>'int'],
'HaruAnnotation::setHighlightMode' => ['bool', 'mode'=>'int'],
'HaruAnnotation::setIcon' => ['bool', 'icon'=>'int'],
@@ -3906,20 +3909,20 @@
'HaruPage::stroke' => ['bool', 'close_path='=>'bool'],
'HaruPage::textOut' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'],
'HaruPage::textRect' => ['bool', 'left'=>'float', 'top'=>'float', 'right'=>'float', 'bottom'=>'float', 'text'=>'string', 'align='=>'int'],
-'hash' => ['string', 'algo'=>'string', 'data'=>'string', 'raw_output='=>'bool'],
-'hash_algos' => ['array'],
+'hash' => ['non-falsy-string|false', 'algo'=>'string', 'data'=>'string', 'raw_output='=>'bool'],
+'hash_algos' => ['non-empty-list'],
'hash_copy' => ['HashContext', 'context'=>'HashContext'],
'hash_equals' => ['bool', 'known_string'=>'string', 'user_string'=>'string'],
-'hash_file' => ['string|false', 'algo'=>'string', 'filename'=>'string', 'raw_output='=>'bool'],
-'hash_final' => ['string', 'context'=>'HashContext', 'raw_output='=>'bool'],
-'hash_hkdf' => ['string', 'algo'=>'string', 'ikm'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'],
-'hash_hmac' => ['string', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
-'hash_hmac_algos' => ['array'],
-'hash_hmac_file' => ['string', 'algo'=>'string', 'filename'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
+'hash_file' => ['non-falsy-string|false', 'algo'=>'string', 'filename'=>'string', 'raw_output='=>'bool'],
+'hash_final' => ['non-falsy-string', 'context'=>'HashContext', 'raw_output='=>'bool'],
+'hash_hkdf' => ['non-falsy-string|false', 'algo'=>'string', 'key'=>'string', 'length='=>'int', 'info='=>'string', 'salt='=>'string'],
+'hash_hmac' => ['non-falsy-string|false', 'algo'=>'string', 'data'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
+'hash_hmac_algos' => ['non-empty-list'],
+'hash_hmac_file' => ['non-falsy-string|false', 'algo'=>'string', 'filename'=>'string', 'key'=>'string', 'raw_output='=>'bool'],
'hash_init' => ['HashContext', 'algo'=>'string', 'options='=>'int', 'key='=>'string'],
-'hash_pbkdf2' => ['string', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'raw_output='=>'bool'],
+'hash_pbkdf2' => ['(non-falsy-string&lowercase-string)|false', 'algo'=>'string', 'password'=>'string', 'salt'=>'string', 'iterations'=>'int', 'length='=>'int', 'raw_output='=>'bool'],
'hash_update' => ['bool', 'context'=>'HashContext', 'data'=>'string'],
-'hash_update_file' => ['bool', 'context='=>'HashContext', 'filename'=>'string', 'scontext='=>'?HashContext'],
+'hash_update_file' => ['bool', 'context'=>'HashContext', 'filename'=>'string', 'scontext='=>'?HashContext'],
'hash_update_stream' => ['int', 'context'=>'HashContext', 'handle'=>'resource', 'length='=>'int'],
'hashTableObj::clear' => ['void'],
'hashTableObj::get' => ['string', 'key'=>'string'],
@@ -3929,7 +3932,7 @@
'header' => ['void', 'header'=>'string', 'replace='=>'bool', 'http_response_code='=>'int'],
'header_register_callback' => ['bool', 'callback'=>'callable'],
'header_remove' => ['void', 'name='=>'string'],
-'headers_list' => ['array'],
+'headers_list' => ['list'],
'headers_sent' => ['bool', '&w_file='=>'string', '&w_line='=>'int'],
'hebrev' => ['string', 'str'=>'string', 'max_chars_per_line='=>'int'],
'hebrevc' => ['string', 'str'=>'string', 'max_chars_per_line='=>'int'],
@@ -3954,8 +3957,8 @@
'HRTime\StopWatch::start' => ['void'],
'HRTime\StopWatch::stop' => ['void'],
'html_entity_decode' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string'],
-'htmlentities' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'],
-'htmlspecialchars' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string', 'double_encode='=>'bool'],
+'htmlentities' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'],
+'htmlspecialchars' => ['string', 'string'=>'string', 'quote_style='=>'int', 'encoding='=>'string|null', 'double_encode='=>'bool'],
'htmlspecialchars_decode' => ['string', 'string'=>'string', 'quote_style='=>'int'],
'http\Env\Request::__construct' => ['void'],
'http\Env\Request::getCookie' => ['mixed', 'name='=>'string', 'type='=>'mixed', 'defval='=>'mixed', 'delete='=>'bool|false'],
@@ -4066,7 +4069,7 @@
'HttpMessage::__construct' => ['void', 'message='=>'string'],
'HttpMessage::__toString' => ['string'],
'HttpMessage::addHeaders' => ['', 'headers'=>'array', 'append='=>'bool'],
-'HttpMessage::count' => ['int'],
+'HttpMessage::count' => ['0|positive-int'],
'HttpMessage::current' => ['mixed'],
'HttpMessage::detach' => ['HttpMessage'],
'HttpMessage::factory' => ['HttpMessage', 'raw_message='=>'string', 'class_name='=>'string'],
@@ -4197,7 +4200,7 @@
'HttpRequestDataShare::__construct' => ['void'],
'HttpRequestDataShare::__destruct' => [''],
'HttpRequestDataShare::attach' => ['', 'request'=>'HttpRequest'],
-'HttpRequestDataShare::count' => ['int'],
+'HttpRequestDataShare::count' => ['0|positive-int'],
'HttpRequestDataShare::detach' => ['', 'request'=>'HttpRequest'],
'HttpRequestDataShare::factory' => ['', 'global'=>'', 'class_name'=>''],
'HttpRequestDataShare::reset' => [''],
@@ -4205,7 +4208,7 @@
'HttpRequestPool::__construct' => ['void', 'request='=>'httprequest'],
'HttpRequestPool::__destruct' => [''],
'HttpRequestPool::attach' => ['bool', 'request'=>'httprequest'],
-'HttpRequestPool::count' => ['int'],
+'HttpRequestPool::count' => ['0|positive-int'],
'HttpRequestPool::current' => ['mixed'],
'HttpRequestPool::detach' => ['bool', 'request'=>'httprequest'],
'HttpRequestPool::enableEvents' => ['', 'enable'=>''],
@@ -4312,12 +4315,12 @@
'hw_api_content' => ['HW_API_Content', 'content'=>'string', 'mimetype'=>'string'],
'hw_api_content::mimetype' => ['string'],
'hw_api_content::read' => ['string', 'buffer'=>'string', 'len'=>'int'],
-'hw_api_error::count' => ['int'],
+'hw_api_error::count' => ['0|positive-int'],
'hw_api_error::reason' => ['HW_API_Reason'],
'hw_api_object' => ['hw_api_object', 'parameter'=>'array'],
'hw_api_object::assign' => ['bool', 'parameter'=>'array'],
'hw_api_object::attreditable' => ['bool', 'parameter'=>'array'],
-'hw_api_object::count' => ['int', 'parameter'=>'array'],
+'hw_api_object::count' => ['0|positive-int', 'parameter'=>'array'],
'hw_api_object::insert' => ['bool', 'attribute'=>'hw_api_attribute'],
'hw_api_object::remove' => ['bool', 'name'=>'string'],
'hw_api_object::title' => ['string', 'parameter'=>'array'],
@@ -4404,7 +4407,7 @@
'ibase_blob_import' => ['string', 'link_identifier'=>'', 'file_handle'=>''],
'ibase_blob_info' => ['array', 'link_identifier'=>'', 'blob_id'=>'string'],
'ibase_blob_info\'1' => ['array', 'blob_id'=>'string'],
-'ibase_blob_open' => ['resource', 'link_identifier'=>'', 'blob_id'=>'string'],
+'ibase_blob_open' => ['resource|false', 'link_identifier'=>'', 'blob_id'=>'string'],
'ibase_blob_open\'1' => ['resource', 'blob_id'=>'string'],
'ibase_close' => ['bool', 'link_identifier='=>'resource'],
'ibase_commit' => ['bool', 'link_identifier='=>'resource'],
@@ -4452,7 +4455,7 @@
'iconv_mime_decode_headers' => ['array|false', 'headers'=>'string', 'mode='=>'int', 'charset='=>'string'],
'iconv_mime_encode' => ['string|false', 'field_name'=>'string', 'field_value'=>'string', 'preference='=>'array'],
'iconv_set_encoding' => ['bool', 'type'=>'string', 'charset'=>'string'],
-'iconv_strlen' => ['int', 'str'=>'string', 'charset='=>'string'],
+'iconv_strlen' => ['0|positive-int|false', 'str'=>'string', 'charset='=>'string'],
'iconv_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'charset='=>'string'],
'iconv_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'charset='=>'string'],
'iconv_substr' => ['string|false', 'str'=>'string', 'offset'=>'int', 'length='=>'int', 'charset='=>'string'],
@@ -4465,7 +4468,7 @@
'id3_get_version' => ['int', 'filename'=>'string'],
'id3_remove_tag' => ['bool', 'filename'=>'string', 'version='=>'int'],
'id3_set_tag' => ['bool', 'filename'=>'string', 'tag'=>'array', 'version='=>'int'],
-'idate' => ['int', 'format'=>'string', 'timestamp='=>'int'],
+'idate' => ['int|false', 'format'=>'string', 'timestamp='=>'int'],
'idn_strerror' => ['string', 'errorcode'=>'int'],
'idn_to_ascii' => ['string|false', 'domain'=>'string', 'options='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'],
'idn_to_utf8' => ['string|false', 'domain'=>'string', 'options='=>'int', 'variant='=>'int', '&w_idna_info='=>'array'],
@@ -4507,9 +4510,9 @@
'ifxus_seek_slob' => ['int', 'bid'=>'int', 'mode'=>'int', 'offset'=>'int'],
'ifxus_tell_slob' => ['int', 'bid'=>'int'],
'ifxus_write_slob' => ['int', 'bid'=>'int', 'content'=>'string'],
-'igbinary_serialize' => ['string', 'value'=>''],
-'igbinary_unserialize' => ['', 'str'=>'string'],
-'ignore_user_abort' => ['int', 'value='=>'bool'],
+'igbinary_serialize' => ['string|null', 'value'=>'mixed'],
+'igbinary_unserialize' => ['mixed', 'str'=>'string'],
+'ignore_user_abort' => ['0|1', 'value='=>'bool'],
'iis_add_server' => ['int', 'path'=>'string', 'comment'=>'string', 'server_ip'=>'string', 'port'=>'int', 'host_name'=>'string', 'rights'=>'int', 'start_server'=>'int'],
'iis_get_dir_security' => ['int', 'server_instance'=>'int', 'virtual_path'=>'string'],
'iis_get_script_map' => ['string', 'server_instance'=>'int', 'virtual_path'=>'string', 'script_extension'=>'string'],
@@ -4527,33 +4530,33 @@
'iis_stop_server' => ['int', 'server_instance'=>'int'],
'iis_stop_service' => ['int', 'service_id'=>'string'],
'image2wbmp' => ['bool', 'im'=>'resource', 'filename='=>'?string', 'threshold='=>'int'],
-'image_type_to_extension' => ['string', 'imagetype'=>'int', 'include_dot='=>'bool'],
+'image_type_to_extension' => ['string|false', 'imagetype'=>'int', 'include_dot='=>'bool'],
'image_type_to_mime_type' => ['string', 'imagetype'=>'int'],
-'imageaffine' => ['resource', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'],
+'imageaffine' => ['resource|false', 'src'=>'resource', 'affine'=>'array', 'clip='=>'array'],
'imageaffineconcat' => ['array', 'm1'=>'array', 'm2'=>'array'],
'imageaffinematrixconcat' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'm1'=>'array', 'm2'=>'array'],
'imageaffinematrixget' => ['array{0:float,1:float,2:float,3:float,4:float,5:float}|false', 'type'=>'int', 'options'=>'array|float'],
'imagealphablending' => ['bool', 'im'=>'resource', 'on'=>'bool'],
'imageantialias' => ['bool', 'im'=>'resource', 'on'=>'bool'],
'imagearc' => ['bool', 'im'=>'resource', 'cx'=>'int', 'cy'=>'int', 'w'=>'int', 'h'=>'int', 's'=>'int', 'e'=>'int', 'col'=>'int'],
-'imagebmp' => ['bool', 'image'=>'resource', 'to='=>'mixed', 'compressed='=>'bool'],
+'imagebmp' => ['bool', 'image'=>'resource', 'to='=>'string|resource|null', 'compressed='=>'bool'],
'imagechar' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'c'=>'string', 'col'=>'int'],
'imagecharup' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'c'=>'string', 'col'=>'int'],
-'imagecolorallocate' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorallocatealpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
-'imagecolorat' => ['int', 'im'=>'resource', 'x'=>'int', 'y'=>'int'],
-'imagecolorclosest' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorclosestalpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
-'imagecolorclosesthwb' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
+'imagecolorallocate' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorallocatealpha' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
+'imagecolorat' => ['int<0, max>|false', 'im'=>'resource', 'x'=>'int', 'y'=>'int'],
+'imagecolorclosest' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorclosestalpha' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
+'imagecolorclosesthwb' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
'imagecolordeallocate' => ['bool', 'im'=>'resource', 'index'=>'int'],
-'imagecolorexact' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorexactalpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
+'imagecolorexact' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorexactalpha' => ['int<0, max>|false', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
'imagecolormatch' => ['bool', 'im1'=>'resource', 'im2'=>'resource'],
-'imagecolorresolve' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int'],
-'imagecolorresolvealpha' => ['int', 'im'=>'resource', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha'=>'int'],
-'imagecolorset' => ['void', 'im'=>'resource', 'col'=>'int', 'red'=>'int', 'green'=>'int', 'blue'=>'int', 'alpha='=>'int'],
-'imagecolorsforindex' => ['array', 'im'=>'resource', 'col'=>'int'],
-'imagecolorstotal' => ['int', 'im'=>'resource'],
+'imagecolorresolve' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>'],
+'imagecolorresolvealpha' => ['int<0, max>', 'im'=>'resource', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha'=>'int<0, 127>'],
+'imagecolorset' => ['void', 'im'=>'resource', 'col'=>'int', 'red'=>'int<0, 255>', 'green'=>'int<0, 255>', 'blue'=>'int<0, 255>', 'alpha='=>'int<0, 127>'],
+'imagecolorsforindex' => ['array{red: int<0, 255>, green: int<0, 255>, blue: int<0, 255>, alpha: int<0, 127>}', 'im'=>'resource', 'col'=>'int'],
+'imagecolorstotal' => ['int<0, 256>', 'im'=>'resource'],
'imagecolortransparent' => ['int', 'im'=>'resource', 'col='=>'int'],
'imageconvolution' => ['bool', 'src_im'=>'resource', 'matrix3x3'=>'array', 'div'=>'float', 'offset'=>'float'],
'imagecopy' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int'],
@@ -4561,7 +4564,7 @@
'imagecopymergegray' => ['bool', 'src_im'=>'resource', 'dst_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'src_w'=>'int', 'src_h'=>'int', 'pct'=>'int'],
'imagecopyresampled' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_w'=>'int', 'dst_h'=>'int', 'src_w'=>'int', 'src_h'=>'int'],
'imagecopyresized' => ['bool', 'dst_im'=>'resource', 'src_im'=>'resource', 'dst_x'=>'int', 'dst_y'=>'int', 'src_x'=>'int', 'src_y'=>'int', 'dst_w'=>'int', 'dst_h'=>'int', 'src_w'=>'int', 'src_h'=>'int'],
-'imagecreate' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'],
+'imagecreate' => ['__benevolent', 'x_size'=>'int<1, max>', 'y_size'=>'int<1, max>'],
'imagecreatefrombmp' => ['resource|false', 'filename'=>'string'],
'imagecreatefromgd' => ['resource|false', 'filename'=>'string'],
'imagecreatefromgd2' => ['resource|false', 'filename'=>'string'],
@@ -4574,9 +4577,9 @@
'imagecreatefromwebp' => ['resource|false', 'filename'=>'string'],
'imagecreatefromxbm' => ['resource|false', 'filename'=>'string'],
'imagecreatefromxpm' => ['resource|false', 'filename'=>'string'],
-'imagecreatetruecolor' => ['resource|false', 'x_size'=>'int', 'y_size'=>'int'],
-'imagecrop' => ['resource', 'im'=>'resource', 'rect'=>'array'],
-'imagecropauto' => ['resource', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'],
+'imagecreatetruecolor' => ['__benevolent', 'x_size'=>'int<1, max>', 'y_size'=>'int<1, max>'],
+'imagecrop' => ['resource|false', 'im'=>'resource', 'rect'=>'array'],
+'imagecropauto' => ['resource|false', 'im'=>'resource', 'mode='=>'int', 'threshold='=>'float', 'color='=>'int'],
'imagedashedline' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'],
'imagedestroy' => ['bool', 'im'=>'resource'],
'imageellipse' => ['bool', 'im'=>'resource', 'cx'=>'int', 'cy'=>'int', 'w'=>'int', 'h'=>'int', 'color'=>'int'],
@@ -4590,23 +4593,23 @@
'imageflip' => ['bool', 'im'=>'resource', 'mode'=>'int'],
'imagefontheight' => ['int', 'font'=>'int'],
'imagefontwidth' => ['int', 'font'=>'int'],
-'imageftbbox' => ['array', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string', 'extrainfo='=>'array'],
-'imagefttext' => ['array', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string', 'extrainfo='=>'array'],
+'imageftbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string', 'extrainfo='=>'array'],
+'imagefttext' => ['array|false', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string', 'extrainfo='=>'array'],
'imagegammacorrect' => ['bool', 'im'=>'resource', 'inputgamma'=>'float', 'outputgamma'=>'float'],
'imagegd' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null'],
'imagegd2' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null', 'chunk_size='=>'int', 'type='=>'int'],
'imagegetclip' => ['array', 'im'=>'resource'],
'imagegif' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null'],
-'imagegrabscreen' => ['resource'],
-'imagegrabwindow' => ['resource', 'window_handle'=>'int', 'client_area='=>'int'],
+'imagegrabscreen' => ['resource|false'],
+'imagegrabwindow' => ['resource|false', 'window_handle'=>'int', 'client_area='=>'int'],
'imageinterlace' => ['int', 'im'=>'resource', 'interlace='=>'int'],
'imageistruecolor' => ['bool', 'im'=>'resource'],
'imagejpeg' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null', 'quality='=>'int'],
'imagelayereffect' => ['bool', 'im'=>'resource', 'effect'=>'int'],
'imageline' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'],
-'imageloadfont' => ['int', 'filename'=>'string'],
+'imageloadfont' => ['int|false', 'filename'=>'string'],
'imageObj::pasteImage' => ['void', 'srcImg'=>'imageObj', 'transparentColorHex'=>'int', 'dstX'=>'int', 'dstY'=>'int', 'angle'=>'int'],
-'imageObj::saveImage' => ['int', 'filename'=>'string', 'oMap'=>'MapObj'],
+'imageObj::saveImage' => ['int', 'filename'=>'string', 'oMap'=>'mapObj'],
'imageObj::saveWebImage' => ['string'],
'imageopenpolygon' => ['bool', 'image'=>'resource', 'points'=>'array', 'num_points'=>'int', 'color'=>'int'],
'imagepalettecopy' => ['void', 'dst'=>'resource', 'src'=>'resource'],
@@ -4622,9 +4625,9 @@
'imagepstext' => ['array', 'image'=>'resource', 'text'=>'string', 'font_index'=>'resource', 'size'=>'int', 'foreground'=>'int', 'background'=>'int', 'x'=>'int', 'y'=>'int', 'space='=>'int', 'tightness='=>'int', 'angle='=>'float', 'antialias_steps='=>'int'],
'imagerectangle' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int', 'col'=>'int'],
'imageresolution' => ['mixed', 'image'=>'resource', 'res_x='=>'int', 'res_y='=>'int'],
-'imagerotate' => ['resource', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'],
+'imagerotate' => ['resource|false', 'src_im'=>'resource', 'angle'=>'float', 'bgdcolor'=>'int', 'ignoretransparent='=>'int'],
'imagesavealpha' => ['bool', 'im'=>'resource', 'on'=>'bool'],
-'imagescale' => ['resource', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'],
+'imagescale' => ['resource|false', 'im'=>'resource', 'new_width'=>'int', 'new_height='=>'int', 'method='=>'int'],
'imagesetbrush' => ['bool', 'image'=>'resource', 'brush'=>'resource'],
'imagesetclip' => ['bool', 'im'=>'resource', 'x1'=>'int', 'y1'=>'int', 'x2'=>'int', 'y2'=>'int'],
'imagesetinterpolation' => ['bool', 'im'=>'resource', 'method'=>'int'],
@@ -4634,60 +4637,60 @@
'imagesettile' => ['bool', 'image'=>'resource', 'tile'=>'resource'],
'imagestring' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'str'=>'string', 'col'=>'int'],
'imagestringup' => ['bool', 'im'=>'resource', 'font'=>'int', 'x'=>'int', 'y'=>'int', 'str'=>'string', 'col'=>'int'],
-'imagesx' => ['int', 'im'=>'resource'],
-'imagesy' => ['int', 'im'=>'resource'],
+'imagesx' => ['int<1, max>', 'im'=>'resource'],
+'imagesy' => ['int<1, max>', 'im'=>'resource'],
'imagetruecolortopalette' => ['bool', 'im'=>'resource', 'ditherflag'=>'bool', 'colorswanted'=>'int'],
-'imagettfbbox' => ['array', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string'],
-'imagettftext' => ['array', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string'],
+'imagettfbbox' => ['array|false', 'size'=>'float', 'angle'=>'float', 'font_file'=>'string', 'text'=>'string'],
+'imagettftext' => ['array|false', 'im'=>'resource', 'size'=>'float', 'angle'=>'float', 'x'=>'int', 'y'=>'int', 'col'=>'int', 'font_file'=>'string', 'text'=>'string'],
'imagetypes' => ['int'],
'imagewbmp' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null', 'foreground='=>'int'],
'imagewebp' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null', 'quality='=>'int'],
-'imagexbm' => ['bool', 'im'=>'resource', 'filename'=>'string|resource|null', 'foreground='=>'int'],
+'imagexbm' => ['bool', 'im'=>'resource', 'filename='=>'string|resource|null', 'foreground='=>'int'],
'Imagick::__construct' => ['void', 'files='=>''],
'Imagick::__toString' => ['string'],
-'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::adaptiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::adaptiveResizeImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool'],
-'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::adaptiveSharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::adaptiveThresholdImage' => ['bool', 'width'=>'int', 'height'=>'int', 'offset'=>'int'],
'Imagick::addImage' => ['bool', 'source'=>'imagick'],
-'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'int', 'channel='=>'int'],
+'Imagick::addNoiseImage' => ['bool', 'noise_type'=>'Imagick::NOISE_*', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::affineTransformImage' => ['bool', 'matrix'=>'imagickdraw'],
'Imagick::animateImages' => ['bool', 'x_server'=>'string'],
'Imagick::annotateImage' => ['bool', 'draw_settings'=>'imagickdraw', 'x'=>'float', 'y'=>'float', 'angle'=>'float', 'text'=>'string'],
'Imagick::appendImages' => ['Imagick', 'stack'=>'bool'],
-'Imagick::autoGammaImage' => ['bool', 'channel='=>'int'],
-'Imagick::autoLevelImage' => ['void', 'CHANNEL='=>'string'],
+'Imagick::autoGammaImage' => ['bool', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::autoLevelImage' => ['bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::autoOrient' => ['bool'],
'Imagick::averageImages' => ['Imagick'],
'Imagick::blackThresholdImage' => ['bool', 'threshold'=>'mixed'],
-'Imagick::blueShiftImage' => ['void', 'factor='=>'float'],
-'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::blueShiftImage' => ['bool', 'factor='=>'float'],
+'Imagick::blurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::borderImage' => ['bool', 'bordercolor'=>'mixed', 'width'=>'int', 'height'=>'int'],
-'Imagick::brightnessContrastImage' => ['void', 'brightness'=>'string', 'contrast'=>'string', 'CHANNEL='=>'string'],
+'Imagick::brightnessContrastImage' => ['bool', 'brightness'=>'float', 'contrast'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::charcoalImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'],
'Imagick::chopImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
-'Imagick::clampImage' => ['void', 'CHANNEL='=>'string'],
+'Imagick::clampImage' => ['bool', 'channel='=>'int'],
'Imagick::clear' => ['bool'],
'Imagick::clipImage' => ['bool'],
'Imagick::clipImagePath' => ['void', 'pathname'=>'string', 'inside'=>'string'],
'Imagick::clipPathImage' => ['bool', 'pathname'=>'string', 'inside'=>'bool'],
'Imagick::clone' => ['Imagick'],
-'Imagick::clutImage' => ['bool', 'lookup_table'=>'imagick', 'channel='=>'float'],
+'Imagick::clutImage' => ['bool', 'lookup_table'=>'imagick', 'int='=>'float'],
'Imagick::coalesceImages' => ['Imagick'],
'Imagick::colorFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'],
'Imagick::colorizeImage' => ['bool', 'colorize'=>'mixed', 'opacity'=>'mixed'],
-'Imagick::colorMatrixImage' => ['void', 'color_matrix'=>'string'],
-'Imagick::combineImages' => ['Imagick', 'channeltype'=>'int'],
+'Imagick::colorMatrixImage' => ['bool', 'color_matrix'=>'array'],
+'Imagick::combineImages' => ['Imagick', 'channeltype'=>'Imagick::CHANNEL_*'],
'Imagick::commentImage' => ['bool', 'comment'=>'string'],
-'Imagick::compareImageChannels' => ['array', 'image'=>'imagick', 'channeltype'=>'int', 'metrictype'=>'int'],
-'Imagick::compareImageLayers' => ['Imagick', 'method'=>'int'],
-'Imagick::compareImages' => ['array', 'compare'=>'imagick', 'metric'=>'int'],
-'Imagick::compositeImage' => ['bool', 'composite_object'=>'imagick', 'composite'=>'int', 'x'=>'int', 'y'=>'int', 'channel='=>'int'],
+'Imagick::compareImageChannels' => ['array{Imagick,float}', 'image'=>'imagick', 'channeltype'=>'Imagick::CHANNEL_*', 'metrictype'=>'Imagick::METRIC_*'],
+'Imagick::compareImageLayers' => ['Imagick', 'method'=>'Imagick::LAYERMETHOD_*'],
+'Imagick::compareImages' => ['array{Imagick,float}', 'compare'=>'imagick', 'metric'=>'Imagick::METRIC_*'],
+'Imagick::compositeImage' => ['bool', 'composite_object'=>'imagick', 'composite'=>'Imagick::COMPOSITE_*', 'x'=>'int', 'y'=>'int', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::compositeImageGravity' => ['bool', 'imagick'=>'Imagick', 'COMPOSITE_CONSTANT'=>'int', 'GRAVITY_CONSTANT'=>'int'],
'Imagick::contrastImage' => ['bool', 'sharpen'=>'bool'],
-'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'int'],
-'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'int'],
-'Imagick::count' => ['void', 'mode='=>'string'],
+'Imagick::contrastStretchImage' => ['bool', 'black_point'=>'float', 'white_point'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::convolveImage' => ['bool', 'kernel'=>'array', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::count' => ['0|positive-int', 'mode='=>'int'],
'Imagick::cropImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::cropThumbnailImage' => ['bool', 'width'=>'int', 'height'=>'int', 'legacy='=>'bool'],
'Imagick::current' => ['Imagick'],
@@ -4701,167 +4704,167 @@
'Imagick::destroy' => ['bool'],
'Imagick::displayImage' => ['bool', 'servername'=>'string'],
'Imagick::displayImages' => ['bool', 'servername'=>'string'],
-'Imagick::distortImage' => ['bool', 'method'=>'int', 'arguments'=>'array', 'bestfit'=>'bool'],
+'Imagick::distortImage' => ['bool', 'method'=>'Imagick::DISTORTION_*', 'arguments'=>'array', 'bestfit'=>'bool'],
'Imagick::drawImage' => ['bool', 'draw'=>'imagickdraw'],
'Imagick::edgeImage' => ['bool', 'radius'=>'float'],
'Imagick::embossImage' => ['bool', 'radius'=>'float', 'sigma'=>'float'],
'Imagick::encipherImage' => ['bool', 'passphrase'=>'string'],
'Imagick::enhanceImage' => ['bool'],
'Imagick::equalizeImage' => ['bool'],
-'Imagick::evaluateImage' => ['bool', 'op'=>'int', 'constant'=>'float', 'channel='=>'int'],
+'Imagick::evaluateImage' => ['bool', 'op'=>'Imagick::EVALUATE_*', 'constant'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::evaluateImages' => ['bool', 'EVALUATE_CONSTANT'=>'int'],
-'Imagick::exportImagePixels' => ['array', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int'],
+'Imagick::exportImagePixels' => ['list', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'Imagick::PIXEL_*'],
'Imagick::extentImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
-'Imagick::filter' => ['void', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'],
+'Imagick::filter' => ['bool', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'int'],
'Imagick::flattenImages' => ['Imagick'],
'Imagick::flipImage' => ['bool'],
-'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'int'],
+'Imagick::floodFillPaintImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'target'=>'mixed', 'x'=>'int', 'y'=>'int', 'invert'=>'bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::flopImage' => ['bool'],
-'Imagick::forwardFourierTransformimage' => ['void', 'magnitude'=>'bool'],
+'Imagick::forwardFourierTransformimage' => ['bool', 'magnitude'=>'bool'],
'Imagick::frameImage' => ['bool', 'matte_color'=>'mixed', 'width'=>'int', 'height'=>'int', 'inner_bevel'=>'int', 'outer_bevel'=>'int'],
-'Imagick::functionImage' => ['bool', 'function'=>'int', 'arguments'=>'array', 'channel='=>'int'],
-'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'int'],
-'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'int'],
-'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
-'Imagick::getColorspace' => ['int'],
-'Imagick::getCompression' => ['int'],
+'Imagick::functionImage' => ['bool', 'function'=>'Imagick::FUNCTION_*', 'arguments'=>'array', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::fxImage' => ['Imagick', 'expression'=>'string', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::gammaImage' => ['bool', 'gamma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::gaussianBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::getColorspace' => ['Imagick::COLORSPACE_*'],
+'Imagick::getCompression' => ['Imagick::COMPRESSION_*'],
'Imagick::getCompressionQuality' => ['int'],
-'Imagick::getConfigureOptions' => ['string'],
+'Imagick::getConfigureOptions' => ['array'],
'Imagick::getCopyright' => ['string'],
'Imagick::getFeatures' => ['string'],
'Imagick::getFilename' => ['string'],
'Imagick::getFont' => ['string'],
'Imagick::getFormat' => ['string'],
-'Imagick::getGravity' => ['int'],
+'Imagick::getGravity' => ['Imagick::GRAVITY_*'],
'Imagick::getHDRIEnabled' => ['int'],
'Imagick::getHomeURL' => ['string'],
'Imagick::getImage' => ['Imagick'],
-'Imagick::getImageAlphaChannel' => ['int'],
+'Imagick::getImageAlphaChannel' => ['bool'],
'Imagick::getImageArtifact' => ['string', 'artifact'=>'string'],
'Imagick::getImageAttribute' => ['string', 'key'=>'string'],
'Imagick::getImageBackgroundColor' => ['ImagickPixel'],
'Imagick::getImageBlob' => ['string'],
-'Imagick::getImageBluePrimary' => ['array'],
+'Imagick::getImageBluePrimary' => ['array{x:float,y:float}'],
'Imagick::getImageBorderColor' => ['ImagickPixel'],
-'Imagick::getImageChannelDepth' => ['int', 'channel'=>'int'],
-'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'imagick', 'channel'=>'int', 'metric'=>'int'],
-'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'imagick', 'metric'=>'int', 'channel='=>'int'],
-'Imagick::getImageChannelExtrema' => ['array', 'channel'=>'int'],
-'Imagick::getImageChannelKurtosis' => ['array', 'channel='=>'int'],
-'Imagick::getImageChannelMean' => ['array', 'channel'=>'int'],
-'Imagick::getImageChannelRange' => ['array', 'channel'=>'int'],
-'Imagick::getImageChannelStatistics' => ['array'],
+'Imagick::getImageChannelDepth' => ['int', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelDistortion' => ['float', 'reference'=>'imagick', 'channel'=>'Imagick::CHANNEL_*', 'metric'=>'Imagick::METRIC_*'],
+'Imagick::getImageChannelDistortions' => ['float', 'reference'=>'imagick', 'metric'=>'Imagick::METRIC_*', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelExtrema' => ['array{minima:0|positive-int,maxima:0|positive-int}', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelKurtosis' => ['array{kurtosis:float,skewness:float}', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelMean' => ['array{mean:float,standardDeviation:float}', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelRange' => ['array{minima:float,maxima:float}', 'channel'=>'Imagick::CHANNEL_*'],
+'Imagick::getImageChannelStatistics' => ['array{mean:float,minima:float,maxima:float,standardDeviation:float,depth:int}'],
'Imagick::getImageClipMask' => ['Imagick'],
'Imagick::getImageColormapColor' => ['ImagickPixel', 'index'=>'int'],
'Imagick::getImageColors' => ['int'],
-'Imagick::getImageColorspace' => ['int'],
-'Imagick::getImageCompose' => ['int'],
-'Imagick::getImageCompression' => ['int'],
+'Imagick::getImageColorspace' => ['Imagick::COLORSPACE_*'],
+'Imagick::getImageCompose' => ['Imagick::COMPOSITE_*'],
+'Imagick::getImageCompression' => ['Imagick::COMPRESSION_*'],
'Imagick::getImageCompressionQuality' => ['int'],
'Imagick::getImageDelay' => ['int'],
'Imagick::getImageDepth' => ['int'],
-'Imagick::getImageDispose' => ['int'],
-'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'int'],
-'Imagick::getImageExtrema' => ['array'],
+'Imagick::getImageDispose' => ['Imagick::DISPOSE_*'],
+'Imagick::getImageDistortion' => ['float', 'reference'=>'magickwand', 'metric'=>'Imagick::METRIC_*'],
+'Imagick::getImageExtrema' => ['array{min:0|positive-int,max:0|positive-int}'],
'Imagick::getImageFilename' => ['string'],
'Imagick::getImageFormat' => ['string'],
'Imagick::getImageGamma' => ['float'],
-'Imagick::getImageGeometry' => ['array'],
-'Imagick::getImageGravity' => ['int'],
-'Imagick::getImageGreenPrimary' => ['array'],
+'Imagick::getImageGeometry' => ['array{width:int,height:int}'],
+'Imagick::getImageGravity' => ['Imagick::GRAVITY_*'],
+'Imagick::getImageGreenPrimary' => ['array{x:float,y:float}'],
'Imagick::getImageHeight' => ['int'],
-'Imagick::getImageHistogram' => ['array'],
+'Imagick::getImageHistogram' => ['list'],
'Imagick::getImageIndex' => ['int'],
-'Imagick::getImageInterlaceScheme' => ['int'],
-'Imagick::getImageInterpolateMethod' => ['int'],
+'Imagick::getImageInterlaceScheme' => ['Imagick::INTERLACE_*'],
+'Imagick::getImageInterpolateMethod' => ['Imagick::INTERPOLATE_*'],
'Imagick::getImageIterations' => ['int'],
-'Imagick::getImageLength' => ['int'],
+'Imagick::getImageLength' => ['0|positive-int'],
'Imagick::getImageMagickLicense' => ['string'],
'Imagick::getImageMatte' => ['bool'],
'Imagick::getImageMatteColor' => ['ImagickPixel'],
-'Imagick::getImageMimeType' => ['string'],
-'Imagick::getImageOrientation' => ['int'],
-'Imagick::getImagePage' => ['array'],
+'Imagick::getImageMimeType' => ['non-empty-string'],
+'Imagick::getImageOrientation' => ['Imagick::ORIENTATION_*'],
+'Imagick::getImagePage' => ['array{width:int,height:int,x:int,y:int}'],
'Imagick::getImagePixelColor' => ['ImagickPixel', 'x'=>'int', 'y'=>'int'],
'Imagick::getImageProfile' => ['string', 'name'=>'string'],
'Imagick::getImageProfiles' => ['array', 'pattern='=>'string', 'only_names='=>'bool'],
'Imagick::getImageProperties' => ['array', 'pattern='=>'string', 'only_names='=>'bool'],
'Imagick::getImageProperty' => ['string', 'name'=>'string'],
-'Imagick::getImageRedPrimary' => ['array'],
+'Imagick::getImageRedPrimary' => ['array{x:float,y:float}'],
'Imagick::getImageRegion' => ['Imagick', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
-'Imagick::getImageRenderingIntent' => ['int'],
-'Imagick::getImageResolution' => ['array'],
+'Imagick::getImageRenderingIntent' => ['Imagick::RENDERINGINTENT_*'],
+'Imagick::getImageResolution' => ['array{x:float,y:float}'],
'Imagick::getImagesBlob' => ['string'],
-'Imagick::getImageScene' => ['int'],
+'Imagick::getImageScene' => ['0|positive-int'],
'Imagick::getImageSignature' => ['string'],
-'Imagick::getImageSize' => ['int'],
-'Imagick::getImageTicksPerSecond' => ['int'],
+'Imagick::getImageSize' => ['0|positive-int'],
+'Imagick::getImageTicksPerSecond' => ['0|positive-int'],
'Imagick::getImageTotalInkDensity' => ['float'],
-'Imagick::getImageType' => ['int'],
+'Imagick::getImageType' => ['Imagick::IMGTYPE_*'],
'Imagick::getImageUnits' => ['int'],
'Imagick::getImageVirtualPixelMethod' => ['int'],
-'Imagick::getImageWhitePoint' => ['array'],
-'Imagick::getImageWidth' => ['int'],
-'Imagick::getInterlaceScheme' => ['int'],
+'Imagick::getImageWhitePoint' => ['array{x:float,y:float}'],
+'Imagick::getImageWidth' => ['0|positive-int'],
+'Imagick::getInterlaceScheme' => ['Imagick::INTERLACE_*'],
'Imagick::getIteratorIndex' => ['int'],
-'Imagick::getNumberImages' => ['int'],
+'Imagick::getNumberImages' => ['0|positive-int'],
'Imagick::getOption' => ['string', 'key'=>'string'],
'Imagick::getPackageName' => ['string'],
-'Imagick::getPage' => ['array'],
+'Imagick::getPage' => ['array{width:int,height:int,x:int,y:int}'],
'Imagick::getPixelIterator' => ['ImagickPixelIterator'],
'Imagick::getPixelRegionIterator' => ['ImagickPixelIterator', 'x'=>'int', 'y'=>'int', 'columns'=>'int', 'rows'=>'int'],
'Imagick::getPointSize' => ['float'],
-'Imagick::getQuantum' => ['int'],
-'Imagick::getQuantumDepth' => ['array'],
-'Imagick::getQuantumRange' => ['array'],
+'Imagick::getQuantum' => ['0|positive-int'],
+'Imagick::getQuantumDepth' => ['array{quantumDepthLong:0|positive-int,quantumDepthString:numeric-string}'],
+'Imagick::getQuantumRange' => ['array{quantumRangeLong:0|positive-int,quantumRangeString:numeric-string}'],
'Imagick::getRegistry' => ['string', 'key'=>'string'],
'Imagick::getReleaseDate' => ['string'],
-'Imagick::getResource' => ['int', 'type'=>'int'],
-'Imagick::getResourceLimit' => ['int', 'type'=>'int'],
-'Imagick::getSamplingFactors' => ['array'],
-'Imagick::getSize' => ['array'],
+'Imagick::getResource' => ['int', 'type'=>'Imagick::RESOURCETYPE_*'],
+'Imagick::getResourceLimit' => ['int', 'type'=>'Imagick::RESOURCETYPE_*'],
+'Imagick::getSamplingFactors' => ['list'],
+'Imagick::getSize' => ['array{columns:0|positive-int,rows:0|positive-int}'],
'Imagick::getSizeOffset' => ['int'],
-'Imagick::getVersion' => ['array'],
+'Imagick::getVersion' => ['array{versionNumber:0|positive-int,versionString:non-falsy-string}'],
'Imagick::haldClutImage' => ['bool', 'clut'=>'imagick', 'channel='=>'int'],
'Imagick::hasNextImage' => ['bool'],
'Imagick::hasPreviousImage' => ['bool'],
'Imagick::identifyFormat' => ['string|false', 'embedText'=>'string'],
-'Imagick::identifyImage' => ['array', 'appendrawoutput='=>'bool'],
+'Imagick::identifyImage' => ['array{imageName:string,mimetype:string,format:string,units:string,colorSpace:string,type:string,compression:string,fileSize:string,geometry:array{width:0|positive-int,height:0|positive-int},resolution:array{x:float,y:float},signature:string}', 'appendrawoutput='=>'bool'],
'Imagick::identifyImageType' => ['int'],
'Imagick::implodeImage' => ['bool', 'radius'=>'float'],
-'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'int', 'pixels'=>'array'],
-'Imagick::inverseFourierTransformImage' => ['void', 'complement'=>'string', 'magnitude'=>'string'],
+'Imagick::importImagePixels' => ['bool', 'x'=>'int', 'y'=>'int', 'width'=>'int', 'height'=>'int', 'map'=>'string', 'storage'=>'Imagick::PIXEL_*', 'pixels'=>'array'],
+'Imagick::inverseFourierTransformImage' => ['bool', 'complement'=>'Imagick', 'magnitude'=>'bool'],
'Imagick::key' => ['int|string'],
'Imagick::labelImage' => ['bool', 'label'=>'string'],
-'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'int'],
+'Imagick::levelImage' => ['bool', 'blackpoint'=>'float', 'gamma'=>'float', 'whitepoint'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::linearStretchImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float'],
'Imagick::liquidRescaleImage' => ['bool', 'width'=>'int', 'height'=>'int', 'delta_x'=>'float', 'rigidity'=>'float'],
-'Imagick::listRegistry' => ['array'],
+'Imagick::listRegistry' => ['array'],
'Imagick::localContrastImage' => ['bool', 'radius'=>'float', 'strength'=>'float'],
'Imagick::magnifyImage' => ['bool'],
'Imagick::mapImage' => ['bool', 'map'=>'imagick', 'dither'=>'bool'],
'Imagick::matteFloodfillImage' => ['bool', 'alpha'=>'float', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int'],
'Imagick::medianFilterImage' => ['bool', 'radius'=>'float'],
-'Imagick::mergeImageLayers' => ['bool', 'layer_method'=>'int'],
+'Imagick::mergeImageLayers' => ['Imagick', 'layer_method'=>'Imagick::LAYERMETHOD_*'],
'Imagick::minifyImage' => ['bool'],
'Imagick::modulateImage' => ['bool', 'brightness'=>'float', 'saturation'=>'float', 'hue'=>'float'],
-'Imagick::montageImage' => ['Imagick', 'draw'=>'imagickdraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'int', 'frame'=>'string'],
+'Imagick::montageImage' => ['Imagick', 'draw'=>'imagickdraw', 'tile_geometry'=>'string', 'thumbnail_geometry'=>'string', 'mode'=>'Imagick::MONTAGEMODE_*', 'frame'=>'string'],
'Imagick::morphImages' => ['Imagick', 'number_frames'=>'int'],
-'Imagick::morphology' => ['void', 'morphologyMethod'=>'int', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'CHANNEL='=>'string'],
+'Imagick::morphology' => ['bool', 'morphologyMethod'=>'Imagick::MORPHOLOGY_*', 'iterations'=>'int', 'ImagickKernel'=>'ImagickKernel', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::mosaicImages' => ['Imagick'],
-'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'int'],
-'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'int'],
+'Imagick::motionBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::negateImage' => ['bool', 'gray'=>'bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::newImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'background'=>'mixed', 'format='=>'string'],
'Imagick::newPseudoImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'pseudostring'=>'string'],
'Imagick::next' => ['void'],
'Imagick::nextImage' => ['bool'],
-'Imagick::normalizeImage' => ['bool', 'channel='=>'int'],
+'Imagick::normalizeImage' => ['bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::oilPaintImage' => ['bool', 'radius'=>'float'],
-'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'int'],
+'Imagick::opaquePaintImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'invert'=>'bool', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::optimizeImageLayers' => ['bool'],
-'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'int'],
-'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'int'],
-'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'int'],
+'Imagick::orderedPosterizeImage' => ['bool', 'threshold_map'=>'string', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::paintFloodfillImage' => ['bool', 'fill'=>'mixed', 'fuzz'=>'float', 'bordercolor'=>'mixed', 'x'=>'int', 'y'=>'int', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::paintOpaqueImage' => ['bool', 'target'=>'mixed', 'fill'=>'mixed', 'fuzz'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::paintTransparentImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float'],
'Imagick::pingImage' => ['bool', 'filename'=>'string'],
'Imagick::pingImageBlob' => ['bool', 'image'=>'string'],
@@ -4870,22 +4873,22 @@
'Imagick::posterizeImage' => ['bool', 'levels'=>'int', 'dither'=>'bool'],
'Imagick::previewImages' => ['bool', 'preview'=>'int'],
'Imagick::previousImage' => ['bool'],
-'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'string'],
+'Imagick::profileImage' => ['bool', 'name'=>'string', 'profile'=>'?string'],
'Imagick::quantizeImage' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'],
'Imagick::quantizeImages' => ['bool', 'numbercolors'=>'int', 'colorspace'=>'int', 'treedepth'=>'int', 'dither'=>'bool', 'measureerror'=>'bool'],
-'Imagick::queryFontMetrics' => ['array', 'properties'=>'imagickdraw', 'text'=>'string', 'multiline='=>'bool'],
-'Imagick::queryFonts' => ['array', 'pattern='=>'string'],
-'Imagick::queryFormats' => ['array', 'pattern='=>'string'],
-'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'int'],
+'Imagick::queryFontMetrics' => ['array{characterWidth:float,characterHeight:float,ascender:float,descender:float,textWidth:float,textHeight:float,maxHorizontalAdvance:float,boundingBox:array{x1:float,x2:float,y1:float,y2:float},originX:float,originY:float}', 'properties'=>'imagickdraw', 'text'=>'string', 'multiline='=>'bool'],
+'Imagick::queryFonts' => ['list', 'pattern='=>'string'],
+'Imagick::queryFormats' => ['list', 'pattern='=>'string'],
+'Imagick::radialBlurImage' => ['bool', 'angle'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::raiseImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int', 'raise'=>'bool'],
-'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'int'],
+'Imagick::randomThresholdImage' => ['bool', 'low'=>'float', 'high'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::readImage' => ['bool', 'filename'=>'string'],
'Imagick::readImageBlob' => ['bool', 'image'=>'string', 'filename='=>'string'],
'Imagick::readImageFile' => ['bool', 'filehandle'=>'resource', 'filename='=>'string'],
'Imagick::readImages' => ['Imagick', 'filenames'=>'string'],
'Imagick::recolorImage' => ['bool', 'matrix'=>'array'],
'Imagick::reduceNoiseImage' => ['bool', 'radius'=>'float'],
-'Imagick::remapImage' => ['bool', 'replacement'=>'imagick', 'dither'=>'int'],
+'Imagick::remapImage' => ['bool', 'replacement'=>'imagick', 'dither'=>'Imagick::DITHERMETHOD_*'],
'Imagick::removeImage' => ['bool'],
'Imagick::removeImageProfile' => ['string', 'name'=>'string'],
'Imagick::render' => ['bool'],
@@ -4896,70 +4899,70 @@
'Imagick::rewind' => ['void'],
'Imagick::rollImage' => ['bool', 'x'=>'int', 'y'=>'int'],
'Imagick::rotateImage' => ['bool', 'background'=>'mixed', 'degrees'=>'float'],
-'Imagick::rotationalBlurImage' => ['void', 'angle'=>'string', 'CHANNEL='=>'string'],
+'Imagick::rotationalBlurImage' => ['bool', 'float'=>'string', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::roundCorners' => ['bool', 'x_rounding'=>'float', 'y_rounding'=>'float', 'stroke_width='=>'float', 'displace='=>'float', 'size_correction='=>'float'],
-'Imagick::roundCornersImage' => ['', 'xRounding'=>'', 'yRounding'=>'', 'strokeWidth'=>'', 'displace'=>'', 'sizeCorrection'=>''],
+'Imagick::roundCornersImage' => ['bool', 'x_rounding'=>'', 'y_rounding'=>'', 'stroke_width='=>'', 'displace='=>'', 'size_correction='=>''],
'Imagick::sampleImage' => ['bool', 'columns'=>'int', 'rows'=>'int'],
-'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool'],
-'Imagick::segmentImage' => ['bool', 'colorspace'=>'int', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'],
-'Imagick::selectiveBlurImage' => ['void', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'CHANNEL'=>'int'],
-'Imagick::separateImageChannel' => ['bool', 'channel'=>'int'],
+'Imagick::scaleImage' => ['bool', 'cols'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'legacy='=>'bool'],
+'Imagick::segmentImage' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*', 'cluster_threshold'=>'float', 'smooth_threshold'=>'float', 'verbose='=>'bool'],
+'Imagick::selectiveBlurImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'threshold'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::separateImageChannel' => ['bool', 'channel'=>'Imagick::CHANNEL_*'],
'Imagick::sepiaToneImage' => ['bool', 'threshold'=>'float'],
'Imagick::setAntiAlias' => ['int', 'antialias'=>'bool'],
'Imagick::setBackgroundColor' => ['bool', 'background'=>'mixed'],
-'Imagick::setColorspace' => ['bool', 'colorspace'=>'int'],
-'Imagick::setCompression' => ['bool', 'compression'=>'int'],
+'Imagick::setColorspace' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*'],
+'Imagick::setCompression' => ['bool', 'compression'=>'Imagick::COMPRESSION_*'],
'Imagick::setCompressionQuality' => ['bool', 'quality'=>'int'],
'Imagick::setFilename' => ['bool', 'filename'=>'string'],
'Imagick::setFirstIterator' => ['bool'],
'Imagick::setFont' => ['bool', 'font'=>'string'],
'Imagick::setFormat' => ['bool', 'format'=>'string'],
-'Imagick::setGravity' => ['bool', 'gravity'=>'int'],
+'Imagick::setGravity' => ['bool', 'gravity'=>'Imagick::GRAVITY_*'],
'Imagick::setImage' => ['bool', 'replace'=>'imagick'],
'Imagick::setImageAlpha' => ['bool', 'alpha'=>'float'],
-'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'int'],
+'Imagick::setImageAlphaChannel' => ['bool', 'mode'=>'Imagick::ALPHACHANNEL_*'],
'Imagick::setImageArtifact' => ['bool', 'artifact'=>'string', 'value'=>'string'],
-'Imagick::setImageAttribute' => ['void', 'key'=>'string', 'value'=>'string'],
+'Imagick::setImageAttribute' => ['bool', 'key'=>'string', 'value'=>'string'],
'Imagick::setImageBackgroundColor' => ['bool', 'background'=>'mixed'],
'Imagick::setImageBias' => ['bool', 'bias'=>'float'],
'Imagick::setImageBiasQuantum' => ['void', 'bias'=>'string'],
'Imagick::setImageBluePrimary' => ['bool', 'x'=>'float', 'y'=>'float'],
'Imagick::setImageBorderColor' => ['bool', 'border'=>'mixed'],
-'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'int', 'depth'=>'int'],
-'Imagick::setImageChannelMask' => ['', 'channel'=>'int'],
+'Imagick::setImageChannelDepth' => ['bool', 'channel'=>'Imagick::CHANNEL_*', 'depth'=>'int'],
+'Imagick::setImageChannelMask' => ['', 'channel'=>'Imagick::CHANNEL_*'],
'Imagick::setImageClipMask' => ['bool', 'clip_mask'=>'imagick'],
'Imagick::setImageColormapColor' => ['bool', 'index'=>'int', 'color'=>'imagickpixel'],
-'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'int'],
-'Imagick::setImageCompose' => ['bool', 'compose'=>'int'],
-'Imagick::setImageCompression' => ['bool', 'compression'=>'int'],
+'Imagick::setImageColorspace' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*'],
+'Imagick::setImageCompose' => ['bool', 'compose'=>'Imagick::COMPOSITE_*'],
+'Imagick::setImageCompression' => ['bool', 'compression'=>'Imagick::COMPRESSION_*'],
'Imagick::setImageCompressionQuality' => ['bool', 'quality'=>'int'],
'Imagick::setImageDelay' => ['bool', 'delay'=>'int'],
'Imagick::setImageDepth' => ['bool', 'depth'=>'int'],
-'Imagick::setImageDispose' => ['bool', 'dispose'=>'int'],
+'Imagick::setImageDispose' => ['bool', 'dispose'=>'Imagick::DISPOSE_*'],
'Imagick::setImageExtent' => ['bool', 'columns'=>'int', 'rows'=>'int'],
'Imagick::setImageFilename' => ['bool', 'filename'=>'string'],
'Imagick::setImageFormat' => ['bool', 'format'=>'string'],
'Imagick::setImageGamma' => ['bool', 'gamma'=>'float'],
-'Imagick::setImageGravity' => ['bool', 'gravity'=>'int'],
+'Imagick::setImageGravity' => ['bool', 'gravity'=>'Imagick::GRAVITY_*'],
'Imagick::setImageGreenPrimary' => ['bool', 'x'=>'float', 'y'=>'float'],
'Imagick::setImageIndex' => ['bool', 'index'=>'int'],
-'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'int'],
-'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'int'],
+'Imagick::setImageInterlaceScheme' => ['bool', 'interlace_scheme'=>'Imagick::INTERLACE_*'],
+'Imagick::setImageInterpolateMethod' => ['bool', 'method'=>'Imagick::INTERPOLATE_*'],
'Imagick::setImageIterations' => ['bool', 'iterations'=>'int'],
'Imagick::setImageMatte' => ['bool', 'matte'=>'bool'],
'Imagick::setImageMatteColor' => ['bool', 'matte'=>'mixed'],
'Imagick::setImageOpacity' => ['bool', 'opacity'=>'float'],
-'Imagick::setImageOrientation' => ['bool', 'orientation'=>'int'],
+'Imagick::setImageOrientation' => ['bool', 'orientation'=>'Imagick::ORIENTATION_*'],
'Imagick::setImagePage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::setImageProfile' => ['bool', 'name'=>'string', 'profile'=>'string'],
'Imagick::setImageProgressMonitor' => ['', 'filename'=>''],
'Imagick::setImageProperty' => ['bool', 'name'=>'string', 'value'=>'string'],
'Imagick::setImageRedPrimary' => ['bool', 'x'=>'float', 'y'=>'float'],
-'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'int'],
+'Imagick::setImageRenderingIntent' => ['bool', 'rendering_intent'=>'Imagick::RENDERINGINTENT_*'],
'Imagick::setImageResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'],
'Imagick::setImageScene' => ['bool', 'scene'=>'int'],
'Imagick::setImageTicksPerSecond' => ['bool', 'ticks_per_second'=>'int'],
-'Imagick::setImageType' => ['bool', 'image_type'=>'int'],
+'Imagick::setImageType' => ['bool', 'image_type'=>'Imagick::IMGTYPE_*'],
'Imagick::setImageUnits' => ['bool', 'units'=>'int'],
'Imagick::setImageVirtualPixelMethod' => ['bool', 'method'=>'int'],
'Imagick::setImageWhitePoint' => ['bool', 'x'=>'float', 'y'=>'float'],
@@ -4969,53 +4972,53 @@
'Imagick::setOption' => ['bool', 'key'=>'string', 'value'=>'string'],
'Imagick::setPage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::setPointSize' => ['bool', 'point_size'=>'float'],
-'Imagick::setProgressMonitor' => ['void', 'callback'=>'callable'],
-'Imagick::setRegistry' => ['void', 'key'=>'string', 'value'=>'string'],
+'Imagick::setProgressMonitor' => ['bool', 'callback'=>'callable'],
+'Imagick::setRegistry' => ['bool', 'key'=>'string', 'value'=>'string'],
'Imagick::setResolution' => ['bool', 'x_resolution'=>'float', 'y_resolution'=>'float'],
'Imagick::setResourceLimit' => ['bool', 'type'=>'int', 'limit'=>'int'],
'Imagick::setSamplingFactors' => ['bool', 'factors'=>'array'],
'Imagick::setSize' => ['bool', 'columns'=>'int', 'rows'=>'int'],
'Imagick::setSizeOffset' => ['bool', 'columns'=>'int', 'rows'=>'int', 'offset'=>'int'],
-'Imagick::setType' => ['bool', 'image_type'=>'int'],
+'Imagick::setType' => ['bool', 'image_type'=>'Imagick::IMGTYPE_*'],
'Imagick::shadeImage' => ['bool', 'gray'=>'bool', 'azimuth'=>'float', 'elevation'=>'float'],
'Imagick::shadowImage' => ['bool', 'opacity'=>'float', 'sigma'=>'float', 'x'=>'int', 'y'=>'int'],
-'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'int'],
+'Imagick::sharpenImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::shaveImage' => ['bool', 'columns'=>'int', 'rows'=>'int'],
'Imagick::shearImage' => ['bool', 'background'=>'mixed', 'x_shear'=>'float', 'y_shear'=>'float'],
-'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'int'],
-'Imagick::similarityImage' => ['Imagick', 'imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'int'],
+'Imagick::sigmoidalContrastImage' => ['bool', 'sharpen'=>'bool', 'alpha'=>'float', 'beta'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
+'Imagick::similarityImage' => ['Imagick', 'imagick'=>'Imagick', '&bestMatch'=>'array', '&similarity'=>'float', 'similarity_threshold'=>'float', 'metric'=>'Imagick::METRIC_*'],
'Imagick::sketchImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'angle'=>'float'],
-'Imagick::smushImages' => ['Imagick', 'stack'=>'string', 'offset'=>'string'],
-'Imagick::solarizeImage' => ['bool', 'threshold'=>'int'],
-'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'int', 'arguments'=>'array', 'channel='=>'int'],
+'Imagick::smushImages' => ['Imagick', 'stack'=>'bool', 'offset'=>'int'],
+'Imagick::solarizeImage' => ['bool', 'threshold'=>'0|positive-int'],
+'Imagick::sparseColorImage' => ['bool', 'sparse_method'=>'Imagick::SPARSECOLORMETHOD_*', 'arguments'=>'array', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::spliceImage' => ['bool', 'width'=>'int', 'height'=>'int', 'x'=>'int', 'y'=>'int'],
'Imagick::spreadImage' => ['bool', 'radius'=>'float'],
-'Imagick::statisticImage' => ['void', 'type'=>'int', 'width'=>'int', 'height'=>'int', 'CHANNEL='=>'string'],
+'Imagick::statisticImage' => ['bool', 'type'=>'Imagick::STATISTIC_*', 'width'=>'int', 'height'=>'int', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::steganoImage' => ['Imagick', 'watermark_wand'=>'imagick', 'offset'=>'int'],
'Imagick::stereoImage' => ['bool', 'offset_wand'=>'imagick'],
'Imagick::stripImage' => ['bool'],
'Imagick::subImageMatch' => ['Imagick', 'Imagick'=>'Imagick', '&w_offset='=>'array', '&w_similarity='=>'float'],
'Imagick::swirlImage' => ['bool', 'degrees'=>'float'],
-'Imagick::textureImage' => ['bool', 'texture_wand'=>'imagick'],
-'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'int'],
+'Imagick::textureImage' => ['Imagick', 'texture_wand'=>'imagick'],
+'Imagick::thresholdImage' => ['bool', 'threshold'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::thumbnailImage' => ['bool', 'columns'=>'int', 'rows'=>'int', 'bestfit='=>'bool', 'fill='=>'bool', 'legacy='=>'bool'],
'Imagick::tintImage' => ['bool', 'tint'=>'mixed', 'opacity'=>'mixed'],
'Imagick::transformImage' => ['Imagick', 'crop'=>'string', 'geometry'=>'string'],
-'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'int'],
+'Imagick::transformImageColorspace' => ['bool', 'colorspace'=>'Imagick::COLORSPACE_*'],
'Imagick::transparentPaintImage' => ['bool', 'target'=>'mixed', 'alpha'=>'float', 'fuzz'=>'float', 'invert'=>'bool'],
'Imagick::transposeImage' => ['bool'],
'Imagick::transverseImage' => ['bool'],
'Imagick::trimImage' => ['bool', 'fuzz'=>'float'],
'Imagick::uniqueImageColors' => ['bool'],
-'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'int'],
+'Imagick::unsharpMaskImage' => ['bool', 'radius'=>'float', 'sigma'=>'float', 'amount'=>'float', 'threshold'=>'float', 'channel='=>'Imagick::CHANNEL_*'],
'Imagick::valid' => ['bool'],
'Imagick::vignetteImage' => ['bool', 'blackpoint'=>'float', 'whitepoint'=>'float', 'x'=>'int', 'y'=>'int'],
'Imagick::waveImage' => ['bool', 'amplitude'=>'float', 'length'=>'float'],
'Imagick::whiteThresholdImage' => ['bool', 'threshold'=>'mixed'],
'Imagick::writeImage' => ['bool', 'filename='=>'string'],
-'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource'],
+'Imagick::writeImageFile' => ['bool', 'filehandle'=>'resource', 'format='=>'?string'],
'Imagick::writeImages' => ['bool', 'filename'=>'string', 'adjoin'=>'bool'],
-'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource'],
+'Imagick::writeImagesFile' => ['bool', 'filehandle'=>'resource', 'format='=>'?string'],
'ImagickDraw::__construct' => ['void'],
'ImagickDraw::affine' => ['bool', 'affine'=>'array'],
'ImagickDraw::annotation' => ['bool', 'x'=>'float', 'y'=>'float', 'text'=>'string'],
@@ -5024,9 +5027,9 @@
'ImagickDraw::circle' => ['bool', 'ox'=>'float', 'oy'=>'float', 'px'=>'float', 'py'=>'float'],
'ImagickDraw::clear' => ['bool'],
'ImagickDraw::clone' => ['ImagickDraw'],
-'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'],
+'ImagickDraw::color' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'Imagick::PAINT_*'],
'ImagickDraw::comment' => ['bool', 'comment'=>'string'],
-'ImagickDraw::composite' => ['bool', 'compose'=>'int', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'imagick'],
+'ImagickDraw::composite' => ['bool', 'compose'=>'Imagick::COMPOSITE_*', 'x'=>'float', 'y'=>'float', 'width'=>'float', 'height'=>'float', 'compositewand'=>'imagick'],
'ImagickDraw::destroy' => ['bool'],
'ImagickDraw::ellipse' => ['bool', 'ox'=>'float', 'oy'=>'float', 'rx'=>'float', 'ry'=>'float', 'start'=>'float', 'end'=>'float'],
'ImagickDraw::getBorderColor' => ['ImagickPixel'],
@@ -5036,28 +5039,28 @@
'ImagickDraw::getDensity' => ['null|string'],
'ImagickDraw::getFillColor' => ['ImagickPixel'],
'ImagickDraw::getFillOpacity' => ['float'],
-'ImagickDraw::getFillRule' => ['int'],
+'ImagickDraw::getFillRule' => ['Imagick::FILLRULE_*'],
'ImagickDraw::getFont' => ['string'],
'ImagickDraw::getFontFamily' => ['string'],
'ImagickDraw::getFontResolution' => ['array'],
'ImagickDraw::getFontSize' => ['float'],
-'ImagickDraw::getFontStretch' => ['int'],
-'ImagickDraw::getFontStyle' => ['int'],
+'ImagickDraw::getFontStretch' => ['Imagick::STRETCH_*'],
+'ImagickDraw::getFontStyle' => ['Imagick::STYLE_*'],
'ImagickDraw::getFontWeight' => ['int'],
-'ImagickDraw::getGravity' => ['int'],
+'ImagickDraw::getGravity' => ['Imagick::GRAVITY_*'],
'ImagickDraw::getOpacity' => ['float'],
'ImagickDraw::getStrokeAntialias' => ['bool'],
'ImagickDraw::getStrokeColor' => ['ImagickPixel'],
'ImagickDraw::getStrokeDashArray' => ['array'],
'ImagickDraw::getStrokeDashOffset' => ['float'],
-'ImagickDraw::getStrokeLineCap' => ['int'],
-'ImagickDraw::getStrokeLineJoin' => ['int'],
+'ImagickDraw::getStrokeLineCap' => ['Imagick::LINECAP_*'],
+'ImagickDraw::getStrokeLineJoin' => ['Imagick::LINEJOIN_*'],
'ImagickDraw::getStrokeMiterLimit' => ['int'],
'ImagickDraw::getStrokeOpacity' => ['float'],
'ImagickDraw::getStrokeWidth' => ['float'],
-'ImagickDraw::getTextAlignment' => ['int'],
+'ImagickDraw::getTextAlignment' => ['Imagick::ALIGN_*'],
'ImagickDraw::getTextAntialias' => ['bool'],
-'ImagickDraw::getTextDecoration' => ['int'],
+'ImagickDraw::getTextDecoration' => ['Imagick::DECORATION_*'],
'ImagickDraw::getTextDirection' => ['bool'],
'ImagickDraw::getTextEncoding' => ['string'],
'ImagickDraw::getTextInterlineSpacing' => ['float'],
@@ -5066,7 +5069,7 @@
'ImagickDraw::getTextUnderColor' => ['ImagickPixel'],
'ImagickDraw::getVectorGraphics' => ['string'],
'ImagickDraw::line' => ['bool', 'sx'=>'float', 'sy'=>'float', 'ex'=>'float', 'ey'=>'float'],
-'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'int'],
+'ImagickDraw::matte' => ['bool', 'x'=>'float', 'y'=>'float', 'paintmethod'=>'Imagick::PAINT_*'],
'ImagickDraw::pathClose' => ['bool'],
'ImagickDraw::pathCurveToAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x2'=>'float', 'y2'=>'float', 'x'=>'float', 'y'=>'float'],
'ImagickDraw::pathCurveToQuadraticBezierAbsolute' => ['bool', 'x1'=>'float', 'y1'=>'float', 'x'=>'float', 'y'=>'float'],
@@ -5107,22 +5110,22 @@
'ImagickDraw::scale' => ['bool', 'x'=>'float', 'y'=>'float'],
'ImagickDraw::setBorderColor' => ['bool', 'color'=>'ImagickPixel|string'],
'ImagickDraw::setClipPath' => ['bool', 'clip_mask'=>'string'],
-'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'int'],
+'ImagickDraw::setClipRule' => ['bool', 'fill_rule'=>'Imagick::FILLRULE_*'],
'ImagickDraw::setClipUnits' => ['bool', 'clip_units'=>'int'],
'ImagickDraw::setDensity' => ['bool', 'density_string'=>'string'],
'ImagickDraw::setFillAlpha' => ['bool', 'opacity'=>'float'],
'ImagickDraw::setFillColor' => ['bool', 'fill_pixel'=>'ImagickPixel|string'],
'ImagickDraw::setFillOpacity' => ['bool', 'fillopacity'=>'float'],
'ImagickDraw::setFillPatternURL' => ['bool', 'fill_url'=>'string'],
-'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'int'],
+'ImagickDraw::setFillRule' => ['bool', 'fill_rule'=>'Imagick::FILLRULE_*'],
'ImagickDraw::setFont' => ['bool', 'font_name'=>'string'],
'ImagickDraw::setFontFamily' => ['bool', 'font_family'=>'string'],
'ImagickDraw::setFontResolution' => ['bool', 'x'=>'float', 'y'=>'float'],
'ImagickDraw::setFontSize' => ['bool', 'pointsize'=>'float'],
-'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'int'],
-'ImagickDraw::setFontStyle' => ['bool', 'style'=>'int'],
+'ImagickDraw::setFontStretch' => ['bool', 'fontstretch'=>'Imagick::STRETCH_*'],
+'ImagickDraw::setFontStyle' => ['bool', 'style'=>'Imagick::STYLE_*'],
'ImagickDraw::setFontWeight' => ['bool', 'font_weight'=>'int'],
-'ImagickDraw::setGravity' => ['bool', 'gravity'=>'int'],
+'ImagickDraw::setGravity' => ['bool', 'gravity'=>'Imagick::GRAVITY_*'],
'ImagickDraw::setOpacity' => ['void', 'opacity'=>'float'],
'ImagickDraw::setResolution' => ['void', 'x_resolution'=>'float', 'y_resolution'=>'float'],
'ImagickDraw::setStrokeAlpha' => ['bool', 'opacity'=>'float'],
@@ -5130,15 +5133,15 @@
'ImagickDraw::setStrokeColor' => ['bool', 'stroke_pixel'=>'ImagickPixel|string'],
'ImagickDraw::setStrokeDashArray' => ['bool', 'dasharray'=>'array'],
'ImagickDraw::setStrokeDashOffset' => ['bool', 'dash_offset'=>'float'],
-'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'int'],
-'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'int'],
+'ImagickDraw::setStrokeLineCap' => ['bool', 'linecap'=>'Imagick::LINECAP_*'],
+'ImagickDraw::setStrokeLineJoin' => ['bool', 'linejoin'=>'Imagick::LINEJOIN_*'],
'ImagickDraw::setStrokeMiterLimit' => ['bool', 'miterlimit'=>'int'],
'ImagickDraw::setStrokeOpacity' => ['bool', 'stroke_opacity'=>'float'],
'ImagickDraw::setStrokePatternURL' => ['bool', 'stroke_url'=>'string'],
'ImagickDraw::setStrokeWidth' => ['bool', 'stroke_width'=>'float'],
-'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'int'],
+'ImagickDraw::setTextAlignment' => ['bool', 'alignment'=>'Imagick::ALIGN_*'],
'ImagickDraw::setTextAntialias' => ['bool', 'antialias'=>'bool'],
-'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'int'],
+'ImagickDraw::setTextDecoration' => ['bool', 'decoration'=>'Imagick::DECORATION_*'],
'ImagickDraw::setTextDirection' => ['bool', 'direction'=>'int'],
'ImagickDraw::setTextEncoding' => ['bool', 'encoding'=>'string'],
'ImagickDraw::setTextInterlineSpacing' => ['void', 'spacing'=>'float'],
@@ -5152,17 +5155,16 @@
'ImagickDraw::translate' => ['bool', 'x'=>'float', 'y'=>'float'],
'ImagickKernel::addKernel' => ['void', 'ImagickKernel'=>'ImagickKernel'],
'ImagickKernel::addUnityKernel' => ['void'],
-'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'string', 'kernelString'=>'string'],
+'ImagickKernel::fromBuiltin' => ['ImagickKernel', 'kernelType'=>'Imagick::KERNEL_*', 'kernelString'=>'string'],
'ImagickKernel::fromMatrix' => ['ImagickKernel', 'matrix'=>'array', 'origin='=>'array'],
-'ImagickKernel::getMatrix' => ['array'],
-'ImagickKernel::scale' => ['void'],
+'ImagickKernel::getMatrix' => ['list>'],
+'ImagickKernel::scale' => ['void', 'scale'=>'float', 'normalizeFlag'=>'Imagick::NORMALIZE_KERNEL_*'],
'ImagickKernel::separate' => ['array'],
-'ImagickKernel::seperate' => ['void'],
'ImagickPixel::__construct' => ['void', 'color='=>'string'],
'ImagickPixel::clear' => ['bool'],
'ImagickPixel::clone' => ['void'],
'ImagickPixel::destroy' => ['bool'],
-'ImagickPixel::getColor' => ['array', 'normalized='=>'bool'],
+'ImagickPixel::getColor' => ['array{r: int|float, g: int|float, b: int|float, a: int|float}', 'normalized='=>'0|1|2'],
'ImagickPixel::getColorAsString' => ['string'],
'ImagickPixel::getColorCount' => ['int'],
'ImagickPixel::getColorQuantum' => ['mixed'],
@@ -5213,7 +5215,7 @@
'imap_close' => ['bool', 'stream_id'=>'resource', 'options='=>'int'],
'imap_create' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
'imap_createmailbox' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
-'imap_delete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'int', 'options='=>'int'],
+'imap_delete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'string', 'options='=>'int'],
'imap_deletemailbox' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
'imap_errors' => ['array|false'],
'imap_expunge' => ['bool', 'stream_id'=>'resource'],
@@ -5248,7 +5250,7 @@
'imap_mutf7_to_utf8' => ['string|false', 'in'=>'string'],
'imap_num_msg' => ['int|false', 'stream_id'=>'resource'],
'imap_num_recent' => ['int|false', 'stream_id'=>'resource'],
-'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'options='=>'int', 'n_retries='=>'int', 'params=' => 'array|null'],
+'imap_open' => ['resource|false', 'mailbox'=>'string', 'user'=>'string', 'password'=>'string', 'options='=>'int', 'n_retries='=>'int', 'params='=>'array|null'],
'imap_ping' => ['bool', 'stream_id'=>'resource'],
'imap_qprint' => ['string|false', 'text'=>'string'],
'imap_rename' => ['bool', 'stream_id'=>'resource', 'old_name'=>'string', 'new_name'=>'string'],
@@ -5270,7 +5272,7 @@
'imap_thread' => ['array|false', 'stream_id'=>'resource', 'options='=>'int'],
'imap_timeout' => ['mixed', 'timeout_type'=>'int', 'timeout='=>'int'],
'imap_uid' => ['int|false', 'stream_id'=>'resource', 'msg_no'=>'int'],
-'imap_undelete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'int', 'flags='=>'int'],
+'imap_undelete' => ['bool', 'stream_id'=>'resource', 'msg_no'=>'string', 'flags='=>'int'],
'imap_unsubscribe' => ['bool', 'stream_id'=>'resource', 'mailbox'=>'string'],
'imap_utf7_decode' => ['string|false', 'buf'=>'string'],
'imap_utf7_encode' => ['string', 'buf'=>'string'],
@@ -5284,7 +5286,7 @@
'inclued_get_data' => ['array'],
'inet_ntop' => ['string|false', 'in_addr'=>'string'],
'inet_pton' => ['string|false', 'ip_address'=>'string'],
-'InfiniteIterator::__construct' => ['void', 'it'=>'iterator'],
+'InfiniteIterator::__construct' => ['void', 'iterator'=>'Iterator'],
'InfiniteIterator::next' => ['void'],
'inflate_add' => ['string|false', 'context'=>'resource', 'encoded_data'=>'string', 'flush_mode='=>'int'],
'inflate_get_read_len' => ['int|false', 'resource'=>'resource'],
@@ -5329,10 +5331,10 @@
'ini_get_all' => ['array|false', 'extension='=>'?string', 'details='=>'bool'],
'ini_restore' => ['void', 'varname'=>'string'],
'ini_set' => ['string|false', 'varname'=>'string', 'newvalue'=>'string'],
-'inotify_add_watch' => ['int', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'],
+'inotify_add_watch' => ['int<1,max>|false', 'inotify_instance'=>'resource', 'pathname'=>'string', 'mask'=>'int'],
'inotify_init' => ['resource'],
-'inotify_queue_len' => ['int', 'inotify_instance'=>'resource'],
-'inotify_read' => ['array', 'inotify_instance'=>'resource'],
+'inotify_queue_len' => ['int<0,max>', 'inotify_instance'=>'resource'],
+'inotify_read' => ['list,mask:int<0,max>,cookie:int<0,max>,name:string}>|false', 'inotify_instance'=>'resource'],
'inotify_rm_watch' => ['bool', 'inotify_instance'=>'resource', 'watch_descriptor'=>'int'],
'intdiv' => ['int', 'numerator'=>'int', 'divisor'=>'int'],
'interface_exists' => ['bool', 'classname'=>'string', 'autoload='=>'bool'],
@@ -5353,7 +5355,7 @@
'IntlBreakIterator::getErrorCode' => ['int'],
'IntlBreakIterator::getErrorMessage' => ['string'],
'IntlBreakIterator::getLocale' => ['string', 'locale_type'=>'string'],
-'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'int'],
+'IntlBreakIterator::getPartsIterator' => ['IntlPartsIterator', 'key_type='=>'IntlPartsIterator::KEY_*'],
'IntlBreakIterator::getText' => ['string'],
'IntlBreakIterator::isBoundary' => ['bool', 'offset'=>'int'],
'IntlBreakIterator::last' => ['int'],
@@ -5376,7 +5378,7 @@
'intlcal_get_day_of_week_type' => ['int', 'cal'=>'IntlCalendar', 'dayOfWeek'=>'int'],
'intlcal_get_first_day_of_week' => ['int', 'cal'=>'IntlCalendar'],
'intlcal_get_greatest_minimum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'],
-'intlcal_get_keyword_values_for_locale' => ['Iterator', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'],
+'intlcal_get_keyword_values_for_locale' => ['Iterator|false', 'key'=>'string', 'locale'=>'string', 'commonlyUsed'=>'bool'],
'intlcal_get_least_maximum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'],
'intlcal_get_locale' => ['string', 'cal'=>'IntlCalendar', 'localeType'=>'int'],
'intlcal_get_maximum' => ['int', 'cal'=>'IntlCalendar', 'field'=>'int'],
@@ -5386,7 +5388,7 @@
'intlcal_get_repeated_wall_time_option' => ['int', 'cal'=>'IntlCalendar'],
'intlcal_get_skipped_wall_time_option' => ['int', 'cal'=>'IntlCalendar'],
'intlcal_get_time' => ['float', 'cal'=>'IntlCalendar'],
-'intlcal_get_time_zone' => ['IntlTimeZone', 'cal'=>'IntlCalendar'],
+'intlcal_get_time_zone' => ['IntlTimeZone|false', 'cal'=>'IntlCalendar'],
'intlcal_get_type' => ['string', 'cal'=>'IntlCalendar'],
'intlcal_get_weekend_transition' => ['int', 'cal'=>'IntlCalendar', 'dayOfWeek'=>'string'],
'intlcal_in_daylight_time' => ['bool', 'cal'=>'IntlCalendar'],
@@ -5403,7 +5405,7 @@
'intlcal_set_skipped_wall_time_option' => ['bool', 'cal'=>'IntlCalendar', 'wallTimeOption'=>'int'],
'intlcal_set_time' => ['bool', 'cal'=>'IntlCalendar', 'date'=>'float'],
'intlcal_set_time_zone' => ['bool', 'cal'=>'IntlCalendar', 'timeZone'=>'mixed'],
-'intlcal_to_date_time' => ['DateTime', 'cal'=>'IntlCalendar'],
+'intlcal_to_date_time' => ['DateTime|false', 'cal'=>'IntlCalendar'],
'IntlCalendar::__construct' => ['void'],
'IntlCalendar::add' => ['bool', 'field'=>'int', 'amount'=>'int'],
'IntlCalendar::after' => ['bool', 'other'=>'IntlCalendar'],
@@ -5513,24 +5515,24 @@
'IntlChar::toupper' => ['mixed', 'codepoint'=>'mixed'],
'IntlCodePointBreakIterator::getLastCodePoint' => ['int'],
'IntlDateFormatter::__construct' => ['void', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'null|int|IntlCalendar', 'pattern='=>'string'],
-'IntlDateFormatter::create' => ['IntlDateFormatter|false', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'],
-'IntlDateFormatter::format' => ['string', 'args'=>''],
-'IntlDateFormatter::formatObject' => ['string', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
-'IntlDateFormatter::getCalendar' => ['int'],
-'IntlDateFormatter::getCalendarObject' => ['IntlCalendar'],
-'IntlDateFormatter::getDateType' => ['int'],
+'IntlDateFormatter::create' => ['IntlDateFormatter|null', 'locale'=>'?string', 'datetype'=>'?int', 'timetype'=>'?int', 'timezone='=>'null|string|IntlTimeZone|DateTimeZone', 'calendar='=>'int|IntlCalendar', 'pattern='=>'string'],
+'IntlDateFormatter::format' => ['string|false', 'args'=>''],
+'IntlDateFormatter::formatObject' => ['string|false', 'object'=>'object', 'format='=>'mixed', 'locale='=>'string'],
+'IntlDateFormatter::getCalendar' => ['int|false'],
+'IntlDateFormatter::getCalendarObject' => ['IntlCalendar|false|null'],
+'IntlDateFormatter::getDateType' => ['int|false'],
'IntlDateFormatter::getErrorCode' => ['int'],
'IntlDateFormatter::getErrorMessage' => ['string'],
-'IntlDateFormatter::getLocale' => ['string'],
-'IntlDateFormatter::getPattern' => ['string'],
-'IntlDateFormatter::getTimeType' => ['int'],
-'IntlDateFormatter::getTimeZone' => ['IntlTimeZone'],
-'IntlDateFormatter::getTimeZoneId' => ['string'],
+'IntlDateFormatter::getLocale' => ['string|false'],
+'IntlDateFormatter::getPattern' => ['string|false'],
+'IntlDateFormatter::getTimeType' => ['int|false'],
+'IntlDateFormatter::getTimeZone' => ['IntlTimeZone|false'],
+'IntlDateFormatter::getTimeZoneId' => ['string|false'],
'IntlDateFormatter::isLenient' => ['bool'],
-'IntlDateFormatter::localtime' => ['array', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
-'IntlDateFormatter::parse' => ['int|false', 'text_to_parse'=>'string', '&rw_parse_pos='=>'int'],
+'IntlDateFormatter::localtime' => ['array|false', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
+'IntlDateFormatter::parse' => ['int|float|false', 'text_to_parse'=>'string', '&w_parse_pos='=>'int'],
'IntlDateFormatter::setCalendar' => ['bool', 'calendar'=>''],
-'IntlDateFormatter::setLenient' => ['bool', 'lenient'=>'bool'],
+'IntlDateFormatter::setLenient' => ['void', 'lenient'=>'bool'],
'IntlDateFormatter::setPattern' => ['bool', 'pattern'=>'string'],
'IntlDateFormatter::setTimeZone' => ['bool', 'timezone'=>''],
'IntlDateFormatter::setTimeZoneId' => ['bool', 'zone'=>'string', 'fmt='=>'IntlDateFormatter'],
@@ -5542,6 +5544,7 @@
'IntlIterator::next' => ['void'],
'IntlIterator::rewind' => ['void'],
'IntlIterator::valid' => ['bool'],
+'IntlPartsIterator::current' => ['non-empty-string'],
'IntlPartsIterator::getBreakIterator' => ['IntlBreakIterator'],
'IntlRuleBasedBreakIterator::__construct' => ['void', 'rules'=>'string', 'areCompiled='=>'string'],
'IntlRuleBasedBreakIterator::createCharacterInstance' => ['IntlRuleBasedBreakIterator', 'locale'=>'string'],
@@ -5592,26 +5595,26 @@
'IntlTimeZone::hasSameRules' => ['bool', 'otherTimeZone'=>'IntlTimeZone'],
'IntlTimeZone::toDateTimeZone' => ['DateTimeZone'],
'IntlTimeZone::useDaylightTime' => ['bool'],
-'intltz_count_equivalent_ids' => ['int', 'zoneId'=>'string'],
+'intltz_count_equivalent_ids' => ['int|false', 'zoneId'=>'string'],
'intltz_create_enumeration' => ['IntlIterator', 'countryOrRawOffset'=>'mixed'],
'intltz_create_time_zone' => ['IntlTimeZone', 'zoneId'=>'string'],
'intltz_from_date_time_zone' => ['IntlTimeZone', 'zoneId'=>'DateTimeZone'],
-'intltz_get_canonical_id' => ['string', 'zoneId'=>'string', '&isSystemID'=>'bool'],
-'intltz_get_display_name' => ['string', 'obj'=>'IntlTimeZone', 'isDaylight'=>'bool', 'style'=>'int', 'locale'=>'string'],
+'intltz_get_canonical_id' => ['string|false', 'zoneId'=>'string', '&isSystemID'=>'bool'],
+'intltz_get_display_name' => ['string|false', 'obj'=>'IntlTimeZone', 'isDaylight'=>'bool', 'style'=>'int', 'locale'=>'string'],
'intltz_get_dst_savings' => ['int', 'obj'=>'IntlTimeZone'],
-'intltz_get_equivalent_id' => ['string', 'zoneId'=>'string', 'index'=>'int'],
-'intltz_get_error_code' => ['int', 'obj'=>'IntlTimeZone'],
-'intltz_get_error_message' => ['string', 'obj'=>'IntlTimeZone'],
-'intltz_get_id' => ['string', 'obj'=>'IntlTimeZone'],
+'intltz_get_equivalent_id' => ['string|false', 'zoneId'=>'string', 'index'=>'int'],
+'intltz_get_error_code' => ['int|false', 'obj'=>'IntlTimeZone'],
+'intltz_get_error_message' => ['string|false', 'obj'=>'IntlTimeZone'],
+'intltz_get_id' => ['string|false', 'obj'=>'IntlTimeZone'],
'intltz_get_offset' => ['int', 'obj'=>'IntlTimeZone', 'date'=>'float', 'local'=>'bool', '&rawOffset'=>'int', '&dstOffset'=>'int'],
'intltz_get_raw_offset' => ['int', 'obj'=>'IntlTimeZone'],
-'intltz_get_tz_data_version' => ['string', 'obj'=>'IntlTimeZone'],
+'intltz_get_tz_data_version' => ['string|false', 'obj'=>'IntlTimeZone'],
'intltz_getGMT' => ['IntlTimeZone'],
'intltz_has_same_rules' => ['bool', 'obj'=>'IntlTimeZone', 'otherTimeZone'=>'IntlTimeZone'],
-'intltz_to_date_time_zone' => ['DateTimeZone', 'obj'=>''],
+'intltz_to_date_time_zone' => ['DateTimeZone|false', 'obj'=>''],
'intltz_use_daylight_time' => ['bool', 'obj'=>''],
'intlz_create_default' => ['IntlTimeZone'],
-'intval' => ['int', 'var'=>'mixed', 'base='=>'int'],
+'intval' => ['int', 'var'=>'scalar|array|resource|null', 'base='=>'int'],
'InvalidArgumentException::__clone' => ['void'],
'InvalidArgumentException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?InvalidArgumentException)'],
'InvalidArgumentException::__toString' => ['string'],
@@ -5620,11 +5623,11 @@
'InvalidArgumentException::getLine' => ['int'],
'InvalidArgumentException::getMessage' => ['string'],
'InvalidArgumentException::getPrevious' => ['Throwable|InvalidArgumentException|null'],
-'InvalidArgumentException::getTrace' => ['array'],
+'InvalidArgumentException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'InvalidArgumentException::getTraceAsString' => ['string'],
'ip2long' => ['int|false', 'ip_address'=>'string'],
'iptcembed' => ['string|bool', 'iptcdata'=>'string', 'jpeg_file_name'=>'string', 'spool='=>'int'],
-'iptcparse' => ['array|false', 'iptcdata'=>'string'],
+'iptcparse' => ['array>|false', 'iptcdata'=>'string'],
'is_a' => ['bool', 'object_or_string'=>'object|string', 'class_name'=>'string', 'allow_string='=>'bool'],
'is_array' => ['bool', 'var'=>'mixed'],
'is_bool' => ['bool', 'var'=>'mixed'],
@@ -5657,17 +5660,16 @@
'is_uploaded_file' => ['bool', 'path'=>'string'],
'is_writable' => ['bool', 'filename'=>'string'],
'is_writeable' => ['bool', 'filename'=>'string'],
-'isset' => ['bool', 'var'=>'mixed', '...rest='=>'mixed'],
'Iterator::current' => ['mixed'],
'Iterator::key' => ['mixed'],
'Iterator::next' => ['void'],
'Iterator::rewind' => ['void'],
'Iterator::valid' => ['bool'],
-'iterator_apply' => ['int', 'it'=>'Traversable', 'function'=>'callable', 'params='=>'array'],
-'iterator_count' => ['int', 'it'=>'Traversable'],
-'iterator_to_array' => ['array', 'it'=>'Traversable', 'use_keys='=>'bool'],
+'iterator_apply' => ['0|positive-int', 'iterator'=>'Traversable', 'function'=>'callable', 'params='=>'array'],
+'iterator_count' => ['0|positive-int', 'iterator'=>'Traversable'],
+'iterator_to_array' => ['array', 'iterator'=>'Traversable', 'use_keys='=>'bool'],
'IteratorAggregate::getIterator' => ['Traversable'],
-'IteratorIterator::__construct' => ['void', 'it'=>'Traversable'],
+'IteratorIterator::__construct' => ['void', 'iterator'=>'Traversable'],
'IteratorIterator::current' => ['mixed'],
'IteratorIterator::getInnerIterator' => ['Traversable'],
'IteratorIterator::key' => ['mixed'],
@@ -5694,9 +5696,9 @@
'join' => ['string', 'glue'=>'string', 'pieces'=>'array'],
'join\'1' => ['string', 'pieces'=>'array'],
'jpeg2wbmp' => ['bool', 'jpegname'=>'string', 'wbmpname'=>'string', 'dest_height'=>'int', 'dest_width'=>'int', 'threshold'=>'int'],
-'json_decode' => ['mixed', 'json'=>'string', 'assoc='=>'bool', 'depth='=>'int', 'options='=>'int'],
-'json_encode' => ['string|false', 'data'=>'mixed', 'options='=>'int', 'depth='=>'int'],
-'json_last_error' => ['int'],
+'json_decode' => ['mixed', 'json'=>'string', 'assoc='=>'bool|null', 'depth='=>'positive-int', 'options='=>'int'],
+'json_encode' => ['non-empty-string|false', 'data'=>'mixed', 'options='=>'int', 'depth='=>'positive-int'],
+'json_last_error' => ['JSON_ERROR_NONE|JSON_ERROR_DEPTH|JSON_ERROR_STATE_MISMATCH|JSON_ERROR_CTRL_CHAR|JSON_ERROR_SYNTAX|JSON_ERROR_UTF8|JSON_ERROR_RECURSION|JSON_ERROR_INF_OR_NAN|JSON_ERROR_UNSUPPORTED_TYPE|JSON_ERROR_INVALID_PROPERTY_NAME|JSON_ERROR_UTF16'],
'json_last_error_msg' => ['string'],
'JsonIncrementalParser::__construct' => ['void', 'depth'=>'', 'options'=>''],
'JsonIncrementalParser::get' => ['', 'options'=>''],
@@ -5708,7 +5710,7 @@
'Judy::__construct' => ['void', 'judy_type'=>'int'],
'Judy::__destruct' => [''],
'Judy::byCount' => ['int', 'nth_index'=>'int'],
-'Judy::count' => ['int', 'index_start='=>'int', 'index_end='=>'int'],
+'Judy::count' => ['0|positive-int', 'index_start='=>'int', 'index_end='=>'int'],
'Judy::first' => ['mixed', 'index='=>'mixed'],
'Judy::firstEmpty' => ['int', 'index='=>'mixed'],
'Judy::free' => ['int'],
@@ -5738,7 +5740,7 @@
'kadm5_get_principals' => ['array', 'handle'=>'resource'],
'kadm5_init_with_password' => ['resource', 'admin_server'=>'string', 'realm'=>'string', 'principal'=>'string', 'password'=>'string'],
'kadm5_modify_principal' => ['bool', 'handle'=>'resource', 'principal'=>'string', 'options'=>'array'],
-'key' => ['int|string|null', 'array_arg'=>'array'],
+'key' => ['int|string|null', 'array_arg'=>'array|object'],
'key_exists' => ['bool', 'key'=>'string|int', 'search'=>'array'],
'krsort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'],
'ksort' => ['bool', '&rw_array_arg'=>'array', 'sort_flags='=>'int'],
@@ -5824,7 +5826,7 @@
'layerObj::isVisible' => ['bool'],
'layerObj::moveclassdown' => ['int', 'index'=>'int'],
'layerObj::moveclassup' => ['int', 'index'=>'int'],
-'layerObj::ms_newLayerObj' => ['layerObj', 'map'=>'MapObj', 'layer'=>'layerObj'],
+'layerObj::ms_newLayerObj' => ['layerObj', 'map'=>'mapObj', 'layer'=>'layerObj'],
'layerObj::nextShape' => ['shapeObj'],
'layerObj::open' => ['int'],
'layerObj::queryByAttributes' => ['int', 'qitem'=>'string', 'qstring'=>'string', 'mode'=>'int'],
@@ -5845,64 +5847,64 @@
'lcg_value' => ['float'],
'lchgrp' => ['bool', 'filename'=>'string', 'group'=>'string|int'],
'lchown' => ['bool', 'filename'=>'string', 'user'=>'string|int'],
-'ldap_8859_to_t61' => ['string', 'value'=>'string'],
+'ldap_8859_to_t61' => ['string|false', 'value'=>'string'],
'ldap_add' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
'ldap_add_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
-'ldap_bind' => ['bool', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls=' => 'array'],
-'ldap_bind_ext' => ['resource|false', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls' => 'array'],
+'ldap_bind' => ['bool', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls='=>'array'],
+'ldap_bind_ext' => ['resource|false', 'link_identifier'=>'resource', 'bind_rdn='=>'string|null', 'bind_password='=>'string|null', 'serverctrls='=>'array'],
'ldap_close' => ['bool', 'link_identifier'=>'resource'],
-'ldap_compare' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'attr'=>'string', 'value'=>'string'],
+'ldap_compare' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'attr'=>'string', 'value'=>'string', 'servercontrols='=>'array'],
'ldap_connect' => ['resource|false', 'host='=>'string', 'port='=>'int', 'wallet='=>'string', 'wallet_passwd='=>'string', 'authmode='=>'int'],
'ldap_control_paged_result' => ['bool', 'link_identifier'=>'resource', 'pagesize'=>'int', 'iscritical='=>'bool', 'cookie='=>'string'],
'ldap_control_paged_result_response' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', '&w_cookie='=>'string', '&w_estimated='=>'int'],
'ldap_count_entries' => ['int', 'link_identifier'=>'resource', 'result'=>'resource'],
-'ldap_delete' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string'],
+'ldap_delete' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'servercontrols='=>'array'],
'ldap_delete_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'servercontrols='=>'array'],
-'ldap_dn2ufn' => ['string', 'dn'=>'string'],
+'ldap_dn2ufn' => ['string|false', 'dn'=>'string'],
'ldap_err2str' => ['string', 'errno'=>'int'],
'ldap_errno' => ['int', 'link_identifier'=>'resource'],
'ldap_error' => ['string', 'link_identifier'=>'resource'],
'ldap_escape' => ['string', 'value'=>'string', 'ignore='=>'string', 'flags='=>'int'],
-'ldap_exop' => ['mixed', 'link'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'serverctrls='=>'array|null', '&w_retdata='=>'string', '&w_retoid='=>'string'],
-'ldap_exop_passwd' => ['mixed', 'link'=>'resource', 'user='=>'string', 'oldpw='=>'string', 'newpw='=>'string', 'serverctrls='=>'array'],
+'ldap_exop' => ['resource|bool', 'link'=>'resource', 'reqoid'=>'string', 'reqdata='=>'string', 'serverctrls='=>'array|null', '&w_retdata='=>'string', '&w_retoid='=>'string'],
+'ldap_exop_passwd' => ['string|bool', 'link'=>'resource', 'user='=>'string', 'oldpw='=>'string', 'newpw='=>'string', 'serverctrls='=>'array'],
'ldap_exop_refresh' => ['int|false', 'link'=>'resource', 'dn'=>'string', 'ttl'=>'int'],
-'ldap_exop_whoami' => ['string', 'link'=>'resource'],
-'ldap_explode_dn' => ['array', 'dn'=>'string', 'with_attrib'=>'int'],
-'ldap_first_attribute' => ['string', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
+'ldap_exop_whoami' => ['string|bool', 'link'=>'resource'],
+'ldap_explode_dn' => ['array|false', 'dn'=>'string', 'with_attrib'=>'int'],
+'ldap_first_attribute' => ['string|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
'ldap_first_entry' => ['resource|false', 'link_identifier'=>'resource', 'result_identifier'=>'resource'],
'ldap_first_reference' => ['resource|false', 'link_identifier'=>'resource', 'result_identifier'=>'resource'],
'ldap_free_result' => ['bool', 'result_identifier'=>'resource'],
'ldap_get_attributes' => ['array', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
-'ldap_get_dn' => ['string', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
+'ldap_get_dn' => ['string|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
'ldap_get_entries' => ['array|false', 'link_identifier'=>'resource', 'result_identifier'=>'resource'],
'ldap_get_option' => ['bool', 'link_identifier'=>'resource', 'option'=>'int', '&w_retval'=>'mixed'],
-'ldap_get_values' => ['array', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource', 'attribute'=>'string'],
-'ldap_get_values_len' => ['array', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource', 'attribute'=>'string'],
-'ldap_list' => ['resource|false', 'link'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'],
-'ldap_mod_add' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'],
+'ldap_get_values' => ['array|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource', 'attribute'=>'string'],
+'ldap_get_values_len' => ['array|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource', 'attribute'=>'string'],
+'ldap_list' => ['resource|false', 'link'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'servercontrols='=>'array'],
+'ldap_mod_add' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
'ldap_mod_add_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
-'ldap_mod_del' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'],
+'ldap_mod_del' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
'ldap_mod_del_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
-'ldap_mod_replace' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'],
+'ldap_mod_replace' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
'ldap_mod_replace_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array', 'servercontrols='=>'array'],
'ldap_modify' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'entry'=>'array'],
-'ldap_modify_batch' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'modifs'=>'array'],
-'ldap_next_attribute' => ['string', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
+'ldap_modify_batch' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'modifs'=>'array', 'servercontrols='=>'array'],
+'ldap_next_attribute' => ['string|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
'ldap_next_entry' => ['resource|false', 'link_identifier'=>'resource', 'result_entry_identifier'=>'resource'],
'ldap_next_reference' => ['resource|false', 'link_identifier'=>'resource', 'reference_entry_identifier'=>'resource'],
'ldap_parse_exop' => ['bool', 'link'=>'resource', 'result'=>'resource', '&w_retdata='=>'string', '&w_retoid='=>'string'],
'ldap_parse_reference' => ['bool', 'link_identifier'=>'resource', 'reference_entry_identifier'=>'resource', 'referrals'=>'array'],
'ldap_parse_result' => ['bool', 'link_identifier'=>'resource', 'result'=>'resource', '&w_errcode'=>'int', '&w_matcheddn='=>'string', '&w_errmsg='=>'string', '&w_referrals='=>'array', '&w_serverctrls='=>'array'],
-'ldap_read' => ['resource|false', 'link'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'],
-'ldap_rename' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'newrdn'=>'string', 'newparent'=>'string', 'deleteoldrdn'=>'bool'],
+'ldap_read' => ['resource|false', 'link'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'servercontrols='=>'array'],
+'ldap_rename' => ['bool', 'link_identifier'=>'resource', 'dn'=>'string', 'newrdn'=>'string', 'newparent'=>'string', 'deleteoldrdn'=>'bool', 'servercontrols='=>'array'],
'ldap_rename_ext' => ['resource|false', 'link_identifier'=>'resource', 'dn'=>'string', 'newrdn'=>'string', 'newparent'=>'string', 'deleteoldrdn'=>'bool', 'servercontrols='=>'array'],
'ldap_sasl_bind' => ['bool', 'link_identifier'=>'resource', 'binddn='=>'string', 'password='=>'string', 'sasl_mech='=>'string', 'sasl_realm='=>'string', 'sasl_authc_id='=>'string', 'sasl_authz_id='=>'string', 'props='=>'string'],
-'ldap_search' => ['resource|false', 'link_identifier'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int'],
+'ldap_search' => ['resource|false', 'link_identifier'=>'resource|array', 'base_dn'=>'string', 'filter'=>'string', 'attrs='=>'array', 'attrsonly='=>'int', 'sizelimit='=>'int', 'timelimit='=>'int', 'deref='=>'int', 'servercontrols='=>'array'],
'ldap_set_option' => ['bool', 'link_identifier'=>'resource|null', 'option'=>'int', 'newval'=>'mixed'],
-'ldap_set_rebind_proc' => ['bool', 'link_identifier'=>'resource', 'callback'=>'string'],
+'ldap_set_rebind_proc' => ['bool', 'link_identifier'=>'resource', 'callback'=>'callable'],
'ldap_sort' => ['bool', 'link_identifier'=>'resource', 'result_identifier'=>'resource', 'sortfilter'=>'string'],
'ldap_start_tls' => ['bool', 'link_identifier'=>'resource'],
-'ldap_t61_to_8859' => ['string', 'value'=>'string'],
+'ldap_t61_to_8859' => ['string|false', 'value'=>'string'],
'ldap_unbind' => ['bool', 'link_identifier'=>'resource'],
'leak' => ['', 'num_bytes'=>'int'],
'leak_variable' => ['', 'variable'=>'', 'leak_data'=>'bool'],
@@ -5918,7 +5920,7 @@
'LengthException::getLine' => ['int'],
'LengthException::getMessage' => ['string'],
'LengthException::getPrevious' => ['Throwable|LengthException|null'],
-'LengthException::getTrace' => ['array'],
+'LengthException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'LengthException::getTraceAsString' => ['string'],
'levenshtein' => ['int', 'str1'=>'string', 'str2'=>'string'],
'levenshtein\'1' => ['int', 'str1'=>'string', 'str2'=>'string', 'cost_ins'=>'int', 'cost_rep'=>'int', 'cost_del'=>'int'],
@@ -5946,44 +5948,44 @@
'lineObj::point' => ['pointObj', 'i'=>'int'],
'lineObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'],
'link' => ['bool', 'target'=>'string', 'link'=>'string'],
-'linkinfo' => ['int', 'filename'=>'string'],
+'linkinfo' => ['int|false', 'filename'=>'string'],
'litespeed_request_headers' => ['array'],
-'litespeed_response_headers' => ['array'],
-'Locale::acceptFromHttp' => ['string|false', 'header'=>'string'],
-'Locale::canonicalize' => ['string', 'locale'=>'string'],
-'Locale::composeLocale' => ['string', 'subtags'=>'array'],
-'Locale::filterMatches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
-'Locale::getAllVariants' => ['array', 'locale'=>'string'],
-'Locale::getDefault' => ['string'],
-'Locale::getDisplayLanguage' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayName' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayRegion' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'Locale::getKeywords' => ['array|false', 'locale'=>'string'],
-'Locale::getPrimaryLanguage' => ['string', 'locale'=>'string'],
-'Locale::getRegion' => ['string', 'locale'=>'string'],
-'Locale::getScript' => ['string', 'locale'=>'string'],
-'Locale::lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'],
-'Locale::parseLocale' => ['array', 'locale'=>'string'],
+'litespeed_response_headers' => ['array|false'],
+'Locale::acceptFromHttp' => ['non-empty-string|false', 'header'=>'string'],
+'Locale::canonicalize' => ['non-empty-string|null', 'locale'=>'string'],
+'Locale::composeLocale' => ['string|false', 'subtags'=>'array{language:string, script?:string, region?:string, variant?:array, private?:array, extlang?:array, variant0?:string, variant1?:string, variant2?:string, variant3?:string, variant4?:string, variant5?:string, variant6?:string, variant7?:string, variant8?:string, variant9?:string, variant10?:string, variant11?:string, variant12?:string, variant13?:string, variant14?:string, private0?:string, private1?:string, private2?:string, private3?:string, private4?:string, private5?:string, private6?:string, private7?:string, private8?:string, private9?:string, private10?:string, private11?:string, private12?:string, private13?:string, private14?:string, extlang0?:string, extlang1?:string, extlang2?:string}'],
+'Locale::filterMatches' => ['bool|null', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
+'Locale::getAllVariants' => ['array|null', 'locale'=>'string'],
+'Locale::getDefault' => ['non-empty-string'],
+'Locale::getDisplayLanguage' => ['non-empty-string', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayName' => ['non-empty-string', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayRegion' => ['non-empty-string', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayScript' => ['string', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getDisplayVariant' => ['string', 'locale'=>'string', 'displayLocale='=>'string'],
+'Locale::getKeywords' => ['array|null', 'locale'=>'string'],
+'Locale::getPrimaryLanguage' => ['non-empty-string|null', 'locale'=>'string'],
+'Locale::getRegion' => ['string|null', 'locale'=>'string'],
+'Locale::getScript' => ['string|null', 'locale'=>'string'],
+'Locale::lookup' => ['string|null', 'languageTag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'],
+'Locale::parseLocale' => ['array|null', 'locale'=>'string'],
'Locale::setDefault' => ['bool', 'locale'=>'string'],
-'locale_accept_from_http' => ['string|false', 'header'=>'string'],
-'locale_canonicalize' => ['', 'arg1'=>''],
-'locale_compose' => ['string|false', 'subtags'=>'array'],
-'locale_filter_matches' => ['bool', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
-'locale_get_all_variants' => ['array', 'locale'=>'string'],
-'locale_get_default' => ['string'],
-'locale_get_display_language' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_name' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_region' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_script' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_display_variant' => ['string', 'locale'=>'string', 'in_locale='=>'string'],
-'locale_get_keywords' => ['array|false', 'locale'=>'string'],
-'locale_get_primary_language' => ['string', 'locale'=>'string'],
-'locale_get_region' => ['string', 'locale'=>'string'],
-'locale_get_script' => ['string', 'locale'=>'string'],
-'locale_lookup' => ['string', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'default='=>'string'],
-'locale_parse' => ['array', 'locale'=>'string'],
+'locale_accept_from_http' => ['non-empty-string|false', 'header'=>'string'],
+'locale_canonicalize' => ['non-empty-string|null', 'locale'=>'string'],
+'locale_compose' => ['string|false', 'subtags'=>'array{language:string, script?:string, region?:string, variant?:array, private?:array, extlang?:array, variant0?:string, variant1?:string, variant2?:string, variant3?:string, variant4?:string, variant5?:string, variant6?:string, variant7?:string, variant8?:string, variant9?:string, variant10?:string, variant11?:string, variant12?:string, variant13?:string, variant14?:string, private0?:string, private1?:string, private2?:string, private3?:string, private4?:string, private5?:string, private6?:string, private7?:string, private8?:string, private9?:string, private10?:string, private11?:string, private12?:string, private13?:string, private14?:string, extlang0?:string, extlang1?:string, extlang2?:string}'],
+'locale_filter_matches' => ['bool|null', 'langtag'=>'string', 'locale'=>'string', 'canonicalize='=>'bool'],
+'locale_get_all_variants' => ['array|null', 'locale'=>'string'],
+'locale_get_default' => ['non-empty-string'],
+'locale_get_display_language' => ['non-empty-string', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_name' => ['non-empty-string', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_region' => ['non-empty-string', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_script' => ['string', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_display_variant' => ['string', 'locale'=>'string', 'displayLocale='=>'string'],
+'locale_get_keywords' => ['array|null', 'locale'=>'string'],
+'locale_get_primary_language' => ['non-empty-string|null', 'locale'=>'string'],
+'locale_get_region' => ['string|null', 'locale'=>'string'],
+'locale_get_script' => ['string|null', 'locale'=>'string'],
+'locale_lookup' => ['string|null', 'langtag'=>'array', 'locale'=>'string', 'canonicalize='=>'bool', 'defaultLocale='=>'string'],
+'locale_parse' => ['array|null', 'locale'=>'string'],
'locale_set_default' => ['bool', 'locale'=>'string'],
'localeconv' => ['array'],
'localtime' => ['array', 'timestamp='=>'int', 'associative_array='=>'bool'],
@@ -5998,9 +6000,9 @@
'LogicException::getLine' => ['int'],
'LogicException::getMessage' => ['string'],
'LogicException::getPrevious' => ['Throwable|LogicException|null'],
-'LogicException::getTrace' => ['array'],
+'LogicException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'LogicException::getTraceAsString' => ['string'],
-'long2ip' => ['string', 'proper_address'=>'int'],
+'long2ip' => ['string|false', 'proper_address'=>'int'],
'lstat' => ['array|false', 'filename'=>'string'],
'ltrim' => ['string', 'str'=>'string', 'character_mask='=>'string'],
'Lua::__call' => ['mixed', 'lua_func'=>'callable', 'args='=>'array', 'use_self='=>'int'],
@@ -6062,7 +6064,7 @@
'mailparse_msg_extract_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'mixed', 'callbackfunc='=>'callable'],
'mailparse_msg_extract_whole_part_file' => ['string', 'mimemail'=>'resource', 'filename'=>'string', 'callbackfunc='=>'callable'],
'mailparse_msg_free' => ['bool', 'mimemail'=>'resource'],
-'mailparse_msg_get_part' => ['resource', 'mimemail'=>'resource', 'mimesection'=>'string'],
+'mailparse_msg_get_part' => ['resource|false', 'mimemail'=>'resource', 'mimesection'=>'string'],
'mailparse_msg_get_part_data' => ['array', 'mimemail'=>'resource'],
'mailparse_msg_get_structure' => ['array', 'mimemail'=>'resource'],
'mailparse_msg_parse' => ['bool', 'mimemail'=>'resource', 'data'=>'string'],
@@ -6105,7 +6107,7 @@
'mapObj::loadOWSParameters' => ['int', 'request'=>'OwsrequestObj', 'version'=>'string'],
'mapObj::moveLayerDown' => ['int', 'layerindex'=>'int'],
'mapObj::moveLayerUp' => ['int', 'layerindex'=>'int'],
-'mapObj::ms_newMapObjFromString' => ['MapObj', 'map_file_string'=>'string', 'new_map_path'=>'string'],
+'mapObj::ms_newMapObjFromString' => ['mapObj', 'map_file_string'=>'string', 'new_map_path'=>'string'],
'mapObj::offsetExtent' => ['int', 'x'=>'float', 'y'=>'float'],
'mapObj::owsDispatch' => ['int', 'request'=>'OwsrequestObj'],
'mapObj::prepareImage' => ['imageObj'],
@@ -6140,7 +6142,7 @@
'mapObj::zoomPoint' => ['int', 'nZoomFactor'=>'int', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'],
'mapObj::zoomRectangle' => ['int', 'oPixelExt'=>'rectObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj'],
'mapObj::zoomScale' => ['int', 'nScaleDenom'=>'float', 'oPixelPos'=>'pointObj', 'nImageWidth'=>'int', 'nImageHeight'=>'int', 'oGeorefExt'=>'rectObj', 'oMaxGeorefExt'=>'rectObj'],
-'max' => ['', '...arg1'=>'array'],
+'max' => ['', '...arg1'=>'non-empty-array'],
'max\'1' => ['', 'arg1'=>'', 'arg2'=>'', '...args='=>''],
'maxdb::__construct' => ['void', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'],
'maxdb::affected_rows' => ['int', 'link'=>''],
@@ -6307,23 +6309,23 @@
'maxdb_thread_safe' => ['bool'],
'maxdb_use_result' => ['resource', 'link'=>''],
'maxdb_warning_count' => ['int', 'link'=>'resource'],
-'mb_check_encoding' => ['bool', 'var='=>'string', 'encoding='=>'string'],
+'mb_check_encoding' => ['bool', 'var='=>'string|array', 'encoding='=>'string'],
'mb_chr' => ['string|false', 'cp'=>'int', 'encoding='=>'string'],
'mb_convert_case' => ['string', 'sourcestring'=>'string', 'mode'=>'int', 'encoding='=>'string'],
-'mb_convert_encoding' => ['string|array', 'val'=>'string|array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'],
+'mb_convert_encoding' => ['string|array|false', 'val'=>'string|array', 'to_encoding'=>'string', 'from_encoding='=>'mixed'],
'mb_convert_kana' => ['string', 'str'=>'string', 'option='=>'string', 'encoding='=>'string'],
'mb_convert_variables' => ['string|false', 'to_encoding'=>'string', 'from_encoding'=>'array|string', '&rw_vars'=>'string|array|object', '&...rw_vars='=>'string|array|object'],
'mb_decode_mimeheader' => ['string', 'string'=>'string'],
'mb_decode_numericentity' => ['string', 'string'=>'string', 'convmap'=>'array', 'encoding'=>'string'],
'mb_detect_encoding' => ['string|false', 'str'=>'string', 'encoding_list='=>'mixed', 'strict='=>'bool'],
-'mb_detect_order' => ['bool|array', 'encoding_list='=>'mixed'],
+'mb_detect_order' => ['bool|list', 'encoding_list='=>'non-empty-list|non-falsy-string'],
'mb_encode_mimeheader' => ['string', 'str'=>'string', 'charset='=>'string', 'transfer_encoding='=>'string', 'linefeed='=>'string', 'indent='=>'int'],
'mb_encode_numericentity' => ['string', 'string'=>'string', 'convmap'=>'array', 'encoding='=>'string', 'is_hex='=>'bool'],
-'mb_encoding_aliases' => ['array|false', 'encoding'=>'string'],
+'mb_encoding_aliases' => ['list|false', 'encoding'=>'string'],
'mb_ereg' => ['int|false', 'pattern'=>'string', 'string'=>'string', '&w_registers='=>'array'],
'mb_ereg_match' => ['bool', 'pattern'=>'string', 'string'=>'string', 'option='=>'string'],
-'mb_ereg_replace' => ['string|false', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'option='=>'string'],
-'mb_ereg_replace_callback' => ['string|false', 'pattern'=>'string', 'callback'=>'callable', 'string'=>'string', 'option='=>'string'],
+'mb_ereg_replace' => ['string|false|null', 'pattern'=>'string', 'replacement'=>'string', 'string'=>'string', 'option='=>'string'],
+'mb_ereg_replace_callback' => ['string|false|null', 'pattern'=>'string', 'callback'=>'callable(array):string', 'string'=>'string', 'option='=>'string'],
'mb_ereg_search' => ['bool', 'pattern='=>'string', 'option='=>'string'],
'mb_ereg_search_getpos' => ['int'],
'mb_ereg_search_getregs' => ['array|false'],
@@ -6338,33 +6340,33 @@
'mb_http_output' => ['string|bool', 'encoding='=>'string'],
'mb_internal_encoding' => ['string|bool', 'encoding='=>'string'],
'mb_language' => ['string|bool', 'language='=>'string'],
-'mb_list_encodings' => ['array'],
+'mb_list_encodings' => ['non-empty-list'],
'mb_ord' => ['int|false', 'str'=>'string', 'enc='=>'string'],
'mb_output_handler' => ['string', 'contents'=>'string', 'status'=>'int'],
'mb_parse_str' => ['bool', 'encoded_string'=>'string', '&w_result='=>'array'],
-'mb_preferred_mime_name' => ['string', 'encoding'=>'string'],
+'mb_preferred_mime_name' => ['string|false', 'encoding'=>'string'],
'mb_regex_encoding' => ['string|bool', 'encoding='=>'string'],
'mb_regex_set_options' => ['string', 'options='=>'string'],
'mb_scrub' => ['string', 'str'=>'string', 'enc='=>'string'],
'mb_send_mail' => ['bool', 'to'=>'string', 'subject'=>'string', 'message'=>'string', 'additional_headers='=>'string|array|null', 'additional_parameter='=>'string'],
-'mb_split' => ['array', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'],
-'mb_strcut' => ['string', 'str'=>'string', 'start'=>'int', 'length='=>'int', 'encoding='=>'string'],
+'mb_split' => ['list|false', 'pattern'=>'string', 'string'=>'string', 'limit='=>'int'],
+'mb_strcut' => ['string', 'str'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'],
'mb_strimwidth' => ['string', 'str'=>'string', 'start'=>'int', 'width'=>'int', 'trimmarker='=>'string', 'encoding='=>'string'],
-'mb_stripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_stripos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
'mb_stristr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
-'mb_strlen' => ['int|false', 'str'=>'string', 'encoding='=>'string'],
-'mb_strpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_strlen' => ['0|positive-int|false', 'str'=>'string', 'encoding='=>'string'],
+'mb_strpos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
'mb_strrchr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
'mb_strrichr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
-'mb_strripos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
-'mb_strrpos' => ['int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_strripos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
+'mb_strrpos' => ['0|positive-int|false', 'haystack'=>'string', 'needle'=>'string', 'offset='=>'int', 'encoding='=>'string'],
'mb_strstr' => ['string|false', 'haystack'=>'string', 'needle'=>'string', 'part='=>'bool', 'encoding='=>'string'],
-'mb_strtolower' => ['string', 'str'=>'string', 'encoding='=>'string'],
-'mb_strtoupper' => ['string', 'str'=>'string', 'encoding='=>'string'],
-'mb_strwidth' => ['int', 'str'=>'string', 'encoding='=>'string'],
+'mb_strtolower' => ['lowercase-string', 'str'=>'string', 'encoding='=>'string'],
+'mb_strtoupper' => ['uppercase-string', 'str'=>'string', 'encoding='=>'string'],
+'mb_strwidth' => ['0|positive-int', 'str'=>'string', 'encoding='=>'string'],
'mb_substitute_character' => ['mixed', 'substchar='=>'mixed'],
'mb_substr' => ['string', 'str'=>'string', 'start'=>'int', 'length='=>'?int', 'encoding='=>'string'],
-'mb_substr_count' => ['int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'],
+'mb_substr_count' => ['0|positive-int', 'haystack'=>'string', 'needle'=>'string', 'encoding='=>'string'],
'mcrypt_cbc' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'],
'mcrypt_cfb' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'],
'mcrypt_create_iv' => ['string', 'size'=>'int', 'source='=>'int'],
@@ -6398,11 +6400,11 @@
'mcrypt_module_is_block_algorithm' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'],
'mcrypt_module_is_block_algorithm_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'],
'mcrypt_module_is_block_mode' => ['bool', 'mode'=>'string', 'lib_dir='=>'string'],
-'mcrypt_module_open' => ['resource', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'],
+'mcrypt_module_open' => ['resource|false', 'cipher'=>'string', 'cipher_directory'=>'string', 'mode'=>'string', 'mode_directory'=>'string'],
'mcrypt_module_self_test' => ['bool', 'algorithm'=>'string', 'lib_dir='=>'string'],
'mcrypt_ofb' => ['string', 'cipher'=>'string', 'key'=>'string', 'data'=>'string', 'mode'=>'int', 'iv='=>'string'],
-'md5' => ['string', 'str'=>'string', 'raw_output='=>'bool'],
-'md5_file' => ['string|false', 'filename'=>'string', 'raw_output='=>'bool'],
+'md5' => ['non-falsy-string&lowercase-string', 'str'=>'string', 'raw_output='=>'bool'],
+'md5_file' => ['(non-falsy-string&lowercase-string)|false', 'filename'=>'string', 'raw_output='=>'bool'],
'mdecrypt_generic' => ['string', 'td'=>'resource', 'data'=>'string'],
'Memcache::add' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'],
'Memcache::addServer' => ['bool', 'host'=>'string', 'port='=>'int', 'persistent='=>'bool', 'weight='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable', 'timeoutms='=>'int'],
@@ -6411,7 +6413,8 @@
'Memcache::decrement' => ['int', 'key'=>'string', 'value='=>'int'],
'Memcache::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'],
'Memcache::flush' => ['bool'],
-'Memcache::get' => ['array', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'],
+'Memcache::get' => ['mixed', 'key'=>'string', '&flags='=>'int'],
+'Memcache::get\'1' => ['mixed[]|false', 'keys'=>'string[]', '&flags='=>'int[]'],
'Memcache::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
'Memcache::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'],
'Memcache::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
@@ -6435,7 +6438,7 @@
'Memcached::decrementByKey' => ['int|false', 'server_key'=>'string', 'key'=>'string', 'offset='=>'int', 'initial_value='=>'int', 'expiry='=>'int'],
'Memcached::delete' => ['bool', 'key'=>'string', 'time='=>'int'],
'Memcached::deleteByKey' => ['bool', 'server_key'=>'string', 'key'=>'string', 'time='=>'int'],
-'Memcached::deleteMulti' => ['bool', 'keys'=>'array', 'time='=>'int'],
+'Memcached::deleteMulti' => ['array', 'keys'=>'array', 'time='=>'int'],
'Memcached::deleteMultiByKey' => ['bool', 'server_key'=>'string', 'keys'=>'array', 'time='=>'int'],
'Memcached::fetch' => ['array'],
'Memcached::fetchAll' => ['array'],
@@ -6478,7 +6481,8 @@
'MemcachePool::decrement' => ['int', 'key'=>'string', 'value='=>'int'],
'MemcachePool::delete' => ['bool', 'key'=>'string', 'timeout='=>'int'],
'MemcachePool::flush' => ['bool'],
-'MemcachePool::get' => ['array', 'key'=>'string', 'flags='=>'array', 'keys='=>'array'],
+'MemcachePool::get' => ['mixed', 'key'=>'string', '&flags='=>'int'],
+'MemcachePool::get\'1' => ['mixed[]|false', 'keys'=>'string[]', '&flags='=>'int[]'],
'MemcachePool::getExtendedStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
'MemcachePool::getServerStatus' => ['int', 'host'=>'string', 'port='=>'int'],
'MemcachePool::getStats' => ['array', 'type='=>'string', 'slabid='=>'int', 'limit='=>'int'],
@@ -6488,8 +6492,8 @@
'MemcachePool::set' => ['bool', 'key'=>'string', 'var'=>'mixed', 'flag='=>'int', 'expire='=>'int'],
'MemcachePool::setCompressThreshold' => ['bool', 'threshold'=>'int', 'min_savings='=>'float'],
'MemcachePool::setServerParams' => ['bool', 'host'=>'string', 'port='=>'int', 'timeout='=>'int', 'retry_interval='=>'int', 'status='=>'bool', 'failure_callback='=>'callable'],
-'memory_get_peak_usage' => ['int', 'real_usage='=>'bool'],
-'memory_get_usage' => ['int', 'real_usage='=>'bool'],
+'memory_get_peak_usage' => ['positive-int', 'real_usage='=>'bool'],
+'memory_get_usage' => ['positive-int', 'real_usage='=>'bool'],
'MessageFormatter::__construct' => ['void', 'locale'=>'string', 'pattern'=>'string'],
'MessageFormatter::create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'],
'MessageFormatter::format' => ['false|string', 'args'=>'array'],
@@ -6503,14 +6507,14 @@
'MessageFormatter::setPattern' => ['bool', 'pattern'=>'string'],
'metaphone' => ['string', 'text'=>'string', 'phones='=>'int'],
'method_exists' => ['bool', 'object'=>'object|string', 'method'=>'string'],
-'mhash' => ['string', 'hash'=>'int', 'data'=>'string', 'key='=>'string'],
+'mhash' => ['string|false', 'hash'=>'int', 'data'=>'string', 'key='=>'string'],
'mhash_count' => ['int'],
-'mhash_get_block_size' => ['int', 'hash'=>'int'],
-'mhash_get_hash_name' => ['string', 'hash'=>'int'],
-'mhash_keygen_s2k' => ['string', 'hash'=>'int', 'input_password'=>'string', 'salt'=>'string', 'bytes'=>'int'],
+'mhash_get_block_size' => ['int|false', 'hash'=>'int'],
+'mhash_get_hash_name' => ['string|false', 'hash'=>'int'],
+'mhash_keygen_s2k' => ['string|false', 'hash'=>'int', 'input_password'=>'string', 'salt'=>'string', 'bytes'=>'int'],
'microtime' => ['mixed', 'get_as_float='=>'bool'],
-'mime_content_type' => ['string|false', 'filename_or_stream'=>'string'],
-'min' => ['', '...arg1'=>'array'],
+'mime_content_type' => ['string|false', 'filename_or_stream'=>'string|resource'],
+'min' => ['', '...arg1'=>'non-empty-array'],
'min\'1' => ['', 'arg1'=>'', 'arg2'=>'', '...args='=>''],
'ming_keypress' => ['int', 'char'=>'string'],
'ming_setcubicthreshold' => ['void', 'threshold'=>'int'],
@@ -6519,7 +6523,7 @@
'ming_useconstants' => ['void', 'use'=>'int'],
'ming_useswfversion' => ['void', 'version'=>'int'],
'mkdir' => ['bool', 'pathname'=>'string', 'mode='=>'int', 'recursive='=>'bool', 'context='=>'resource'],
-'mktime' => ['int', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'],
+'mktime' => ['__benevolent', 'hour='=>'int', 'min='=>'int', 'sec='=>'int', 'mon='=>'int', 'day='=>'int', 'year='=>'int'],
'money_format' => ['string', 'format'=>'string', 'value'=>'float'],
'Mongo::__construct' => ['void', 'server='=>'string', 'options='=>'array', 'driver_options='=>'array'],
'Mongo::__get' => ['MongoDB', 'dbname'=>'string'],
@@ -6579,7 +6583,7 @@
'MongoCollection::aggregate\'1' => ['array', 'pipeline'=>'array', 'options='=>'array'],
'MongoCollection::aggregateCursor' => ['MongoCommandCursor', 'command'=>'array', 'options='=>'array'],
'MongoCollection::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'],
-'MongoCollection::count' => ['int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'],
+'MongoCollection::count' => ['0|positive-int', 'query='=>'array', 'limit='=>'int', 'skip='=>'int'],
'MongoCollection::createDBRef' => ['array', 'a'=>'array'],
'MongoCollection::createIndex' => ['bool', 'keys'=>'array', 'options='=>'array'],
'MongoCollection::deleteIndex' => ['array', 'keys'=>'string|array'],
@@ -6589,7 +6593,7 @@
'MongoCollection::ensureIndex' => ['bool', 'keys'=>'array', 'options='=>'array'],
'MongoCollection::find' => ['MongoCursor', 'query='=>'array', 'fields='=>'array'],
'MongoCollection::findAndModify' => ['array', 'query'=>'array', 'update='=>'array', 'fields='=>'array', 'options='=>'array'],
-'MongoCollection::findOne' => ['array', 'query='=>'array', 'fields='=>'array'],
+'MongoCollection::findOne' => ['array|null', 'query='=>'array', 'fields='=>'array'],
'MongoCollection::getDBRef' => ['array', 'ref'=>'array'],
'MongoCollection::getIndexInfo' => ['array'],
'MongoCollection::getName' => ['string'],
@@ -6600,7 +6604,7 @@
'MongoCollection::insert' => ['bool|array', 'a'=>'array', 'options='=>'array'],
'MongoCollection::parallelCollectionScan' => ['MongoCommandCursor[]', 'num_cursors'=>'int'],
'MongoCollection::remove' => ['bool|array', 'criteria='=>'array', 'options='=>'array'],
-'MongoCollection::save' => ['mixed', 'a'=>'array', 'options='=>'array'],
+'MongoCollection::save' => ['mixed', 'a'=>'array|object', 'options='=>'array'],
'MongoCollection::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'],
'MongoCollection::setSlaveOkay' => ['bool', 'ok='=>'bool'],
'MongoCollection::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'],
@@ -6624,7 +6628,7 @@
'MongoCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'],
'MongoCursor::awaitData' => ['MongoCursor', 'wait='=>'bool'],
'MongoCursor::batchSize' => ['MongoCursor', 'num'=>'int'],
-'MongoCursor::count' => ['int', 'foundonly='=>'bool'],
+'MongoCursor::count' => ['0|positive-int', 'foundonly='=>'bool'],
'MongoCursor::current' => ['array'],
'MongoCursor::dead' => ['bool'],
'MongoCursor::doQuery' => ['void'],
@@ -6662,7 +6666,7 @@
'MongoCursorException::getLine' => ['int'],
'MongoCursorException::getMessage' => ['string'],
'MongoCursorException::getPrevious' => ['Exception|Throwable'],
-'MongoCursorException::getTrace' => ['array'],
+'MongoCursorException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'MongoCursorException::getTraceAsString' => ['string'],
'MongoCursorInterface::__construct' => ['void'],
'MongoCursorInterface::batchSize' => ['MongoCursorInterface', 'batchSize'=>'int'],
@@ -6708,125 +6712,360 @@
'MongoDB::setReadPreference' => ['bool', 'read_preference'=>'string', 'tags='=>'array'],
'MongoDB::setSlaveOkay' => ['bool', 'ok='=>'bool'],
'MongoDB::setWriteConcern' => ['bool', 'w'=>'mixed', 'wtimeout='=>'int'],
-'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type'=>'int'],
+'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'],
+'MongoDB\BSON\fromPHP' => ['string', 'value'=>'object|array'],
+'MongoDB\BSON\toCanonicalExtendedJSON' => ['string', 'bson'=>'string'],
+'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'],
+'MongoDB\BSON\toPHP' => ['object|array', 'bson'=>'string', 'typemap='=>'?array'],
+'MongoDB\BSON\toRelaxedExtendedJSON' => ['string', 'bson'=>'string'],
+'MongoDB\Driver\Monitoring\addSubscriber' => ['void', 'subscriber'=>'MongoDB\Driver\Monitoring\Subscriber'],
+'MongoDB\Driver\Monitoring\removeSubscriber' => ['void', 'subscriber'=>'MongoDB\Driver\Monitoring\Subscriber'],
+'MongoDB\BSON\Binary::__construct' => ['void', 'data'=>'string', 'type='=>'int'],
'MongoDB\BSON\Binary::getData' => ['string'],
'MongoDB\BSON\Binary::getType' => ['int'],
-'MongoDB\BSON\Decimal128::__construct' => ['void', 'value='=>'string'],
+'MongoDB\BSON\Binary::__toString' => ['string'],
+'MongoDB\BSON\Binary::serialize' => ['string'],
+'MongoDB\BSON\Binary::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Binary::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\BinaryInterface::getData' => ['string'],
+'MongoDB\BSON\BinaryInterface::getType' => ['int'],
+'MongoDB\BSON\BinaryInterface::__toString' => ['string'],
+'MongoDB\BSON\DBPointer::__toString' => ['string'],
+'MongoDB\BSON\DBPointer::serialize' => ['string'],
+'MongoDB\BSON\DBPointer::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\DBPointer::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\Decimal128::__construct' => ['void', 'value'=>'string'],
'MongoDB\BSON\Decimal128::__toString' => ['string'],
-'MongoDB\BSON\fromJSON' => ['string', 'json'=>'string'],
-'MongoDB\BSON\fromPHP' => ['string', 'value'=>'array|object'],
-'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'array|object'],
-'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'string'],
+'MongoDB\BSON\Decimal128::serialize' => ['string'],
+'MongoDB\BSON\Decimal128::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Decimal128::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\Decimal128Interface::__toString' => ['string'],
+'MongoDB\BSON\Document::fromBSON' => ['MongoDB\BSON\Document', 'bson'=>'string'],
+'MongoDB\BSON\Document::fromJSON' => ['MongoDB\BSON\Document', 'json'=>'string'],
+'MongoDB\BSON\Document::fromPHP' => ['MongoDB\BSON\Document', 'value'=>'object|array'],
+'MongoDB\BSON\Document::get' => ['mixed', 'key'=>'string'],
+'MongoDB\BSON\Document::getIterator' => ['MongoDB\BSON\Iterator'],
+'MongoDB\BSON\Document::has' => ['bool', 'key'=>'string'],
+'MongoDB\BSON\Document::toPHP' => ['object|array', 'typeMap='=>'?array'],
+'MongoDB\BSON\Document::toCanonicalExtendedJSON' => ['string'],
+'MongoDB\BSON\Document::toRelaxedExtendedJSON' => ['string'],
+'MongoDB\BSON\Document::offsetExists' => ['bool', 'offset'=>'mixed'],
+'MongoDB\BSON\Document::offsetGet' => ['mixed', 'offset'=>'mixed'],
+'MongoDB\BSON\Document::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'],
+'MongoDB\BSON\Document::offsetUnset' => ['void', 'offset'=>'mixed'],
+'MongoDB\BSON\Document::__toString' => ['string'],
+'MongoDB\BSON\Document::serialize' => ['string'],
+'MongoDB\BSON\Document::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Int64::__construct' => ['void', 'value'=>'string|int'],
+'MongoDB\BSON\Int64::__toString' => ['string'],
+'MongoDB\BSON\Int64::serialize' => ['string'],
+'MongoDB\BSON\Int64::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Int64::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\Iterator::current' => ['mixed'],
+'MongoDB\BSON\Iterator::key' => ['string|int'],
+'MongoDB\BSON\Iterator::next' => ['void'],
+'MongoDB\BSON\Iterator::rewind' => ['void'],
+'MongoDB\BSON\Iterator::valid' => ['bool'],
+'MongoDB\BSON\Javascript::__construct' => ['void', 'code'=>'string', 'scope='=>'object|array|null'],
+'MongoDB\BSON\Javascript::getCode' => ['string'],
+'MongoDB\BSON\Javascript::getScope' => ['?object'],
+'MongoDB\BSON\Javascript::__toString' => ['string'],
+'MongoDB\BSON\Javascript::serialize' => ['string'],
+'MongoDB\BSON\Javascript::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Javascript::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\JavascriptInterface::getCode' => ['string'],
+'MongoDB\BSON\JavascriptInterface::getScope' => ['?object'],
+'MongoDB\BSON\JavascriptInterface::__toString' => ['string'],
+'MongoDB\BSON\MaxKey::serialize' => ['string'],
+'MongoDB\BSON\MaxKey::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\MaxKey::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\MinKey::serialize' => ['string'],
+'MongoDB\BSON\MinKey::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\MinKey::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\ObjectId::__construct' => ['void', 'id='=>'?string'],
+'MongoDB\BSON\ObjectId::getTimestamp' => ['int'],
'MongoDB\BSON\ObjectId::__toString' => ['string'],
+'MongoDB\BSON\ObjectId::serialize' => ['string'],
+'MongoDB\BSON\ObjectId::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\ObjectId::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\ObjectIdInterface::getTimestamp' => ['int'],
+'MongoDB\BSON\ObjectIdInterface::__toString' => ['string'],
+'MongoDB\BSON\PackedArray::fromPHP' => ['MongoDB\BSON\PackedArray', 'value'=>'array'],
+'MongoDB\BSON\PackedArray::get' => ['mixed', 'index'=>'int'],
+'MongoDB\BSON\PackedArray::getIterator' => ['MongoDB\BSON\Iterator'],
+'MongoDB\BSON\PackedArray::has' => ['bool', 'index'=>'int'],
+'MongoDB\BSON\PackedArray::toPHP' => ['object|array', 'typeMap='=>'?array'],
+'MongoDB\BSON\PackedArray::offsetExists' => ['bool', 'offset'=>'mixed'],
+'MongoDB\BSON\PackedArray::offsetGet' => ['mixed', 'offset'=>'mixed'],
+'MongoDB\BSON\PackedArray::offsetSet' => ['void', 'offset'=>'mixed', 'value'=>'mixed'],
+'MongoDB\BSON\PackedArray::offsetUnset' => ['void', 'offset'=>'mixed'],
+'MongoDB\BSON\PackedArray::__toString' => ['string'],
+'MongoDB\BSON\PackedArray::serialize' => ['string'],
+'MongoDB\BSON\PackedArray::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Persistable::bsonSerialize' => ['stdClass|MongoDB\BSON\Document|array'],
'MongoDB\BSON\Regex::__construct' => ['void', 'pattern'=>'string', 'flags='=>'string'],
-'MongoDB\BSON\Regex::__toString' => ['string'],
-'MongoDB\BSON\Regex::getFlags' => [''],
'MongoDB\BSON\Regex::getPattern' => ['string'],
-'MongoDB\BSON\Serializable::bsonSerialize' => ['array|object'],
-'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'int', 'timestamp'=>'int'],
+'MongoDB\BSON\Regex::getFlags' => ['string'],
+'MongoDB\BSON\Regex::__toString' => ['string'],
+'MongoDB\BSON\Regex::serialize' => ['string'],
+'MongoDB\BSON\Regex::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Regex::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\RegexInterface::getPattern' => ['string'],
+'MongoDB\BSON\RegexInterface::getFlags' => ['string'],
+'MongoDB\BSON\RegexInterface::__toString' => ['string'],
+'MongoDB\BSON\Serializable::bsonSerialize' => ['stdClass|MongoDB\BSON\Document|MongoDB\BSON\PackedArray|array'],
+'MongoDB\BSON\Symbol::__toString' => ['string'],
+'MongoDB\BSON\Symbol::serialize' => ['string'],
+'MongoDB\BSON\Symbol::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Symbol::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\Timestamp::__construct' => ['void', 'increment'=>'string|int', 'timestamp'=>'string|int'],
+'MongoDB\BSON\Timestamp::getTimestamp' => ['int'],
+'MongoDB\BSON\Timestamp::getIncrement' => ['int'],
'MongoDB\BSON\Timestamp::__toString' => ['string'],
-'MongoDB\BSON\toJSON' => ['string', 'bson'=>'string'],
-'MongoDB\BSON\toPHP' => ['object', 'bson'=>'string', 'typeMap'=>'array'],
-'MongoDB\BSON\Unserializable::bsonUnserialize' => ['', 'data'=>'array'],
-'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'int|DateTimeInterface'],
-'MongoDB\BSON\UTCDateTime::__toString' => ['string'],
+'MongoDB\BSON\Timestamp::serialize' => ['string'],
+'MongoDB\BSON\Timestamp::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Timestamp::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\TimestampInterface::getTimestamp' => ['int'],
+'MongoDB\BSON\TimestampInterface::getIncrement' => ['int'],
+'MongoDB\BSON\TimestampInterface::__toString' => ['string'],
+'MongoDB\BSON\UTCDateTime::__construct' => ['void', 'milliseconds='=>'DateTimeInterface|string|int|float|null'],
'MongoDB\BSON\UTCDateTime::toDateTime' => ['DateTime'],
-'MongoDB\Driver\BulkWrite::__construct' => ['void', 'ordered='=>'bool'],
+'MongoDB\BSON\UTCDateTime::__toString' => ['string'],
+'MongoDB\BSON\UTCDateTime::serialize' => ['string'],
+'MongoDB\BSON\UTCDateTime::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\UTCDateTime::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\UTCDateTimeInterface::toDateTime' => ['DateTime'],
+'MongoDB\BSON\UTCDateTimeInterface::__toString' => ['string'],
+'MongoDB\BSON\Undefined::__toString' => ['string'],
+'MongoDB\BSON\Undefined::serialize' => ['string'],
+'MongoDB\BSON\Undefined::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\BSON\Undefined::jsonSerialize' => ['mixed'],
+'MongoDB\BSON\Unserializable::bsonUnserialize' => ['void', 'data'=>'array'],
+'MongoDB\Driver\BulkWrite::__construct' => ['void', 'options='=>'?array'],
'MongoDB\Driver\BulkWrite::count' => ['int'],
-'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'array|object', 'deleteOptions='=>'array'],
-'MongoDB\Driver\BulkWrite::insert' => ['MongoDB\Driver\ObjectID', 'document'=>'array|object'],
-'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array'],
-'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'array|object'],
-'MongoDB\Driver\Cursor::__construct' => ['void', 'server'=>'Server', 'responseDocument'=>'string'],
+'MongoDB\Driver\BulkWrite::delete' => ['void', 'filter'=>'object|array', 'deleteOptions='=>'?array'],
+'MongoDB\Driver\BulkWrite::insert' => ['mixed', 'document'=>'object|array'],
+'MongoDB\Driver\BulkWrite::update' => ['void', 'filter'=>'object|array', 'newObj'=>'object|array', 'updateOptions='=>'?array'],
+'MongoDB\Driver\ClientEncryption::__construct' => ['void', 'options'=>'array'],
+'MongoDB\Driver\ClientEncryption::addKeyAltName' => ['?object', 'keyId'=>'MongoDB\BSON\Binary', 'keyAltName'=>'string'],
+'MongoDB\Driver\ClientEncryption::createDataKey' => ['MongoDB\BSON\Binary', 'kmsProvider'=>'string', 'options='=>'?array'],
+'MongoDB\Driver\ClientEncryption::decrypt' => ['mixed', 'value'=>'MongoDB\BSON\Binary'],
+'MongoDB\Driver\ClientEncryption::deleteKey' => ['object', 'keyId'=>'MongoDB\BSON\Binary'],
+'MongoDB\Driver\ClientEncryption::encrypt' => ['MongoDB\BSON\Binary', 'value'=>'mixed', 'options='=>'?array'],
+'MongoDB\Driver\ClientEncryption::encryptExpression' => ['object', 'expr'=>'object|array', 'options='=>'?array'],
+'MongoDB\Driver\ClientEncryption::getKey' => ['?object', 'keyId'=>'MongoDB\BSON\Binary'],
+'MongoDB\Driver\ClientEncryption::getKeyByAltName' => ['?object', 'keyAltName'=>'string'],
+'MongoDB\Driver\ClientEncryption::getKeys' => ['MongoDB\Driver\Cursor'],
+'MongoDB\Driver\ClientEncryption::removeKeyAltName' => ['?object', 'keyId'=>'MongoDB\BSON\Binary', 'keyAltName'=>'string'],
+'MongoDB\Driver\ClientEncryption::rewrapManyDataKey' => ['object', 'filter'=>'object|array', 'options='=>'?array'],
+'MongoDB\Driver\Command::__construct' => ['void', 'document'=>'object|array', 'commandOptions='=>'?array'],
+'MongoDB\Driver\Cursor::current' => ['object|array|null'],
'MongoDB\Driver\Cursor::getId' => ['MongoDB\Driver\CursorId'],
'MongoDB\Driver\Cursor::getServer' => ['MongoDB\Driver\Server'],
'MongoDB\Driver\Cursor::isDead' => ['bool'],
+'MongoDB\Driver\Cursor::key' => ['?int'],
+'MongoDB\Driver\Cursor::next' => ['void'],
+'MongoDB\Driver\Cursor::rewind' => ['void'],
'MongoDB\Driver\Cursor::setTypeMap' => ['void', 'typemap'=>'array'],
'MongoDB\Driver\Cursor::toArray' => ['array'],
-'MongoDB\Driver\CursorId::__construct' => ['void', 'id'=>'string'],
+'MongoDB\Driver\Cursor::valid' => ['bool'],
'MongoDB\Driver\CursorId::__toString' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::__clone' => ['void'],
-'MongoDB\Driver\Exception\RuntimeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?RuntimeException)|(?Throwable)'],
+'MongoDB\Driver\CursorId::serialize' => ['string'],
+'MongoDB\Driver\CursorId::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\Driver\CursorInterface::getId' => ['MongoDB\Driver\CursorId'],
+'MongoDB\Driver\CursorInterface::getServer' => ['MongoDB\Driver\Server'],
+'MongoDB\Driver\CursorInterface::isDead' => ['bool'],
+'MongoDB\Driver\CursorInterface::setTypeMap' => ['void', 'typemap'=>'array'],
+'MongoDB\Driver\CursorInterface::toArray' => ['array'],
+'MongoDB\Driver\Exception\AuthenticationException::__toString' => ['string'],
+'MongoDB\Driver\Exception\BulkWriteException::__toString' => ['string'],
+'MongoDB\Driver\Exception\CommandException::getResultDocument' => ['object'],
+'MongoDB\Driver\Exception\CommandException::__toString' => ['string'],
+'MongoDB\Driver\Exception\ConnectionException::__toString' => ['string'],
+'MongoDB\Driver\Exception\ConnectionTimeoutException::__toString' => ['string'],
+'MongoDB\Driver\Exception\EncryptionException::__toString' => ['string'],
+'MongoDB\Driver\Exception\Exception::__toString' => ['string'],
+'MongoDB\Driver\Exception\ExecutionTimeoutException::__toString' => ['string'],
+'MongoDB\Driver\Exception\InvalidArgumentException::__toString' => ['string'],
+'MongoDB\Driver\Exception\LogicException::__toString' => ['string'],
+'MongoDB\Driver\Exception\RuntimeException::hasErrorLabel' => ['bool', 'errorLabel'=>'string'],
'MongoDB\Driver\Exception\RuntimeException::__toString' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::__wakeup' => ['void'],
-'MongoDB\Driver\Exception\RuntimeException::getCode' => ['int'],
-'MongoDB\Driver\Exception\RuntimeException::getFile' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::getLine' => ['int'],
-'MongoDB\Driver\Exception\RuntimeException::getMessage' => ['string'],
-'MongoDB\Driver\Exception\RuntimeException::getPrevious' => ['RuntimeException|Throwable'],
-'MongoDB\Driver\Exception\RuntimeException::getTrace' => ['array'],
-'MongoDB\Driver\Exception\RuntimeException::getTraceAsString' => ['string'],
-'MongoDB\Driver\Exception\WriteException::__clone' => ['void'],
-'MongoDB\Driver\Exception\WriteException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?RuntimeException)|(?Throwable)'],
-'MongoDB\Driver\Exception\WriteException::__toString' => ['string'],
-'MongoDB\Driver\Exception\WriteException::__wakeup' => ['void'],
-'MongoDB\Driver\Exception\WriteException::getCode' => ['int'],
-'MongoDB\Driver\Exception\WriteException::getFile' => ['string'],
-'MongoDB\Driver\Exception\WriteException::getLine' => ['int'],
-'MongoDB\Driver\Exception\WriteException::getMessage' => ['string'],
-'MongoDB\Driver\Exception\WriteException::getPrevious' => ['RuntimeException|Throwable'],
-'MongoDB\Driver\Exception\WriteException::getTrace' => ['array'],
-'MongoDB\Driver\Exception\WriteException::getTraceAsString' => ['string'],
+'MongoDB\Driver\Exception\SSLConnectionException::__toString' => ['string'],
+'MongoDB\Driver\Exception\ServerException::__toString' => ['string'],
+'MongoDB\Driver\Exception\UnexpectedValueException::__toString' => ['string'],
'MongoDB\Driver\Exception\WriteException::getWriteResult' => ['MongoDB\Driver\WriteResult'],
-'MongoDB\Driver\Manager::__construct' => ['void', 'uri'=>'string', 'options='=>'array', 'driverOptions='=>'array'],
-'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'readPreference='=>'MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Manager::executeDelete' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'deleteOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::executeInsert' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'document'=>'array|object', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'readPreference='=>'MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Manager::executeUpdate' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'filter'=>'array|object', 'newObj'=>'array|object', 'updateOptions='=>'array', 'writeConcern='=>'MongoDB\Driver\WriteConcern'],
+'MongoDB\Driver\Exception\WriteException::__toString' => ['string'],
+'MongoDB\Driver\Manager::__construct' => ['void', 'uri='=>'?string', 'uriOptions='=>'?array', 'driverOptions='=>'?array'],
+'MongoDB\Driver\Manager::addSubscriber' => ['void', 'subscriber'=>'MongoDB\Driver\Monitoring\Subscriber'],
+'MongoDB\Driver\Manager::createClientEncryption' => ['MongoDB\Driver\ClientEncryption', 'options'=>'array'],
+'MongoDB\Driver\Manager::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulk'=>'MongoDB\Driver\BulkWrite', 'options='=>'MongoDB\Driver\WriteConcern|array|null'],
+'MongoDB\Driver\Manager::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'MongoDB\Driver\ReadPreference|array|null'],
+'MongoDB\Driver\Manager::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'options='=>'MongoDB\Driver\ReadPreference|array|null'],
+'MongoDB\Driver\Manager::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'?array'],
+'MongoDB\Driver\Manager::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'?array'],
+'MongoDB\Driver\Manager::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'?array'],
+'MongoDB\Driver\Manager::getEncryptedFieldsMap' => ['object|array|null'],
'MongoDB\Driver\Manager::getReadConcern' => ['MongoDB\Driver\ReadConcern'],
'MongoDB\Driver\Manager::getReadPreference' => ['MongoDB\Driver\ReadPreference'],
'MongoDB\Driver\Manager::getServers' => ['array'],
'MongoDB\Driver\Manager::getWriteConcern' => ['MongoDB\Driver\WriteConcern'],
-'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference'=>'MongoDB\Driver\ReadPreference'],
-'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'array|object', 'queryOptions='=>'array'],
-'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'string'],
-'MongoDB\Driver\ReadConcern::bsonSerialize' => ['object'],
-'MongoDB\Driver\ReadConcern::getLevel' => ['null|string'],
-'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'array', 'options='=>'array'],
-'MongoDB\Driver\ReadPreference::bsonSerialize' => ['object'],
+'MongoDB\Driver\Manager::removeSubscriber' => ['void', 'subscriber'=>'MongoDB\Driver\Monitoring\Subscriber'],
+'MongoDB\Driver\Manager::selectServer' => ['MongoDB\Driver\Server', 'readPreference='=>'?MongoDB\Driver\ReadPreference'],
+'MongoDB\Driver\Manager::startSession' => ['MongoDB\Driver\Session', 'options='=>'?array'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getCommandName' => ['string'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getDurationMicros' => ['int'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getError' => ['Exception'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getOperationId' => ['string'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getReply' => ['object'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getRequestId' => ['string'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getServer' => ['MongoDB\Driver\Server'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getServiceId' => ['?MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\CommandFailedEvent::getServerConnectionId' => ['?int'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getCommand' => ['object'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getCommandName' => ['string'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getDatabaseName' => ['string'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getOperationId' => ['string'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getRequestId' => ['string'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getServer' => ['MongoDB\Driver\Server'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getServiceId' => ['?MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\CommandStartedEvent::getServerConnectionId' => ['?int'],
+'MongoDB\Driver\Monitoring\CommandSubscriber::commandStarted' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandStartedEvent'],
+'MongoDB\Driver\Monitoring\CommandSubscriber::commandSucceeded' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandSucceededEvent'],
+'MongoDB\Driver\Monitoring\CommandSubscriber::commandFailed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\CommandFailedEvent'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getCommandName' => ['string'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getDurationMicros' => ['int'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getOperationId' => ['string'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getReply' => ['object'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getRequestId' => ['string'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getServer' => ['MongoDB\Driver\Server'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getServiceId' => ['?MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\CommandSucceededEvent::getServerConnectionId' => ['?int'],
+'MongoDB\Driver\Monitoring\LogSubscriber::log' => ['void', 'level'=>'int', 'domain'=>'string', 'message'=>'string'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::serverChanged' => ['void', 'event'=>'MongoDB\Driver\Monitoring\ServerChangedEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::serverClosed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\ServerClosedEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::serverOpening' => ['void', 'event'=>'MongoDB\Driver\Monitoring\ServerOpeningEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatFailed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatStarted' => ['void', 'event'=>'MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::serverHeartbeatSucceeded' => ['void', 'event'=>'MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::topologyChanged' => ['void', 'event'=>'MongoDB\Driver\Monitoring\TopologyChangedEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::topologyClosed' => ['void', 'event'=>'MongoDB\Driver\Monitoring\TopologyClosedEvent'],
+'MongoDB\Driver\Monitoring\SDAMSubscriber::topologyOpening' => ['void', 'event'=>'MongoDB\Driver\Monitoring\TopologyOpeningEvent'],
+'MongoDB\Driver\Monitoring\ServerChangedEvent::getPort' => ['int'],
+'MongoDB\Driver\Monitoring\ServerChangedEvent::getHost' => ['string'],
+'MongoDB\Driver\Monitoring\ServerChangedEvent::getNewDescription' => ['MongoDB\Driver\ServerDescription'],
+'MongoDB\Driver\Monitoring\ServerChangedEvent::getPreviousDescription' => ['MongoDB\Driver\ServerDescription'],
+'MongoDB\Driver\Monitoring\ServerChangedEvent::getTopologyId' => ['MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\ServerClosedEvent::getPort' => ['int'],
+'MongoDB\Driver\Monitoring\ServerClosedEvent::getHost' => ['string'],
+'MongoDB\Driver\Monitoring\ServerClosedEvent::getTopologyId' => ['MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getDurationMicros' => ['int'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getError' => ['Exception'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getPort' => ['int'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::getHost' => ['string'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent::isAwaited' => ['bool'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getPort' => ['int'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::getHost' => ['string'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent::isAwaited' => ['bool'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getDurationMicros' => ['int'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getReply' => ['object'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getPort' => ['int'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::getHost' => ['string'],
+'MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent::isAwaited' => ['bool'],
+'MongoDB\Driver\Monitoring\ServerOpeningEvent::getPort' => ['int'],
+'MongoDB\Driver\Monitoring\ServerOpeningEvent::getHost' => ['string'],
+'MongoDB\Driver\Monitoring\ServerOpeningEvent::getTopologyId' => ['MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\TopologyChangedEvent::getNewDescription' => ['MongoDB\Driver\TopologyDescription'],
+'MongoDB\Driver\Monitoring\TopologyChangedEvent::getPreviousDescription' => ['MongoDB\Driver\TopologyDescription'],
+'MongoDB\Driver\Monitoring\TopologyChangedEvent::getTopologyId' => ['MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\TopologyClosedEvent::getTopologyId' => ['MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Monitoring\TopologyOpeningEvent::getTopologyId' => ['MongoDB\BSON\ObjectId'],
+'MongoDB\Driver\Query::__construct' => ['void', 'filter'=>'object|array', 'queryOptions='=>'?array'],
+'MongoDB\Driver\ReadConcern::__construct' => ['void', 'level='=>'?string'],
+'MongoDB\Driver\ReadConcern::getLevel' => ['?string'],
+'MongoDB\Driver\ReadConcern::isDefault' => ['bool'],
+'MongoDB\Driver\ReadConcern::bsonSerialize' => ['stdClass'],
+'MongoDB\Driver\ReadConcern::serialize' => ['string'],
+'MongoDB\Driver\ReadConcern::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\Driver\ReadPreference::__construct' => ['void', 'mode'=>'string|int', 'tagSets='=>'?array', 'options='=>'?array'],
+'MongoDB\Driver\ReadPreference::getHedge' => ['?object'],
+'MongoDB\Driver\ReadPreference::getMaxStalenessSeconds' => ['int'],
'MongoDB\Driver\ReadPreference::getMode' => ['int'],
+'MongoDB\Driver\ReadPreference::getModeString' => ['string'],
'MongoDB\Driver\ReadPreference::getTagSets' => ['array'],
-'MongoDB\Driver\Server::__construct' => ['void', 'host'=>'string', 'port'=>'string', 'options='=>'array', 'driverOptions='=>'array'],
-'MongoDB\Driver\Server::executeBulkWrite' => ['', 'namespace'=>'string', 'zwrite'=>'BulkWrite'],
-'MongoDB\Driver\Server::executeCommand' => ['', 'db'=>'string', 'command'=>'Command'],
-'MongoDB\Driver\Server::executeQuery' => ['', 'namespace'=>'string', 'zquery'=>'Query'],
-'MongoDB\Driver\Server::getHost' => [''],
-'MongoDB\Driver\Server::getInfo' => [''],
-'MongoDB\Driver\Server::getLatency' => [''],
-'MongoDB\Driver\Server::getPort' => [''],
-'MongoDB\Driver\Server::getState' => [''],
+'MongoDB\Driver\ReadPreference::bsonSerialize' => ['stdClass'],
+'MongoDB\Driver\ReadPreference::serialize' => ['string'],
+'MongoDB\Driver\ReadPreference::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\Driver\Server::executeBulkWrite' => ['MongoDB\Driver\WriteResult', 'namespace'=>'string', 'bulkWrite'=>'MongoDB\Driver\BulkWrite', 'options='=>'MongoDB\Driver\WriteConcern|array|null'],
+'MongoDB\Driver\Server::executeCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'MongoDB\Driver\ReadPreference|array|null'],
+'MongoDB\Driver\Server::executeQuery' => ['MongoDB\Driver\Cursor', 'namespace'=>'string', 'query'=>'MongoDB\Driver\Query', 'options='=>'MongoDB\Driver\ReadPreference|array|null'],
+'MongoDB\Driver\Server::executeReadCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'?array'],
+'MongoDB\Driver\Server::executeReadWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'?array'],
+'MongoDB\Driver\Server::executeWriteCommand' => ['MongoDB\Driver\Cursor', 'db'=>'string', 'command'=>'MongoDB\Driver\Command', 'options='=>'?array'],
+'MongoDB\Driver\Server::getHost' => ['string'],
+'MongoDB\Driver\Server::getInfo' => ['array'],
+'MongoDB\Driver\Server::getLatency' => ['?int'],
+'MongoDB\Driver\Server::getPort' => ['int'],
+'MongoDB\Driver\Server::getServerDescription' => ['MongoDB\Driver\ServerDescription'],
'MongoDB\Driver\Server::getTags' => ['array'],
-'MongoDB\Driver\Server::getType' => [''],
+'MongoDB\Driver\Server::getType' => ['int'],
'MongoDB\Driver\Server::isArbiter' => ['bool'],
-'MongoDB\Driver\Server::isDelayed' => [''],
'MongoDB\Driver\Server::isHidden' => ['bool'],
-'MongoDB\Driver\Server::isPassive' => [''],
+'MongoDB\Driver\Server::isPassive' => ['bool'],
'MongoDB\Driver\Server::isPrimary' => ['bool'],
'MongoDB\Driver\Server::isSecondary' => ['bool'],
-'MongoDB\Driver\WriteConcern::__construct' => ['void', 'w'=>'string|int', 'wtimeout='=>'int', 'journal='=>'bool', 'fsync='=>'bool'],
-'MongoDB\Driver\WriteConcern::getJurnal' => ['bool|null'],
-'MongoDB\Driver\WriteConcern::getW' => ['int|null|string'],
+'MongoDB\Driver\ServerApi::__construct' => ['void', 'version'=>'string', 'strict='=>'?bool', 'deprecationErrors='=>'?bool'],
+'MongoDB\Driver\ServerApi::bsonSerialize' => ['stdClass'],
+'MongoDB\Driver\ServerApi::serialize' => ['string'],
+'MongoDB\Driver\ServerApi::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\Driver\ServerDescription::getHelloResponse' => ['array'],
+'MongoDB\Driver\ServerDescription::getHost' => ['string'],
+'MongoDB\Driver\ServerDescription::getLastUpdateTime' => ['int'],
+'MongoDB\Driver\ServerDescription::getPort' => ['int'],
+'MongoDB\Driver\ServerDescription::getRoundTripTime' => ['?int'],
+'MongoDB\Driver\ServerDescription::getType' => ['string'],
+'MongoDB\Driver\Session::abortTransaction' => ['void'],
+'MongoDB\Driver\Session::advanceClusterTime' => ['void', 'clusterTime'=>'object|array'],
+'MongoDB\Driver\Session::advanceOperationTime' => ['void', 'operationTime'=>'MongoDB\BSON\TimestampInterface'],
+'MongoDB\Driver\Session::commitTransaction' => ['void'],
+'MongoDB\Driver\Session::endSession' => ['void'],
+'MongoDB\Driver\Session::getClusterTime' => ['?object'],
+'MongoDB\Driver\Session::getLogicalSessionId' => ['object'],
+'MongoDB\Driver\Session::getOperationTime' => ['?MongoDB\BSON\Timestamp'],
+'MongoDB\Driver\Session::getServer' => ['?MongoDB\Driver\Server'],
+'MongoDB\Driver\Session::getTransactionOptions' => ['?array'],
+'MongoDB\Driver\Session::getTransactionState' => ['string'],
+'MongoDB\Driver\Session::isDirty' => ['bool'],
+'MongoDB\Driver\Session::isInTransaction' => ['bool'],
+'MongoDB\Driver\Session::startTransaction' => ['void', 'options='=>'?array'],
+'MongoDB\Driver\TopologyDescription::getServers' => ['array'],
+'MongoDB\Driver\TopologyDescription::getType' => ['string'],
+'MongoDB\Driver\TopologyDescription::hasReadableServer' => ['bool', 'readPreference='=>'?MongoDB\Driver\ReadPreference'],
+'MongoDB\Driver\TopologyDescription::hasWritableServer' => ['bool'],
+'MongoDB\Driver\WriteConcern::__construct' => ['void', 'w'=>'string|int', 'wtimeout='=>'?int', 'journal='=>'?bool'],
+'MongoDB\Driver\WriteConcern::getJournal' => ['?bool'],
+'MongoDB\Driver\WriteConcern::getW' => ['string|int|null'],
'MongoDB\Driver\WriteConcern::getWtimeout' => ['int'],
-'MongoDB\Driver\WriteConcernError::getCode' => [''],
-'MongoDB\Driver\WriteConcernError::getInfo' => [''],
-'MongoDB\Driver\WriteConcernError::getMessage' => [''],
-'MongoDB\Driver\WriteError::getCode' => [''],
-'MongoDB\Driver\WriteError::getIndex' => [''],
-'MongoDB\Driver\WriteError::getInfo' => ['mixed'],
-'MongoDB\Driver\WriteError::getMessage' => [''],
-'MongoDB\Driver\WriteException::getWriteResult' => [''],
-'MongoDB\Driver\WriteResult::getDeletedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getInfo' => [''],
-'MongoDB\Driver\WriteResult::getInsertedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getMatchedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getModifiedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getServer' => [''],
-'MongoDB\Driver\WriteResult::getUpsertedCount' => ['int'],
-'MongoDB\Driver\WriteResult::getUpsertedIds' => [''],
-'MongoDB\Driver\WriteResult::getWriteConcernError' => [''],
-'MongoDB\Driver\WriteResult::getWriteErrors' => [''],
+'MongoDB\Driver\WriteConcern::isDefault' => ['bool'],
+'MongoDB\Driver\WriteConcern::bsonSerialize' => ['stdClass'],
+'MongoDB\Driver\WriteConcern::serialize' => ['string'],
+'MongoDB\Driver\WriteConcern::unserialize' => ['void', 'data'=>'string'],
+'MongoDB\Driver\WriteConcernError::getCode' => ['int'],
+'MongoDB\Driver\WriteConcernError::getInfo' => ['?object'],
+'MongoDB\Driver\WriteConcernError::getMessage' => ['string'],
+'MongoDB\Driver\WriteError::getCode' => ['int'],
+'MongoDB\Driver\WriteError::getIndex' => ['int'],
+'MongoDB\Driver\WriteError::getInfo' => ['?object'],
+'MongoDB\Driver\WriteError::getMessage' => ['string'],
+'MongoDB\Driver\WriteResult::getInsertedCount' => ['?int'],
+'MongoDB\Driver\WriteResult::getMatchedCount' => ['?int'],
+'MongoDB\Driver\WriteResult::getModifiedCount' => ['?int'],
+'MongoDB\Driver\WriteResult::getDeletedCount' => ['?int'],
+'MongoDB\Driver\WriteResult::getUpsertedCount' => ['?int'],
+'MongoDB\Driver\WriteResult::getServer' => ['MongoDB\Driver\Server'],
+'MongoDB\Driver\WriteResult::getUpsertedIds' => ['array'],
+'MongoDB\Driver\WriteResult::getWriteConcernError' => ['?MongoDB\Driver\WriteConcernError'],
+'MongoDB\Driver\WriteResult::getWriteErrors' => ['array'],
+'MongoDB\Driver\WriteResult::getErrorReplies' => ['array'],
'MongoDB\Driver\WriteResult::isAcknowledged' => ['bool'],
'MongoDBRef::create' => ['array', 'collection'=>'string', 'id'=>'mixed', 'database='=>'string'],
'MongoDBRef::get' => ['array', 'db'=>'mongodb', 'ref'=>'array'],
@@ -6841,7 +7080,7 @@
'MongoException::getLine' => ['int'],
'MongoException::getMessage' => ['string'],
'MongoException::getPrevious' => ['Exception|Throwable'],
-'MongoException::getTrace' => ['array'],
+'MongoException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'MongoException::getTraceAsString' => ['string'],
'MongoGridFS::__construct' => ['void', 'db'=>'MongoDB', 'prefix='=>'string', 'chunks='=>'mixed'],
'MongoGridFS::__get' => ['MongoCollection', 'name'=>'string'],
@@ -6849,7 +7088,7 @@
'MongoGridFS::aggregate' => ['array', 'pipeline'=>'array', 'op'=>'array', 'pipelineOperators'=>'array'],
'MongoGridFS::aggregateCursor' => ['MongoCommandCursor', 'pipeline'=>'array', 'options'=>'array'],
'MongoGridFS::batchInsert' => ['mixed', 'a'=>'array', 'options='=>'array'],
-'MongoGridFS::count' => ['int', 'query='=>'stdClass|array'],
+'MongoGridFS::count' => ['0|positive-int', 'query='=>'stdClass|array'],
'MongoGridFS::createDBRef' => ['array', 'a'=>'array'],
'MongoGridFS::createIndex' => ['array', 'keys'=>'array', 'options='=>'array'],
'MongoGridFS::delete' => ['bool', 'id'=>'mixed'],
@@ -6884,7 +7123,7 @@
'MongoGridFSCursor::addOption' => ['MongoCursor', 'key'=>'string', 'value'=>'mixed'],
'MongoGridFSCursor::awaitData' => ['MongoCursor', 'wait='=>'bool|true'],
'MongoGridFSCursor::batchSize' => ['MongoCursor', 'batchSize'=>'int'],
-'MongoGridFSCursor::count' => ['int', 'all='=>'bool|false'],
+'MongoGridFSCursor::count' => ['0|positive-int', 'all='=>'bool|false'],
'MongoGridFSCursor::current' => ['MongoGridFSFile'],
'MongoGridFSCursor::dead' => ['bool'],
'MongoGridFSCursor::doQuery' => ['void'],
@@ -6934,7 +7173,7 @@
'MongoLog::getCallback' => ['callable'],
'MongoLog::getLevel' => ['int'],
'MongoLog::getModule' => ['int'],
-'MongoLog::setCallback' => ['void', 'log_function'=>'callable'],
+'MongoLog::setCallback' => ['bool', 'log_function'=>'callable'],
'MongoLog::setLevel' => ['void', 'level'=>'int'],
'MongoLog::setModule' => ['void', 'module'=>'int'],
'MongoPool::getSize' => ['int'],
@@ -6952,7 +7191,7 @@
'MongoResultException::getLine' => ['int'],
'MongoResultException::getMessage' => ['string'],
'MongoResultException::getPrevious' => ['Exception|Throwable'],
-'MongoResultException::getTrace' => ['array'],
+'MongoResultException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'MongoResultException::getTraceAsString' => ['string'],
'MongoTimestamp::__construct' => ['void', 'sec='=>'int', 'inc='=>'int'],
'MongoTimestamp::__toString' => ['string'],
@@ -6972,7 +7211,7 @@
'MongoWriteConcernException::getLine' => ['int'],
'MongoWriteConcernException::getMessage' => ['string'],
'MongoWriteConcernException::getPrevious' => ['Exception|Throwable'],
-'MongoWriteConcernException::getTrace' => ['array'],
+'MongoWriteConcernException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'MongoWriteConcernException::getTraceAsString' => ['string'],
'monitor_custom_event' => ['void', 'class'=>'string', 'text'=>'string', 'severe='=>'int', 'user_data='=>'mixed'],
'monitor_httperror_event' => ['void', 'error_code'=>'int', 'url'=>'string', 'severe='=>'int'],
@@ -7027,22 +7266,22 @@
'msession_timeout' => ['int', 'session'=>'string', 'param='=>'int'],
'msession_uniq' => ['string', 'param'=>'int', 'classname='=>'string', 'data='=>'string'],
'msession_unlock' => ['int', 'session'=>'string', 'key'=>'int'],
-'msg_get_queue' => ['resource', 'key'=>'int', 'perms='=>'int'],
+'msg_get_queue' => ['resource|false', 'key'=>'int', 'perms='=>'int'],
'msg_queue_exists' => ['bool', 'key'=>'int'],
'msg_receive' => ['bool', 'queue'=>'resource', 'desiredmsgtype'=>'int', '&w_msgtype'=>'int', 'maxsize'=>'int', '&w_message'=>'mixed', 'unserialize='=>'bool', 'flags='=>'int', '&w_errorcode='=>'int'],
'msg_remove_queue' => ['bool', 'queue'=>'resource'],
'msg_send' => ['bool', 'queue'=>'resource', 'msgtype'=>'int', 'message'=>'mixed', 'serialize='=>'bool', 'blocking='=>'bool', '&w_errorcode='=>'int'],
'msg_set_queue' => ['bool', 'queue'=>'resource', 'data'=>'array'],
-'msg_stat_queue' => ['array', 'queue'=>'resource'],
+'msg_stat_queue' => ['array|false', 'queue'=>'resource'],
'msgfmt_create' => ['MessageFormatter', 'locale'=>'string', 'pattern'=>'string'],
-'msgfmt_format' => ['string', 'fmt'=>'messageformatter', 'args'=>'array'],
-'msgfmt_format_message' => ['string', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'],
+'msgfmt_format' => ['string|false', 'fmt'=>'messageformatter', 'args'=>'array'],
+'msgfmt_format_message' => ['string|false', 'locale'=>'string', 'pattern'=>'string', 'args'=>'array'],
'msgfmt_get_error_code' => ['int', 'fmt'=>'messageformatter'],
'msgfmt_get_error_message' => ['string', 'fmt'=>'messageformatter'],
'msgfmt_get_locale' => ['string', 'formatter'=>'messageformatter'],
-'msgfmt_get_pattern' => ['string', 'fmt'=>'messageformatter'],
-'msgfmt_parse' => ['array', 'fmt'=>'messageformatter', 'value'=>'string'],
-'msgfmt_parse_message' => ['array', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'],
+'msgfmt_get_pattern' => ['string|false', 'fmt'=>'messageformatter'],
+'msgfmt_parse' => ['array|false', 'fmt'=>'messageformatter', 'value'=>'string'],
+'msgfmt_parse_message' => ['array|false', 'locale'=>'string', 'pattern'=>'string', 'source'=>'string'],
'msgfmt_set_pattern' => ['bool', 'fmt'=>'messageformatter', 'pattern'=>'string'],
'msql_affected_rows' => ['int', 'result'=>'resource'],
'msql_close' => ['bool', 'link_identifier='=>'?resource'],
@@ -7107,11 +7346,11 @@
'mt_rand\'1' => ['int'],
'mt_srand' => ['void', 'seed='=>'int', 'mode='=>'int'],
'MultipleIterator::__construct' => ['void', 'flags='=>'int'],
-'MultipleIterator::attachIterator' => ['void', 'iterator'=>'iterator', 'infos='=>'string'],
-'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'iterator'],
+'MultipleIterator::attachIterator' => ['void', 'iterator'=>'Iterator', 'infos='=>'string'],
+'MultipleIterator::containsIterator' => ['bool', 'iterator'=>'Iterator'],
'MultipleIterator::countIterators' => ['int'],
'MultipleIterator::current' => ['array'],
-'MultipleIterator::detachIterator' => ['void', 'iterator'=>'iterator'],
+'MultipleIterator::detachIterator' => ['void', 'iterator'=>'Iterator'],
'MultipleIterator::getFlags' => ['int'],
'MultipleIterator::key' => ['array'],
'MultipleIterator::next' => ['void'],
@@ -7179,7 +7418,7 @@
'mysqli::get_charset' => ['object'],
'mysqli::get_client_info' => ['string'],
'mysqli::get_connection_stats' => ['array|false'],
-'mysqli::get_warnings' => ['mysqli_warning'],
+'mysqli::get_warnings' => ['mysqli_warning|false'],
'mysqli::init' => ['mysqli'],
'mysqli::kill' => ['bool', 'processid'=>'int'],
'mysqli::more_results' => ['bool'],
@@ -7190,7 +7429,7 @@
'mysqli::poll' => ['int|false', '&w_read'=>'array', '&w_error'=>'array', '&w_reject'=>'array', 'sec'=>'int', 'usec='=>'int'],
'mysqli::prepare' => ['mysqli_stmt|false', 'query'=>'string'],
'mysqli::query' => ['bool|mysqli_result', 'query'=>'string', 'resultmode='=>'int'],
-'mysqli::real_connect' => ['bool', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string', 'flags='=>'int'],
+'mysqli::real_connect' => ['bool', 'host='=>'?string', 'username='=>'?string', 'passwd='=>'?string', 'dbname='=>'?string', 'port='=>'?int', 'socket='=>'?string', 'flags='=>'int'],
'mysqli::real_escape_string' => ['string', 'escapestr'=>'string'],
'mysqli::real_query' => ['bool', 'query'=>'string'],
'mysqli::reap_async_query' => ['mysqli_result|false'],
@@ -7210,16 +7449,16 @@
'mysqli::store_result' => ['mysqli_result|false', 'option='=>'int'],
'mysqli::thread_safe' => ['bool'],
'mysqli::use_result' => ['mysqli_result|false'],
-'mysqli_affected_rows' => ['int', 'link'=>'mysqli'],
+'mysqli_affected_rows' => ['int<-1,max>|numeric-string', 'link'=>'mysqli'],
'mysqli_autocommit' => ['bool', 'link'=>'mysqli', 'mode'=>'bool'],
-'mysqli_begin_transaction' => ['bool', 'link'=>'mysqli', 'flags'=>'int', 'name'=>'string'],
+'mysqli_begin_transaction' => ['bool', 'link'=>'mysqli', 'flags='=>'int', 'name='=>'string'],
'mysqli_change_user' => ['bool', 'link'=>'mysqli', 'user'=>'string', 'password'=>'string', 'database'=>'string'],
'mysqli_character_set_name' => ['string', 'link'=>'mysqli'],
'mysqli_close' => ['bool', 'link'=>'mysqli'],
'mysqli_commit' => ['bool', 'link'=>'mysqli', 'flags='=>'int', 'name='=>'string'],
-'mysqli_connect' => ['mysqli|false', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'],
+'mysqli_connect' => ['mysqli|false|null', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string'],
'mysqli_connect_errno' => ['int'],
-'mysqli_connect_error' => ['string'],
+'mysqli_connect_error' => ['string|null'],
'mysqli_data_seek' => ['bool', 'result'=>'mysqli_result', 'offset'=>'int'],
'mysqli_debug' => ['bool', 'message'=>'string'],
'mysqli_disable_reads_from_master' => ['bool', 'link'=>'mysqli'],
@@ -7232,16 +7471,17 @@
'mysqli_enable_reads_from_master' => ['bool', 'link'=>'mysqli'],
'mysqli_enable_rpl_parse' => ['bool', 'link'=>'mysqli'],
'mysqli_errno' => ['int', 'link'=>'mysqli'],
-'mysqli_error' => ['string', 'link'=>'mysqli'],
+'mysqli_error' => ['string|null', 'link'=>'mysqli'],
'mysqli_error_list' => ['array', 'connection'=>'mysqli'],
-'mysqli_fetch_all' => ['array', 'result'=>'mysqli_result', 'resulttype='=>'int'],
-'mysqli_fetch_array' => ['array|null', 'result'=>'mysqli_result', 'resulttype='=>'int'],
-'mysqli_fetch_assoc' => ['array|null', 'result'=>'mysqli_result'],
-'mysqli_fetch_field' => ['object|false', 'result'=>'mysqli_result'],
-'mysqli_fetch_field_direct' => ['object|false', 'result'=>'mysqli_result', 'fieldnr'=>'int'],
-'mysqli_fetch_fields' => ['array|false', 'result'=>'mysqli_result'],
+'mysqli_fetch_all' => ['list', 'result'=>'mysqli_result', 'resulttype='=>'int'],
+'mysqli_fetch_array' => ['array|null|false', 'result'=>'mysqli_result', 'resulttype='=>'int'],
+'mysqli_fetch_assoc' => ['array|null|false', 'result'=>'mysqli_result'],
+'mysqli_fetch_column' => ['null|int|float|string|false', 'result' => 'mysqli_result', 'column'=>'int'],
+'mysqli_fetch_field' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false', 'result'=>'mysqli_result'],
+'mysqli_fetch_field_direct' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false', 'result'=>'mysqli_result', 'fieldnr'=>'int'],
+'mysqli_fetch_fields' => ['list', 'result'=>'mysqli_result'],
'mysqli_fetch_lengths' => ['array|false', 'result'=>'mysqli_result'],
-'mysqli_fetch_object' => ['object|null', 'result'=>'mysqli_result', 'class_name='=>'string', 'params='=>'?array'],
+'mysqli_fetch_object' => ['object|false|null', 'result'=>'mysqli_result', 'class_name='=>'string', 'params='=>'?array'],
'mysqli_fetch_row' => ['array|null', 'result'=>'mysqli_result'],
'mysqli_field_count' => ['int', 'link'=>'mysqli'],
'mysqli_field_seek' => ['bool', 'result'=>'mysqli_result', 'fieldnr'=>'int'],
@@ -7249,18 +7489,18 @@
'mysqli_free_result' => ['void', 'link'=>'mysqli_result'],
'mysqli_get_cache_stats' => ['array'],
'mysqli_get_charset' => ['object', 'link'=>'mysqli'],
-'mysqli_get_client_info' => ['string', 'link'=>'mysqli'],
+'mysqli_get_client_info' => ['string', 'link='=>'mysqli'],
'mysqli_get_client_stats' => ['array|false'],
-'mysqli_get_client_version' => ['int', 'link'=>'mysqli'],
+'mysqli_get_client_version' => ['int'],
'mysqli_get_connection_stats' => ['array|false', 'link'=>'mysqli'],
'mysqli_get_host_info' => ['string', 'link'=>'mysqli'],
'mysqli_get_links_stats' => ['array'],
'mysqli_get_proto_info' => ['int', 'link'=>'mysqli'],
'mysqli_get_server_info' => ['string', 'link'=>'mysqli'],
'mysqli_get_server_version' => ['int', 'link'=>'mysqli'],
-'mysqli_get_warnings' => ['mysqli_warning', 'link'=>'mysqli'],
+'mysqli_get_warnings' => ['mysqli_warning|false', 'link'=>'mysqli'],
'mysqli_info' => ['?string', 'link'=>'mysqli'],
-'mysqli_init' => ['mysqli'],
+'mysqli_init' => ['mysqli|false'],
'mysqli_insert_id' => ['int|string', 'link'=>'mysqli'],
'mysqli_kill' => ['bool', 'link'=>'mysqli', 'processid'=>'int'],
'mysqli_link_construct' => ['object'],
@@ -7269,13 +7509,13 @@
'mysqli_multi_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'],
'mysqli_next_result' => ['bool', 'link'=>'mysqli'],
'mysqli_num_fields' => ['int', 'link'=>'mysqli_result'],
-'mysqli_num_rows' => ['int', 'link'=>'mysqli_result'],
+'mysqli_num_rows' => ['int<0,max>|numeric-string', 'link'=>'mysqli_result'],
'mysqli_options' => ['bool', 'link'=>'mysqli', 'option'=>'int', 'value'=>'mixed'],
'mysqli_ping' => ['bool', 'link'=>'mysqli'],
'mysqli_poll' => ['int|false', 'read'=>'array', 'error'=>'array', 'reject'=>'array', 'sec'=>'int', 'usec='=>'int'],
'mysqli_prepare' => ['mysqli_stmt|false', 'link'=>'mysqli', 'query'=>'string'],
'mysqli_query' => ['mysqli_result|bool', 'link'=>'mysqli', 'query'=>'string', 'resultmode='=>'int'],
-'mysqli_real_connect' => ['bool', 'link='=>'mysqli', 'host='=>'string', 'username='=>'string', 'passwd='=>'string', 'dbname='=>'string', 'port='=>'int', 'socket='=>'string', 'flags='=>'int'],
+'mysqli_real_connect' => ['bool', 'link='=>'mysqli', 'host='=>'?string', 'username='=>'?string', 'passwd='=>'?string', 'dbname='=>'?string', 'port='=>'?int', 'socket='=>'?string', 'flags='=>'int'],
'mysqli_real_escape_string' => ['string', 'link'=>'mysqli', 'escapestr'=>'string'],
'mysqli_real_query' => ['bool', 'link'=>'mysqli', 'query'=>'string'],
'mysqli_reap_async_query' => ['mysqli_result|false', 'link'=>'mysqli'],
@@ -7285,12 +7525,13 @@
'mysqli_result::__construct' => ['void', 'link'=>'mysqli', 'resultmode='=>'int'],
'mysqli_result::close' => ['void'],
'mysqli_result::data_seek' => ['bool', 'offset'=>'int'],
-'mysqli_result::fetch_all' => ['array', 'resulttype='=>'int'],
-'mysqli_result::fetch_array' => ['array|null', 'resulttype='=>'int'],
-'mysqli_result::fetch_assoc' => ['array|null'],
-'mysqli_result::fetch_field' => ['object|false'],
-'mysqli_result::fetch_field_direct' => ['object|false', 'fieldnr'=>'int'],
-'mysqli_result::fetch_fields' => ['array|false'],
+'mysqli_result::fetch_all' => ['list', 'resulttype='=>'int'],
+'mysqli_result::fetch_array' => ['array|null|false', 'resulttype='=>'int'],
+'mysqli_result::fetch_assoc' => ['array|null|false'],
+'mysqli_result::fetch_column' => ['null|int|float|string|false', 'column'=>'int'],
+'mysqli_result::fetch_field' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false'],
+'mysqli_result::fetch_field_direct' => ['(stdClass&object{name: string, orgname: string, table: string, orgtable: string, def: string, db: string, catalog: "def", max_length: int, length: int, charsetnr: string, flags: int, type: int, decimals: int})|false', 'fieldnr'=>'int'],
+'mysqli_result::fetch_fields' => ['list'],
'mysqli_result::fetch_object' => ['object|null', 'class_name='=>'string', 'params='=>'array'],
'mysqli_result::fetch_row' => ['array|null'],
'mysqli_result::field_seek' => ['bool', 'fieldnr'=>'int'],
@@ -7319,19 +7560,19 @@
'mysqli_stmt::close' => ['bool'],
'mysqli_stmt::data_seek' => ['void', 'offset'=>'int'],
'mysqli_stmt::execute' => ['bool'],
-'mysqli_stmt::fetch' => ['bool'],
+'mysqli_stmt::fetch' => ['bool|null'],
'mysqli_stmt::free_result' => ['void'],
'mysqli_stmt::get_result' => ['mysqli_result|false'],
-'mysqli_stmt::get_warnings' => ['object'],
+'mysqli_stmt::get_warnings' => ['mysqli_warning|false'],
'mysqli_stmt::more_results' => ['bool'],
'mysqli_stmt::next_result' => ['bool'],
-'mysqli_stmt::num_rows' => ['int'],
+'mysqli_stmt::num_rows' => ['int<0,max>|numeric-string'],
'mysqli_stmt::prepare' => ['bool', 'query'=>'string'],
'mysqli_stmt::reset' => ['bool'],
'mysqli_stmt::result_metadata' => ['mysqli_result|false'],
'mysqli_stmt::send_long_data' => ['bool', 'param_nr'=>'int', 'data'=>'string'],
'mysqli_stmt::store_result' => ['bool'],
-'mysqli_stmt_affected_rows' => ['int|string', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_affected_rows' => ['int<-1,max>|numeric-string', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_attr_get' => ['int|false', 'stmt'=>'mysqli_stmt', 'attr'=>'int'],
'mysqli_stmt_attr_set' => ['bool', 'stmt'=>'mysqli_stmt', 'attr'=>'int', 'mode'=>'int'],
'mysqli_stmt_bind_param' => ['bool', 'stmt'=>'mysqli_stmt', 'types'=>'string', 'var1'=>'mixed', '...args='=>'mixed'],
@@ -7340,24 +7581,24 @@
'mysqli_stmt_data_seek' => ['void', 'stmt'=>'mysqli_stmt', 'offset'=>'int'],
'mysqli_stmt_errno' => ['int', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_error' => ['string', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_error_list' => ['array', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_error_list' => ['list', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_execute' => ['bool', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_fetch' => ['bool', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_field_count' => ['int', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_fetch' => ['bool|null', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_field_count' => ['0|positive-int', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_free_result' => ['void', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_get_result' => ['mysqli_result|false', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_get_warnings' => ['object', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_init' => ['mysqli_stmt', 'link'=>'mysqli'],
+'mysqli_stmt_get_warnings' => ['mysqli_warning|false', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_init' => ['mysqli_stmt|false', 'link'=>'mysqli'],
'mysqli_stmt_insert_id' => ['', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_more_results' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_next_result' => ['bool', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_num_rows' => ['int', 'stmt'=>'mysqli_stmt'],
-'mysqli_stmt_param_count' => ['int', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_num_rows' => ['0|positive-int', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_param_count' => ['0|positive-int', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_prepare' => ['bool', 'stmt'=>'mysqli_stmt', 'query'=>'string'],
'mysqli_stmt_reset' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_result_metadata' => ['mysqli_result|false', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_send_long_data' => ['bool', 'stmt'=>'mysqli_stmt', 'param_nr'=>'int', 'data'=>'string'],
-'mysqli_stmt_sqlstate' => ['string', 'stmt'=>'mysqli_stmt'],
+'mysqli_stmt_sqlstate' => ['non-empty-string', 'stmt'=>'mysqli_stmt'],
'mysqli_stmt_store_result' => ['bool', 'stmt'=>'mysqli_stmt'],
'mysqli_store_result' => ['mysqli_result|false', 'link'=>'mysqli', 'option='=>'int'],
'mysqli_thread_id' => ['int', 'link'=>'mysqli'],
@@ -7750,23 +7991,23 @@
'newt_win_message' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'],
'newt_win_messagev' => ['void', 'title'=>'string', 'button_text'=>'string', 'format'=>'string', 'args'=>'array'],
'newt_win_ternary' => ['int', 'title'=>'string', 'button1_text'=>'string', 'button2_text'=>'string', 'button3_text'=>'string', 'format'=>'string', 'args='=>'mixed', '...args='=>'mixed'],
-'next' => ['mixed', '&rw_array_arg'=>'array'],
+'next' => ['mixed', '&rw_array_arg'=>'array|object'],
'ngettext' => ['string', 'msgid1'=>'string', 'msgid2'=>'string', 'n'=>'int'],
'nl2br' => ['string', 'str'=>'string', 'is_xhtml='=>'bool'],
-'nl_langinfo' => ['string', 'item'=>'int'],
-'NoRewindIterator::__construct' => ['void', 'it'=>'iterator'],
+'nl_langinfo' => ['string|false', 'item'=>'int'],
+'NoRewindIterator::__construct' => ['void', 'iterator'=>'Iterator'],
'NoRewindIterator::current' => ['mixed'],
-'NoRewindIterator::getInnerIterator' => ['iterator'],
+'NoRewindIterator::getInnerIterator' => ['Iterator'],
'NoRewindIterator::key' => ['mixed'],
'NoRewindIterator::next' => ['void'],
'NoRewindIterator::rewind' => ['void'],
'NoRewindIterator::valid' => ['bool'],
'Normalizer::getRawDecomposition' => ['string|null', 'input'=>'string'],
'Normalizer::isNormalized' => ['bool', 'input'=>'string', 'form='=>'int'],
-'Normalizer::normalize' => ['string', 'input'=>'string', 'form='=>'int'],
+'Normalizer::normalize' => ['string|false', 'input'=>'string', 'form='=>'int'],
'normalizer_get_raw_decomposition' => ['string|null', 'input'=>'string'],
'normalizer_is_normalized' => ['bool', 'input'=>'string', 'form='=>'int'],
-'normalizer_normalize' => ['string', 'input'=>'string', 'form='=>'int'],
+'normalizer_normalize' => ['string|false', 'input'=>'string', 'form='=>'int'],
'notes_body' => ['array', 'server'=>'string', 'mailbox'=>'string', 'msg_number'=>'int'],
'notes_copy_db' => ['bool', 'from_database_name'=>'string', 'to_database_name'=>'string'],
'notes_create_db' => ['bool', 'database_name'=>'string'],
@@ -7785,12 +8026,11 @@
'nsapi_response_headers' => ['array'],
'nsapi_virtual' => ['bool', 'uri'=>'string'],
'nthmac' => ['string', 'clent'=>'string', 'data'=>'string'],
-'number_format' => ['string', 'number'=>'float', 'num_decimal_places='=>'int'],
-'number_format\'1' => ['string', 'number'=>'float', 'num_decimal_places'=>'int', 'dec_separator'=>'string', 'thousands_separator'=>'string'],
+'number_format' => ['non-empty-string', 'number'=>'float', 'num_decimal_places='=>'int', 'dec_separator='=>'string|null', 'thousands_separator='=>'string|null'],
'NumberFormatter::__construct' => ['void', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'],
'NumberFormatter::create' => ['NumberFormatter', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'],
-'NumberFormatter::format' => ['string', 'num'=>'', 'type='=>'int'],
-'NumberFormatter::formatCurrency' => ['string', 'num'=>'float', 'currency'=>'string'],
+'NumberFormatter::format' => ['string|false', 'num'=>'', 'type='=>'int'],
+'NumberFormatter::formatCurrency' => ['string|false', 'num'=>'float', 'currency'=>'string'],
'NumberFormatter::getAttribute' => ['int', 'attr'=>'int'],
'NumberFormatter::getErrorCode' => ['int'],
'NumberFormatter::getErrorMessage' => ['string'],
@@ -7799,21 +8039,21 @@
'NumberFormatter::getSymbol' => ['string', 'attr'=>'int'],
'NumberFormatter::getTextAttribute' => ['string', 'attr'=>'int'],
'NumberFormatter::parse' => ['float|false', 'str'=>'string', 'type='=>'int', '&rw_position='=>'int'],
-'NumberFormatter::parseCurrency' => ['float', 'str'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'],
+'NumberFormatter::parseCurrency' => ['float|false', 'str'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'],
'NumberFormatter::setAttribute' => ['bool', 'attr'=>'int', 'value'=>''],
'NumberFormatter::setPattern' => ['bool', 'pattern'=>'string'],
'NumberFormatter::setSymbol' => ['bool', 'attr'=>'int', 'symbol'=>'string'],
'NumberFormatter::setTextAttribute' => ['bool', 'attr'=>'int', 'value'=>'string'],
'numfmt_create' => ['NumberFormatter', 'locale'=>'string', 'style'=>'int', 'pattern='=>'string'],
-'numfmt_format' => ['string', 'fmt'=>'numberformatter', 'value='=>'float', 'type='=>'int'],
+'numfmt_format' => ['string|false', 'fmt'=>'numberformatter', 'value='=>'float', 'type='=>'int'],
'numfmt_format_currency' => ['string|false', 'fmt'=>'numberformatter', 'value'=>'float', 'currency'=>'string'],
-'numfmt_get_attribute' => ['int', 'fmt'=>'numberformatter', 'attr'=>'int'],
+'numfmt_get_attribute' => ['int|false', 'fmt'=>'numberformatter', 'attr'=>'int'],
'numfmt_get_error_code' => ['int', 'fmt'=>'numberformatter'],
'numfmt_get_error_message' => ['string', 'fmt'=>'numberformatter'],
-'numfmt_get_locale' => ['string', 'fmt'=>'numberformatter', 'type='=>'int'],
-'numfmt_get_pattern' => ['string', 'fmt'=>'numberformatter'],
-'numfmt_get_symbol' => ['string', 'fmt'=>'numberformatter', 'attr'=>'int'],
-'numfmt_get_text_attribute' => ['string', 'fmt'=>'numberformatter', 'attr'=>'int'],
+'numfmt_get_locale' => ['string|false', 'fmt'=>'numberformatter', 'type='=>'int'],
+'numfmt_get_pattern' => ['string|false', 'fmt'=>'numberformatter'],
+'numfmt_get_symbol' => ['string|false', 'fmt'=>'numberformatter', 'attr'=>'int'],
+'numfmt_get_text_attribute' => ['string|false', 'fmt'=>'numberformatter', 'attr'=>'int'],
'numfmt_parse' => ['float|false', 'fmt'=>'numberformatter', 'value'=>'string', 'type='=>'int', '&rw_position='=>'int'],
'numfmt_parse_currency' => ['float|false', 'fmt'=>'numberformatter', 'value'=>'string', '&w_currency'=>'string', '&rw_position='=>'int'],
'numfmt_set_attribute' => ['bool', 'fmt'=>'numberformatter', 'attr'=>'int', 'value'=>'int'],
@@ -7880,7 +8120,7 @@
'ob_iconv_handler' => ['string', 'contents'=>'string', 'status'=>'int'],
'ob_implicit_flush' => ['void', 'flag='=>'int'],
'ob_inflatehandler' => ['string', 'data'=>'string', 'mode'=>'int'],
-'ob_list_handlers' => ['false|array'],
+'ob_list_handlers' => ['false|list'],
'ob_start' => ['bool', 'user_function='=>'string|array|callable|null', 'chunk_size='=>'int', 'flags='=>'int'],
'ob_tidyhandler' => ['string', 'input'=>'string', 'mode='=>'int'],
'OCI-Collection::append' => ['bool', 'value'=>'mixed'],
@@ -7925,9 +8165,9 @@
'oci_collection_append' => ['bool', 'value'=>'string'],
'oci_collection_assign' => ['bool', 'from'=>'OCI-Collection'],
'oci_collection_element_assign' => ['bool', 'index'=>'int', 'val'=>'string'],
-'oci_collection_element_get' => ['string', 'ndx'=>'int'],
-'oci_collection_max' => ['int'],
-'oci_collection_size' => ['int'],
+'oci_collection_element_get' => ['string|false', 'ndx'=>'int'],
+'oci_collection_max' => ['int|false'],
+'oci_collection_size' => ['int|false'],
'oci_collection_trim' => ['bool', 'num'=>'int'],
'oci_commit' => ['bool', 'connection'=>'resource'],
'oci_connect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'],
@@ -7958,27 +8198,27 @@
'oci_lob_close' => ['bool'],
'oci_lob_copy' => ['bool', 'lob_to'=>'OCI-Lob', 'lob_from'=>'OCI-Lob', 'length='=>'int'],
'oci_lob_eof' => ['bool'],
-'oci_lob_erase' => ['int', 'offset'=>'int', 'length'=>'int'],
+'oci_lob_erase' => ['int|false', 'offset'=>'int', 'length'=>'int'],
'oci_lob_export' => ['bool', 'filename'=>'string', 'start'=>'int', 'length'=>'int'],
'oci_lob_flush' => ['bool', 'flag'=>'int'],
'oci_lob_import' => ['bool', 'filename'=>'string'],
'oci_lob_is_equal' => ['bool', 'lob1'=>'OCI-Lob', 'lob2'=>'OCI-Lob'],
-'oci_lob_load' => ['string'],
-'oci_lob_read' => ['string', 'length'=>'int'],
+'oci_lob_load' => ['string|false'],
+'oci_lob_read' => ['string|false', 'length'=>'int'],
'oci_lob_rewind' => ['bool'],
'oci_lob_save' => ['bool', 'data'=>'string', 'offset'=>'int'],
'oci_lob_seek' => ['bool', 'offset'=>'int', 'whence'=>'int'],
-'oci_lob_size' => ['int'],
-'oci_lob_tell' => ['int'],
+'oci_lob_size' => ['int|false'],
+'oci_lob_tell' => ['int|false'],
'oci_lob_truncate' => ['bool', 'length'=>'int'],
-'oci_lob_write' => ['int', 'string'=>'string', 'length'=>'int'],
+'oci_lob_write' => ['int|false', 'string'=>'string', 'length'=>'int'],
'oci_lob_write_temporary' => ['bool', 'var'=>'string', 'lob_type'=>'int'],
'oci_new_collection' => ['OCI-Collection|false', 'connection'=>'resource', 'tdo'=>'string', 'schema='=>'string'],
'oci_new_connect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'],
'oci_new_cursor' => ['resource|false', 'connection'=>'resource'],
'oci_new_descriptor' => ['OCI-Lob|false', 'connection'=>'resource', 'type='=>'int'],
-'oci_num_fields' => ['int|false', 'stmt'=>'resource'],
-'oci_num_rows' => ['int|false', 'stmt'=>'resource'],
+'oci_num_fields' => ['0|positive-int|false', 'stmt'=>'resource'],
+'oci_num_rows' => ['0|positive-int|false', 'stmt'=>'resource'],
'oci_parse' => ['resource|false', 'connection'=>'resource', 'statement'=>'string'],
'oci_password_change' => ['bool', 'connection'=>'', 'username'=>'string', 'old_password'=>'string', 'new_password'=>'string'],
'oci_pconnect' => ['resource|false', 'user'=>'string', 'pass'=>'string', 'db='=>'string', 'charset='=>'string', 'session_mode='=>'int'],
@@ -7995,10 +8235,10 @@
'oci_set_prefetch' => ['bool', 'stmt'=>'resource', 'prefetch_rows'=>'int'],
'oci_statement_type' => ['string|false', 'stmt'=>'resource'],
'oci_unregister_taf_callback' => ['bool', 'connection'=>'resource'],
-'ocifetchinto' => ['int', 'stmt'=>'', '&w_output'=>'array', 'mode='=>'int'],
+'ocifetchinto' => ['int|false', 'stmt'=>'', '&w_output'=>'array', 'mode='=>'int'],
'ocigetbufferinglob' => ['bool'],
'ocisetbufferinglob' => ['bool', 'flag'=>'bool'],
-'octdec' => ['int', 'octal_number'=>'string'],
+'octdec' => ['int|float', 'octal_number'=>'string'],
'odbc_autocommit' => ['mixed', 'connection_id'=>'resource', 'onoff='=>'bool'],
'odbc_binmode' => ['bool', 'result_id'=>'int', 'mode'=>'int'],
'odbc_close' => ['void', 'connection_id'=>'resource'],
@@ -8006,24 +8246,24 @@
'odbc_columnprivileges' => ['resource', 'connection_id'=>'resource', 'catalog'=>'string', 'schema'=>'string', 'table'=>'string', 'column'=>'string'],
'odbc_columns' => ['resource', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'table_name='=>'string', 'column_name='=>'string'],
'odbc_commit' => ['bool', 'connection_id'=>'resource'],
-'odbc_connect' => ['resource', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'],
-'odbc_cursor' => ['string', 'result_id'=>'resource'],
-'odbc_data_source' => ['array', 'connection_id'=>'resource', 'fetch_type'=>'int'],
+'odbc_connect' => ['resource|false', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'],
+'odbc_cursor' => ['string|false', 'result_id'=>'resource'],
+'odbc_data_source' => ['array|false', 'connection_id'=>'resource', 'fetch_type'=>'int'],
'odbc_do' => ['resource', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'],
'odbc_error' => ['string', 'connection_id='=>'resource'],
'odbc_errormsg' => ['string', 'connection_id='=>'resource'],
-'odbc_exec' => ['resource', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'],
+'odbc_exec' => ['resource|false', 'connection_id'=>'resource', 'query'=>'string', 'flags='=>'int'],
'odbc_execute' => ['bool', 'result_id'=>'resource', 'parameters_array='=>'array'],
-'odbc_fetch_array' => ['array', 'result'=>'resource', 'rownumber='=>'int'],
-'odbc_fetch_into' => ['int', 'result_id'=>'resource', '&w_result_array'=>'array', 'rownumber='=>'int'],
-'odbc_fetch_object' => ['object', 'result'=>'int', 'rownumber='=>'int'],
+'odbc_fetch_array' => ['array|false', 'result'=>'resource', 'rownumber='=>'int'],
+'odbc_fetch_into' => ['int|false', 'result_id'=>'resource', '&w_result_array'=>'array', 'rownumber='=>'int'],
+'odbc_fetch_object' => ['object|false', 'result'=>'int', 'rownumber='=>'int'],
'odbc_fetch_row' => ['bool', 'result_id'=>'resource', 'row_number='=>'int'],
-'odbc_field_len' => ['int', 'result_id'=>'resource', 'field_number'=>'int'],
-'odbc_field_name' => ['string', 'result_id'=>'resource', 'field_number'=>'int'],
-'odbc_field_num' => ['int', 'result_id'=>'resource', 'field_name'=>'string'],
-'odbc_field_precision' => ['int', 'result_id'=>'resource', 'field_number'=>'int'],
-'odbc_field_scale' => ['int', 'result_id'=>'resource', 'field_number'=>'int'],
-'odbc_field_type' => ['string', 'result_id'=>'resource', 'field_number'=>'int'],
+'odbc_field_len' => ['int|false', 'result_id'=>'resource', 'field_number'=>'int'],
+'odbc_field_name' => ['string|false', 'result_id'=>'resource', 'field_number'=>'int'],
+'odbc_field_num' => ['int|false', 'result_id'=>'resource', 'field_name'=>'string'],
+'odbc_field_precision' => ['int|false', 'result_id'=>'resource', 'field_number'=>'int'],
+'odbc_field_scale' => ['int|false', 'result_id'=>'resource', 'field_number'=>'int'],
+'odbc_field_type' => ['string|false', 'result_id'=>'resource', 'field_number'=>'int'],
'odbc_foreignkeys' => ['resource', 'connection_id'=>'resource', 'pk_qualifier'=>'string', 'pk_owner'=>'string', 'pk_table'=>'string', 'fk_qualifier'=>'string', 'fk_owner'=>'string', 'fk_table'=>'string'],
'odbc_free_result' => ['bool', 'result_id'=>'resource'],
'odbc_gettypeinfo' => ['resource', 'connection_id'=>'resource', 'data_type='=>'int'],
@@ -8032,12 +8272,12 @@
'odbc_num_fields' => ['int', 'result_id'=>'resource'],
'odbc_num_rows' => ['int', 'result_id'=>'resource'],
'odbc_pconnect' => ['resource', 'dsn'=>'string', 'user'=>'string', 'password'=>'string', 'cursor_option='=>'int'],
-'odbc_prepare' => ['resource', 'connection_id'=>'resource', 'query'=>'string'],
+'odbc_prepare' => ['resource|false', 'connection_id'=>'resource', 'query'=>'string'],
'odbc_primarykeys' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string'],
'odbc_procedurecolumns' => ['resource', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'proc'=>'string', 'column'=>'string'],
'odbc_procedures' => ['resource', 'connection_id'=>'', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'],
'odbc_result' => ['mixed', 'result_id'=>'resource', 'field'=>'mixed'],
-'odbc_result_all' => ['int', 'result_id'=>'resource', 'format='=>'string'],
+'odbc_result_all' => ['int|false', 'result_id'=>'resource', 'format='=>'string'],
'odbc_rollback' => ['bool', 'connection_id'=>'resource'],
'odbc_setoption' => ['bool', 'result_id'=>'resource', 'which'=>'int', 'option'=>'int', 'value'=>'int'],
'odbc_specialcolumns' => ['resource', 'connection_id'=>'resource', 'type'=>'int', 'qualifier'=>'string', 'owner'=>'string', 'table'=>'string', 'scope'=>'int', 'nullable'=>'int'],
@@ -8045,7 +8285,7 @@
'odbc_tableprivileges' => ['resource', 'connection_id'=>'resource', 'qualifier'=>'string', 'owner'=>'string', 'name'=>'string'],
'odbc_tables' => ['resource', 'connection_id'=>'resource', 'qualifier='=>'string', 'owner='=>'string', 'name='=>'string', 'table_types='=>'string'],
'opcache_compile_file' => ['bool', 'file'=>'string'],
-'opcache_get_configuration' => ['array'],
+'opcache_get_configuration' => ['array|false'],
'opcache_get_status' => ['array|false', 'get_scripts='=>'bool'],
'opcache_invalidate' => ['bool', 'script'=>'string', 'force='=>'bool'],
'opcache_is_script_cached' => ['bool', 'script'=>'string'],
@@ -8061,7 +8301,7 @@
'openal_context_process' => ['bool', 'context'=>'resource'],
'openal_context_suspend' => ['bool', 'context'=>'resource'],
'openal_device_close' => ['bool', 'device'=>'resource'],
-'openal_device_open' => ['resource', 'device_desc='=>'string'],
+'openal_device_open' => ['resource|false', 'device_desc='=>'string'],
'openal_listener_get' => ['mixed', 'property'=>'int'],
'openal_listener_set' => ['bool', 'property'=>'int', 'setting'=>'mixed'],
'openal_source_create' => ['resource'],
@@ -8088,10 +8328,10 @@
'openssl_encrypt' => ['string|false', 'data'=>'string', 'method'=>'string', 'key'=>'string', 'options='=>'int', 'iv='=>'string', '&w_tag='=>'string', 'aad='=>'string', 'tag_length='=>'int'],
'openssl_error_string' => ['string|false'],
'openssl_free_key' => ['void', 'key_identifier'=>'resource'],
-'openssl_get_cert_locations' => ['array'],
-'openssl_get_cipher_methods' => ['array', 'aliases='=>'bool'],
-'openssl_get_curve_names' => ['array'],
-'openssl_get_md_methods' => ['array', 'aliases='=>'bool'],
+'openssl_get_cert_locations' => ['array'],
+'openssl_get_cipher_methods' => ['list', 'aliases='=>'bool'],
+'openssl_get_curve_names' => ['list|false'],
+'openssl_get_md_methods' => ['list', 'aliases='=>'bool'],
'openssl_get_privatekey' => ['resource|false', 'key'=>'string', 'passphrase='=>'string'],
'openssl_get_publickey' => ['resource|false', 'cert'=>'resource|string'],
'openssl_open' => ['bool', 'sealed_data'=>'string', '&w_open_data'=>'string', 'env_key'=>'string', 'priv_key_id'=>'string|array|resource', 'method='=>'string', 'iv='=>'string'],
@@ -8105,8 +8345,8 @@
'openssl_pkcs7_sign' => ['bool', 'infile'=>'string', 'outfile'=>'string', 'signcert'=>'string|resource', 'privkey'=>'string|resource|array', 'headers'=>'array', 'flags='=>'int', 'extracerts='=>'string'],
'openssl_pkcs7_verify' => ['bool|int', 'filename'=>'string', 'flags'=>'int', 'outfilename='=>'string', 'cainfo='=>'array', 'extracerts='=>'string', 'content='=>'string', 'p7bfilename='=>'string'],
'openssl_pkey_derive' => ['string|false', 'pub_key'=>'resource', 'priv_key'=>'resource', 'keylen='=>'int'],
-'openssl_pkey_export' => ['bool', 'key'=>'resource', '&w_out'=>'string', 'passphrase='=>'string', 'configargs='=>'array'],
-'openssl_pkey_export_to_file' => ['bool', 'key'=>'resource|string|array', 'outfilename'=>'string', 'passphrase='=>'string', 'configargs='=>'array'],
+'openssl_pkey_export' => ['bool', 'key'=>'resource', '&w_out'=>'string', 'passphrase='=>'string|null', 'configargs='=>'array'],
+'openssl_pkey_export_to_file' => ['bool', 'key'=>'resource|string|array', 'outfilename'=>'string', 'passphrase='=>'string|null', 'configargs='=>'array'],
'openssl_pkey_free' => ['void', 'key'=>'resource'],
'openssl_pkey_get_details' => ['array|false', 'key'=>'resource'],
'openssl_pkey_get_private' => ['resource|false', 'key'=>'string', 'passphrase='=>'string'],
@@ -8117,13 +8357,13 @@
'openssl_public_decrypt' => ['bool', 'data'=>'string', '&w_decrypted'=>'string', 'key'=>'string|resource', 'padding='=>'int'],
'openssl_public_encrypt' => ['bool', 'data'=>'string', '&w_crypted'=>'string', 'key'=>'string|resource', 'padding='=>'int'],
'openssl_random_pseudo_bytes' => ['string|false', 'length'=>'int', '&w_crypto_strong='=>'bool'],
-'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_env_keys'=>'array', 'pub_key_ids'=>'array', 'method='=>'string'],
+'openssl_seal' => ['int|false', 'data'=>'string', '&w_sealed_data'=>'string', '&w_env_keys'=>'array', 'pub_key_ids'=>'array', 'method='=>'string', '&w_iv='=>'string'],
'openssl_sign' => ['bool', 'data'=>'string', '&w_signature'=>'string', 'priv_key_id'=>'resource|string', 'signature_alg='=>'int|string'],
-'openssl_spki_export' => ['string|null', 'spkac'=>'string'],
-'openssl_spki_export_challenge' => ['string|null', 'spkac'=>'string'],
-'openssl_spki_new' => ['string|null', 'privkey'=>'resource', 'challenge'=>'string', 'algorithm='=>'int'],
+'openssl_spki_export' => ['string|null|false', 'spkac'=>'string'],
+'openssl_spki_export_challenge' => ['string|null|false', 'spkac'=>'string'],
+'openssl_spki_new' => ['string|null|false', 'privkey'=>'resource', 'challenge'=>'string', 'algorithm='=>'int'],
'openssl_spki_verify' => ['bool', 'spkac'=>'string'],
-'openssl_verify' => ['int', 'data'=>'string', 'signature'=>'string', 'pub_key_id'=>'resource|string', 'signature_alg='=>'int|string'],
+'openssl_verify' => ['-1|0|1|false', 'data'=>'string', 'signature'=>'string', 'pub_key_id'=>'resource|string', 'signature_alg='=>'int|string'],
'openssl_x509_check_private_key' => ['bool', 'cert'=>'string|resource', 'key'=>'string|resource|array'],
'openssl_x509_checkpurpose' => ['bool|int', 'x509cert'=>'string|resource', 'purpose'=>'int', 'cainfo='=>'array', 'untrustedfile='=>'string'],
'openssl_x509_export' => ['bool', 'x509'=>'string|resource', '&w_output'=>'string', 'notext='=>'bool'],
@@ -8132,7 +8372,7 @@
'openssl_x509_free' => ['void', 'x509'=>'resource'],
'openssl_x509_parse' => ['array|false', 'x509cert'=>'string|resource', 'shortnames='=>'bool'],
'openssl_x509_read' => ['resource|false', 'x509certdata'=>'string|resource'],
-'ord' => ['int', 'character'=>'string'],
+'ord' => ['int<0, 255>', 'character'=>'string'],
'OuterIterator::getInnerIterator' => ['Iterator'],
'OutOfBoundsException::__clone' => ['void'],
'OutOfBoundsException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?OutOfBoundsException)'],
@@ -8142,7 +8382,7 @@
'OutOfBoundsException::getLine' => ['int'],
'OutOfBoundsException::getMessage' => ['string'],
'OutOfBoundsException::getPrevious' => ['Throwable|OutOfBoundsException|null'],
-'OutOfBoundsException::getTrace' => ['array'],
+'OutOfBoundsException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'OutOfBoundsException::getTraceAsString' => ['string'],
'OutOfRangeException::__clone' => ['void'],
'OutOfRangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?OutOfRangeException)'],
@@ -8152,7 +8392,7 @@
'OutOfRangeException::getLine' => ['int'],
'OutOfRangeException::getMessage' => ['string'],
'OutOfRangeException::getPrevious' => ['Throwable|OutOfRangeException|null'],
-'OutOfRangeException::getTrace' => ['array'],
+'OutOfRangeException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'OutOfRangeException::getTraceAsString' => ['string'],
'output_add_rewrite_var' => ['bool', 'name'=>'string', 'value'=>'string'],
'output_reset_rewrite_vars' => ['bool'],
@@ -8164,12 +8404,12 @@
'OverflowException::getLine' => ['int'],
'OverflowException::getMessage' => ['string'],
'OverflowException::getPrevious' => ['Throwable|OverflowException|null'],
-'OverflowException::getTrace' => ['array'],
+'OverflowException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'OverflowException::getTraceAsString' => ['string'],
'overload' => ['', 'class_name'=>'string'],
'override_function' => ['bool', 'function_name'=>'string', 'function_args'=>'string', 'function_code'=>'string'],
'pack' => ['string', 'format'=>'string', '...args='=>'mixed'],
-'ParentIterator::__construct' => ['void', 'it'=>'recursiveiterator'],
+'ParentIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'],
'ParentIterator::accept' => ['bool'],
'ParentIterator::getChildren' => ['ParentIterator'],
'ParentIterator::hasChildren' => ['bool'],
@@ -8231,7 +8471,7 @@
'parse_ini_file' => ['array|false', 'filename'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'],
'parse_ini_string' => ['array|false', 'ini_string'=>'string', 'process_sections='=>'bool', 'scanner_mode='=>'int'],
'parse_str' => ['void', 'encoded_string'=>'string', '&w_result='=>'array'],
-'parse_url' => ['mixed', 'url'=>'string', 'url_component='=>'int'],
+'parse_url' => ['array|int|string|false|null', 'url'=>'string', 'url_component='=>'int'],
'ParseError::__clone' => ['void'],
'ParseError::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?ParseError)'],
'ParseError::__toString' => ['string'],
@@ -8240,14 +8480,14 @@
'ParseError::getLine' => ['int'],
'ParseError::getMessage' => ['string'],
'ParseError::getPrevious' => ['Throwable|ParseError|null'],
-'ParseError::getTrace' => ['array'],
+'ParseError::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'ParseError::getTraceAsString' => ['string'],
'parsekit_compile_file' => ['array', 'filename'=>'string', 'errors='=>'array', 'options='=>'int'],
'parsekit_compile_string' => ['array', 'phpcode'=>'string', 'errors='=>'array', 'options='=>'int'],
'parsekit_func_arginfo' => ['array', 'function'=>'mixed'],
'passthru' => ['void', 'command'=>'string', '&w_return_value='=>'int'],
'password_get_info' => ['array', 'hash'=>'string'],
-'password_hash' => ['string|false', 'password'=>'string', 'algo'=>'int', 'options='=>'array'],
+'password_hash' => ['__benevolent', 'password'=>'string', 'algo'=>'string|int', 'options='=>'array'],
'password_make_salt' => ['bool', 'password'=>'string', 'hash'=>'string'],
'password_needs_rehash' => ['bool', 'hash'=>'string', 'algo'=>'int', 'options='=>'array'],
'password_verify' => ['bool', 'password'=>'string', 'hash'=>'string'],
@@ -8260,24 +8500,24 @@
'pcntl_exec' => ['bool', 'path'=>'string', 'args='=>'array', 'envs='=>'array'],
'pcntl_fork' => ['int'],
'pcntl_get_last_error' => ['int'],
-'pcntl_getpriority' => ['int', 'pid='=>'int', 'process_identifier='=>'int'],
+'pcntl_getpriority' => ['int|false', 'pid='=>'int', 'process_identifier='=>'int'],
'pcntl_setpriority' => ['bool', 'priority'=>'int', 'pid='=>'int', 'process_identifier='=>'int'],
'pcntl_signal' => ['bool', 'signo'=>'int', 'handle'=>'callable|int', 'restart_syscalls='=>'bool'],
'pcntl_signal_dispatch' => ['bool'],
'pcntl_signal_get_handler' => ['int|string', 'signo'=>'int'],
'pcntl_sigprocmask' => ['bool', 'how'=>'int', 'set'=>'array', '&w_oldset='=>'array'],
-'pcntl_sigtimedwait' => ['int', 'set'=>'array', '&w_siginfo='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'],
-'pcntl_sigwaitinfo' => ['int', 'set'=>'array', '&w_siginfo='=>'array'],
+'pcntl_sigtimedwait' => ['int|false', 'set'=>'array', '&w_siginfo='=>'array', 'seconds='=>'int', 'nanoseconds='=>'int'],
+'pcntl_sigwaitinfo' => ['int|false', 'set'=>'array', '&w_siginfo='=>'array'],
'pcntl_strerror' => ['string', 'errno'=>'int'],
'pcntl_wait' => ['int', '&w_status'=>'int', 'options='=>'int', '&w_rusage='=>'array'],
'pcntl_waitpid' => ['int', 'pid'=>'int', '&w_status'=>'int', 'options='=>'int', '&w_rusage='=>'array'],
-'pcntl_wexitstatus' => ['int', 'status'=>'int'],
+'pcntl_wexitstatus' => ['int|false', 'status'=>'int'],
'pcntl_wifcontinued' => ['bool', 'status'=>'int'],
'pcntl_wifexited' => ['bool', 'status'=>'int'],
'pcntl_wifsignaled' => ['bool', 'status'=>'int'],
'pcntl_wifstopped' => ['bool', 'status'=>'int'],
-'pcntl_wstopsig' => ['int', 'status'=>'int'],
-'pcntl_wtermsig' => ['int', 'status'=>'int'],
+'pcntl_wstopsig' => ['int|false', 'status'=>'int'],
+'pcntl_wtermsig' => ['int|false', 'status'=>'int'],
'PDF_activate_item' => ['bool', 'pdfdoc'=>'resource', 'id'=>'int'],
'PDF_add_launchlink' => ['bool', 'pdfdoc'=>'resource', 'llx'=>'float', 'lly'=>'float', 'urx'=>'float', 'ury'=>'float', 'filename'=>'string'],
'PDF_add_locallink' => ['bool', 'pdfdoc'=>'resource', 'lowerleftx'=>'float', 'lowerlefty'=>'float', 'upperrightx'=>'float', 'upperrighty'=>'float', 'page'=>'int', 'dest'=>'string'],
@@ -8433,28 +8673,28 @@
'PDF_utf32_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf32string'=>'string', 'ordering'=>'string'],
'PDF_utf8_to_utf16' => ['string', 'pdfdoc'=>'resource', 'utf8string'=>'string', 'ordering'=>'string'],
'PDO::__construct' => ['void', 'dsn'=>'string', 'username='=>'?string', 'passwd='=>'?string', 'options='=>'?array'],
-'PDO::__sleep' => ['array'],
+'PDO::__sleep' => ['list'],
'PDO::__wakeup' => ['void'],
'PDO::beginTransaction' => ['bool'],
'PDO::commit' => ['bool'],
'PDO::cubrid_schema' => ['array', 'schema_type'=>'int', 'table_name='=>'string', 'col_name='=>'string'],
'PDO::errorCode' => ['string'],
'PDO::errorInfo' => ['array'],
-'PDO::exec' => ['int', 'query'=>'string'],
+'PDO::exec' => ['int|false', 'query'=>'string'],
'PDO::getAttribute' => ['', 'attribute'=>'int'],
'PDO::getAvailableDrivers' => ['array'],
'PDO::inTransaction' => ['bool'],
-'PDO::lastInsertId' => ['string', 'seqname='=>'string'],
-'PDO::pgsqlCopyFromArray' => ['bool', 'table_name'=>'string', 'rows'=>'array', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'],
-'PDO::pgsqlCopyFromFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'],
-'PDO::pgsqlCopyToArray' => ['array', 'table_name'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'],
-'PDO::pgsqlCopyToFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter'=>'string', 'null_as'=>'string', 'fields'=>'string'],
-'PDO::pgsqlGetNotify' => ['array', 'result_type'=>'int', 'ms_timeout'=>'int'],
+'PDO::lastInsertId' => ['string|false', 'seqname='=>'string'],
+'PDO::pgsqlCopyFromArray' => ['bool', 'table_name'=>'string', 'rows'=>'array', 'delimiter='=>'string', 'null_as='=>'string', 'fields='=>'string'],
+'PDO::pgsqlCopyFromFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter='=>'string', 'null_as='=>'string', 'fields='=>'string'],
+'PDO::pgsqlCopyToArray' => ['array', 'table_name'=>'string', 'delimiter='=>'string', 'null_as='=>'string', 'fields='=>'string'],
+'PDO::pgsqlCopyToFile' => ['bool', 'table_name'=>'string', 'filename'=>'string', 'delimiter='=>'string', 'null_as='=>'string', 'fields='=>'string'],
+'PDO::pgsqlGetNotify' => ['array', 'result_type='=>'int', 'ms_timeout='=>'int'],
'PDO::pgsqlGetPid' => ['int'],
'PDO::pgsqlLOBCreate' => ['string'],
'PDO::pgsqlLOBOpen' => ['resource', 'oid'=>'string', 'mode='=>'string'],
'PDO::pgsqlLOBUnlink' => ['bool', 'oid'=>'string'],
-'PDO::prepare' => ['PDOStatement', 'statement'=>'string', 'options='=>'array'],
+'PDO::prepare' => ['__benevolent', 'statement'=>'string', 'options='=>'array'],
'PDO::query' => ['PDOStatement|false', 'sql'=>'string'],
'PDO::query\'1' => ['PDOStatement|false', 'sql'=>'string', 'fetch_column'=>'int', 'colno'=>'int'],
'PDO::query\'2' => ['PDOStatement|false', 'sql'=>'string', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'],
@@ -8464,40 +8704,40 @@
'PDO::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>''],
'PDO::sqliteCreateAggregate' => ['bool', 'function_name'=>'string', 'step_func'=>'callable', 'finalize_func'=>'callable', 'num_args='=>'int'],
'PDO::sqliteCreateCollation' => ['bool', 'name'=>'string', 'callback'=>'callable'],
-'PDO::sqliteCreateFunction' => ['bool', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int'],
+'PDO::sqliteCreateFunction' => ['bool', 'function_name'=>'string', 'callback'=>'callable', 'num_args='=>'int', 'flags='=>'int'],
'pdo_drivers' => ['array'],
'PDOException::getCode' => [''],
'PDOException::getFile' => [''],
'PDOException::getLine' => [''],
'PDOException::getMessage' => [''],
'PDOException::getPrevious' => [''],
-'PDOException::getTrace' => [''],
+'PDOException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'PDOException::getTraceAsString' => [''],
-'PDOStatement::__sleep' => ['array'],
+'PDOStatement::__sleep' => ['list'],
'PDOStatement::__wakeup' => ['void'],
-'PDOStatement::bindColumn' => ['bool', 'column'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'],
-'PDOStatement::bindParam' => ['bool', 'paramno'=>'mixed', '&rw_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'],
-'PDOStatement::bindValue' => ['bool', 'paramno'=>'mixed', 'param'=>'mixed', 'type='=>'int'],
+'PDOStatement::bindColumn' => ['bool', 'column'=>'mixed', '&w_param'=>'mixed', 'type='=>'int', 'maxlen='=>'int', 'driverdata='=>'mixed'],
+'PDOStatement::bindParam' => ['bool', 'parameter'=>'mixed', '&w_variable'=>'mixed', 'data_type='=>'int', 'length='=>'int', 'driver_options='=>'mixed'],
+'PDOStatement::bindValue' => ['bool', 'parameter'=>'mixed', 'value'=>'mixed', 'data_type='=>'int'],
'PDOStatement::closeCursor' => ['bool'],
-'PDOStatement::columnCount' => ['int'],
+'PDOStatement::columnCount' => ['0|positive-int'],
'PDOStatement::debugDumpParams' => ['void'],
'PDOStatement::errorCode' => ['string'],
'PDOStatement::errorInfo' => ['array'],
'PDOStatement::execute' => ['bool', 'bound_input_params='=>'?array'],
'PDOStatement::fetch' => ['mixed', 'how='=>'int', 'orientation='=>'int', 'offset='=>'int'],
'PDOStatement::fetchAll' => ['array|false', 'how='=>'int', 'fetch_argument='=>'int|string|callable', 'ctor_args='=>'?array'],
-'PDOStatement::fetchColumn' => ['string|null|false', 'column_number='=>'int'],
+'PDOStatement::fetchColumn' => ['string|null|false|int', 'column_number='=>'int'],
'PDOStatement::fetchObject' => ['mixed', 'class_name='=>'string', 'ctor_args='=>'?array'],
'PDOStatement::getAttribute' => ['mixed', 'attribute'=>'int'],
-'PDOStatement::getColumnMeta' => ['array', 'column'=>'int'],
+'PDOStatement::getColumnMeta' => ['array|false', 'column'=>'int'],
'PDOStatement::nextRowset' => ['bool'],
-'PDOStatement::rowCount' => ['int'],
+'PDOStatement::rowCount' => ['0|positive-int'],
'PDOStatement::setAttribute' => ['bool', 'attribute'=>'int', 'value'=>'mixed'],
'PDOStatement::setFetchMode' => ['bool', 'mode'=>'int'],
'PDOStatement::setFetchMode\'1' => ['bool', 'fetch_column'=>'int', 'colno'=>'int'],
-'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs'=>'array'],
+'PDOStatement::setFetchMode\'2' => ['bool', 'fetch_class'=>'int', 'classname'=>'string', 'ctorargs='=>'?array'],
'PDOStatement::setFetchMode\'3' => ['bool', 'fetch_into'=>'int', 'object'=>'object'],
-'pfsockopen' => ['resource', 'hostname'=>'string', 'port='=>'int', '&w_errno='=>'int', '&w_errstr='=>'string', 'timeout='=>'float'],
+'pfsockopen' => ['resource|false', 'hostname'=>'string', 'port='=>'int', '&w_errno='=>'int', '&w_errstr='=>'string', 'timeout='=>'float'],
'pg_affected_rows' => ['int', 'result'=>'resource'],
'pg_cancel_query' => ['bool', 'connection'=>'resource'],
'pg_client_encoding' => ['string', 'connection='=>'resource'],
@@ -8508,36 +8748,36 @@
'pg_connection_reset' => ['bool', 'connection'=>'resource'],
'pg_connection_status' => ['int', 'connection'=>'resource'],
'pg_consume_input' => ['bool', 'connection'=>'resource'],
-'pg_convert' => ['array', 'db'=>'resource', 'table'=>'string', 'values'=>'array', 'options='=>'int'],
+'pg_convert' => ['array|false', 'db'=>'resource', 'table'=>'string', 'values'=>'array', 'options='=>'int'],
'pg_copy_from' => ['bool', 'connection'=>'resource', 'table_name'=>'string', 'rows'=>'array', 'delimiter='=>'string', 'null_as='=>'string'],
-'pg_copy_to' => ['array', 'connection'=>'resource', 'table_name'=>'string', 'delimiter='=>'string', 'null_as='=>'string'],
+'pg_copy_to' => ['array|false', 'connection'=>'resource', 'table_name'=>'string', 'delimiter='=>'string', 'null_as='=>'string'],
'pg_dbname' => ['string', 'connection='=>'resource'],
'pg_delete' => ['mixed', 'db'=>'resource', 'table'=>'string', 'ids'=>'array', 'options='=>'int'],
'pg_end_copy' => ['bool', 'connection='=>'resource'],
'pg_escape_bytea' => ['string', 'connection'=>'resource', 'data'=>'string'],
'pg_escape_bytea\'1' => ['string', 'data'=>'string'],
-'pg_escape_identifier' => ['string', 'connection'=>'resource', 'data'=>'string'],
+'pg_escape_identifier' => ['string|false', 'connection'=>'resource', 'data'=>'string'],
'pg_escape_identifier\'1' => ['string', 'data'=>'string'],
-'pg_escape_literal' => ['string', 'connection'=>'resource', 'data'=>'string'],
+'pg_escape_literal' => ['string|false', 'connection'=>'resource', 'data'=>'string'],
'pg_escape_literal\'1' => ['string', 'data'=>'string'],
'pg_escape_string' => ['string', 'connection'=>'resource', 'data'=>'string'],
'pg_escape_string\'1' => ['string', 'data'=>'string'],
'pg_execute' => ['resource|false', 'connection'=>'resource', 'stmtname'=>'string', 'params'=>'array'],
'pg_execute\'1' => ['resource|false', 'stmtname'=>'string', 'params'=>'array'],
-'pg_fetch_all' => ['array|false', 'result'=>'resource', 'result_type='=>'int'],
+'pg_fetch_all' => ['array>', 'result'=>'resource', 'result_type='=>'int'],
'pg_fetch_all_columns' => ['array|false', 'result'=>'resource', 'column_number='=>'int'],
'pg_fetch_array' => ['array|false', 'result'=>'resource', 'row='=>'?int', 'result_type='=>'int'],
-'pg_fetch_assoc' => ['array|false', 'result'=>'resource', 'row='=>'?int'],
-'pg_fetch_object' => ['object', 'result'=>'', 'row='=>'?int', 'result_type='=>'int'],
+'pg_fetch_assoc' => ['non-empty-array|false', 'result'=>'resource', 'row='=>'?int'],
+'pg_fetch_object' => ['object|false', 'result'=>'', 'row='=>'?int', 'result_type='=>'int'],
'pg_fetch_object\'1' => ['object', 'result'=>'', 'row='=>'?int', 'class_name='=>'string', 'ctor_params='=>'array'],
'pg_fetch_result' => ['', 'result'=>'', 'field_name'=>'string|int'],
'pg_fetch_result\'1' => ['', 'result'=>'', 'row_number'=>'int', 'field_name'=>'string|int'],
-'pg_fetch_row' => ['array', 'result'=>'resource', 'row='=>'?int', 'result_type='=>'int'],
-'pg_field_is_null' => ['int', 'result'=>'', 'field_name_or_number'=>'string|int'],
+'pg_fetch_row' => ['non-empty-list|false', 'result'=>'resource', 'row='=>'?int', 'result_type='=>'int'],
+'pg_field_is_null' => ['int|false', 'result'=>'', 'field_name_or_number'=>'string|int'],
'pg_field_is_null\'1' => ['int', 'result'=>'', 'row'=>'int', 'field_name_or_number'=>'string|int'],
-'pg_field_name' => ['string', 'result'=>'resource', 'field_number'=>'int'],
+'pg_field_name' => ['string|false', 'result'=>'resource', 'field_number'=>'int'],
'pg_field_num' => ['int', 'result'=>'resource', 'field_name'=>'string'],
-'pg_field_prtlen' => ['int', 'result'=>'', 'field_name_or_number'=>''],
+'pg_field_prtlen' => ['int|false', 'result'=>'', 'field_name_or_number'=>''],
'pg_field_prtlen\'1' => ['int', 'result'=>'', 'row'=>'int', 'field_name_or_number'=>'string|int'],
'pg_field_size' => ['int', 'result'=>'resource', 'field_number'=>'int'],
'pg_field_table' => ['mixed', 'result'=>'resource', 'field_number'=>'int', 'oid_only='=>'bool'],
@@ -8545,35 +8785,35 @@
'pg_field_type_oid' => ['int|false', 'result'=>'resource', 'field_number'=>'int'],
'pg_flush' => ['mixed', 'connection'=>'resource'],
'pg_free_result' => ['bool', 'result'=>'resource'],
-'pg_get_notify' => ['array', 'connection'=>'resource', 'result_type='=>'int'],
+'pg_get_notify' => ['array|false', 'connection'=>'resource', 'result_type='=>'int'],
'pg_get_pid' => ['int|false', 'connection'=>'resource'],
'pg_get_result' => ['resource|false', 'connection='=>'resource'],
'pg_host' => ['string', 'connection='=>'resource'],
'pg_insert' => ['mixed', 'db'=>'resource', 'table'=>'string', 'values'=>'array', 'options='=>'int'],
'pg_last_error' => ['string', 'connection='=>'resource', 'operation='=>'int'],
'pg_last_notice' => ['string', 'connection'=>'resource', 'option='=>'int'],
-'pg_last_oid' => ['string', 'result'=>'resource'],
+'pg_last_oid' => ['string|false', 'result'=>'resource'],
'pg_lo_close' => ['bool', 'large_object'=>'resource'],
-'pg_lo_create' => ['int', 'connection='=>'resource', 'large_object_oid='=>''],
+'pg_lo_create' => ['int|false', 'connection='=>'resource', 'large_object_oid='=>''],
'pg_lo_export' => ['bool', 'connection'=>'resource', 'oid'=>'int', 'filename'=>'string'],
'pg_lo_export\'1' => ['bool', 'oid'=>'int', 'pathname'=>'string'],
-'pg_lo_import' => ['int', 'connection'=>'resource', 'pathname'=>'string', 'oid'=>''],
+'pg_lo_import' => ['int|false', 'connection'=>'resource', 'pathname'=>'string', 'oid'=>''],
'pg_lo_import\'1' => ['int', 'pathname'=>'string', 'oid'=>''],
'pg_lo_open' => ['resource|false', 'connection'=>'resource', 'oid'=>'int', 'mode'=>'string'],
-'pg_lo_read' => ['string', 'large_object'=>'resource', 'len='=>'int'],
+'pg_lo_read' => ['string|false', 'large_object'=>'resource', 'len='=>'int'],
'pg_lo_read_all' => ['int', 'large_object'=>'resource'],
'pg_lo_seek' => ['bool', 'large_object'=>'resource', 'offset'=>'int', 'whence='=>'int'],
'pg_lo_tell' => ['int', 'large_object'=>'resource'],
'pg_lo_truncate' => ['bool', 'large_object'=>'resource', 'size'=>'int'],
'pg_lo_unlink' => ['bool', 'connection'=>'resource', 'oid'=>'int'],
-'pg_lo_write' => ['int', 'large_object'=>'resource', 'data'=>'string', 'len='=>'int'],
-'pg_meta_data' => ['array', 'db'=>'resource', 'table'=>'string', 'extended='=>'bool'],
+'pg_lo_write' => ['int|false', 'large_object'=>'resource', 'data'=>'string', 'len='=>'int'],
+'pg_meta_data' => ['array|false', 'db'=>'resource', 'table'=>'string', 'extended='=>'bool'],
'pg_num_fields' => ['int', 'result'=>'resource'],
'pg_num_rows' => ['int', 'result'=>'resource'],
'pg_options' => ['string', 'connection='=>'resource'],
'pg_parameter_status' => ['string|false', 'connection'=>'resource', 'param_name'=>'string'],
'pg_parameter_status\'1' => ['string|false', 'param_name'=>'string'],
-'pg_pconnect' => ['resource|false', 'connection_string'=>'string', 'host='=>'string', 'port='=>'string|int', 'options='=>'string', 'tty='=>'string', 'database='=>'string'],
+'pg_pconnect' => ['resource|false', 'connection_string'=>'string', 'connect_type='=>'int'],
'pg_ping' => ['bool', 'connection='=>'resource'],
'pg_port' => ['int', 'connection='=>'resource'],
'pg_prepare' => ['resource|false', 'connection'=>'resource', 'stmtname'=>'string', 'query'=>'string'],
@@ -8595,7 +8835,7 @@
'pg_send_query_params' => ['bool', 'connection'=>'resource', 'query'=>'string', 'params'=>'array'],
'pg_set_client_encoding' => ['int', 'connection'=>'resource', 'encoding'=>'string'],
'pg_set_client_encoding\'1' => ['int', 'encoding'=>'string'],
-'pg_set_error_verbosity' => ['int', 'connection'=>'resource', 'verbosity'=>'int'],
+'pg_set_error_verbosity' => ['int|false', 'connection'=>'resource', 'verbosity'=>'int'],
'pg_set_error_verbosity\'1' => ['int', 'verbosity'=>'int'],
'pg_socket' => ['resource|false', 'connection'=>'resource'],
'pg_trace' => ['bool', 'filename'=>'string', 'mode='=>'string', 'connection='=>'resource'],
@@ -8613,7 +8853,7 @@
'Phar::addFromString' => ['', 'localname'=>'string', 'contents'=>'string'],
'Phar::apiVersion' => ['string'],
'Phar::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'],
-'Phar::buildFromIterator' => ['array', 'iter'=>'iterator', 'base_directory='=>'string'],
+'Phar::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'],
'Phar::canCompress' => ['bool', 'method='=>'int'],
'Phar::canWrite' => ['bool'],
'Phar::compress' => ['Phar', 'compression'=>'int', 'extension='=>'string'],
@@ -8623,13 +8863,13 @@
'Phar::convertToData' => ['PharData', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'],
'Phar::convertToExecutable' => ['Phar', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'],
'Phar::copy' => ['bool', 'oldfile'=>'string', 'newfile'=>'string'],
-'Phar::count' => ['int'],
+'Phar::count' => ['0|positive-int'],
'Phar::createDefaultStub' => ['string', 'indexfile='=>'string', 'webindexfile='=>'string'],
'Phar::decompress' => ['Phar', 'extension='=>'string'],
'Phar::decompressFiles' => ['bool'],
'Phar::delete' => ['bool', 'entry'=>'string'],
'Phar::delMetadata' => ['bool'],
-'Phar::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array', 'overwrite='=>'bool'],
+'Phar::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'],
'Phar::getAlias' => ['string'],
'Phar::getMetadata' => ['mixed'],
'Phar::getModified' => ['bool'],
@@ -8670,7 +8910,7 @@
'PharData::addFile' => ['', 'file'=>'string', 'localname='=>'string'],
'PharData::addFromString' => ['bool', 'localname'=>'string', 'contents'=>'string'],
'PharData::buildFromDirectory' => ['array', 'base_dir'=>'string', 'regex='=>'string'],
-'PharData::buildFromIterator' => ['array', 'iter'=>'iterator', 'base_directory='=>'string'],
+'PharData::buildFromIterator' => ['array', 'iter'=>'Iterator', 'base_directory='=>'string'],
'PharData::compress' => ['PharData', 'compression'=>'int', 'extension='=>'string'],
'PharData::compressFiles' => ['bool', 'compression'=>'int'],
'PharData::convertToData' => ['PharData', 'format='=>'int', 'compression='=>'int', 'extension='=>'string'],
@@ -8680,7 +8920,7 @@
'PharData::decompressFiles' => ['bool'],
'PharData::delete' => ['bool', 'entry'=>'string'],
'PharData::delMetadata' => ['bool'],
-'PharData::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array', 'overwrite='=>'bool'],
+'PharData::extractTo' => ['bool', 'pathto'=>'string', 'files='=>'string|array|null', 'overwrite='=>'bool'],
'PharData::isWritable' => ['bool'],
'PharData::offsetGet' => ['PharFileInfo', 'offset'=>'string'],
'PharData::offsetSet' => ['', 'offset'=>'string', 'value'=>'string'],
@@ -8722,10 +8962,10 @@
'phdfs::tell' => ['int', 'path'=>'string'],
'phdfs::write' => ['bool', 'path'=>'string', 'buffer'=>'string', 'mode='=>'string'],
'php_check_syntax' => ['bool', 'filename'=>'string', 'error_message='=>'string'],
-'php_ini_loaded_file' => ['string|false'],
+'php_ini_loaded_file' => ['non-empty-string|false'],
'php_ini_scanned_files' => ['string|false'],
'php_logo_guid' => ['string'],
-'php_sapi_name' => ['string'],
+'php_sapi_name' => ['__benevolent'],
'php_strip_whitespace' => ['string', 'file_name'=>'string'],
'php_uname' => ['string', 'mode='=>'string'],
'php_user_filter::filter' => ['int', 'in'=>'resource', 'out'=>'resource', '&rw_consumed'=>'int', 'closing'=>'bool'],
@@ -8742,7 +8982,8 @@
'phpdbg_prompt' => ['', 'prompt'=>'string'],
'phpdbg_start_oplog' => [''],
'phpinfo' => ['bool', 'what='=>'int'],
-'phpversion' => ['string|false', 'extension='=>'string'],
+'phpversion' => ['string'],
+'phpversion\'1' => ['string|false', 'extension'=>'string'],
'pht\AtomicInteger::__construct' => ['void', 'value='=>'int'],
'pht\AtomicInteger::dec' => ['void'],
'pht\AtomicInteger::get' => ['int'],
@@ -8778,7 +9019,7 @@
'pointObj::distanceToLine' => ['float', 'p1'=>'pointObj', 'p2'=>'pointObj'],
'pointObj::distanceToPoint' => ['float', 'poPoint'=>'pointObj'],
'pointObj::distanceToShape' => ['float', 'shape'=>'shapeObj'],
-'pointObj::draw' => ['int', 'map'=>'MapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'],
+'pointObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'],
'pointObj::ms_newPointObj' => ['pointObj'],
'pointObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'],
'pointObj::setXY' => ['int', 'x'=>'float', 'y'=>'float', 'm'=>'float'],
@@ -8792,25 +9033,25 @@
'popen' => ['resource|false', 'command'=>'string', 'mode'=>'string'],
'pos' => ['mixed', 'array_arg'=>'array'],
'posix_access' => ['bool', 'file'=>'string', 'mode='=>'int'],
-'posix_ctermid' => ['string'],
+'posix_ctermid' => ['string|false'],
'posix_errno' => ['int'],
'posix_get_last_error' => ['int'],
-'posix_getcwd' => ['string'],
+'posix_getcwd' => ['string|false'],
'posix_getegid' => ['int'],
'posix_geteuid' => ['int'],
'posix_getgid' => ['int'],
-'posix_getgrgid' => ['array', 'gid'=>'int'],
-'posix_getgrnam' => ['array|false', 'groupname'=>'string'],
-'posix_getgroups' => ['array'],
-'posix_getlogin' => ['string'],
+'posix_getgrgid' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'gid'=>'int'],
+'posix_getgrnam' => ['array{name: string, passwd: string, gid: int, members: list}|false', 'groupname'=>'string'],
+'posix_getgroups' => ['list|false'],
+'posix_getlogin' => ['string|false'],
'posix_getpgid' => ['int|false', 'pid'=>'int'],
'posix_getpgrp' => ['int'],
'posix_getpid' => ['int'],
'posix_getppid' => ['int'],
'posix_getpwnam' => ['array|false', 'groupname'=>'string'],
-'posix_getpwuid' => ['array', 'uid'=>'int'],
-'posix_getrlimit' => ['array'],
-'posix_getsid' => ['int', 'pid'=>'int'],
+'posix_getpwuid' => ['array{name: string, passwd: string, uid: int, gid: int, gecos: string, dir: string, shell: string}|false', 'uid'=>'int'],
+'posix_getrlimit' => ['array|false'],
+'posix_getsid' => ['int|false', 'pid'=>'int'],
'posix_getuid' => ['int'],
'posix_initgroups' => ['bool', 'name'=>'string', 'base_group_id'=>'int'],
'posix_isatty' => ['bool', 'fd'=>'resource|int'],
@@ -8825,28 +9066,27 @@
'posix_setsid' => ['int'],
'posix_setuid' => ['bool', 'uid'=>'int'],
'posix_strerror' => ['string', 'errno'=>'int'],
-'posix_times' => ['array'],
+'posix_times' => ['array|false'],
'posix_ttyname' => ['string|false', 'fd'=>'resource|int'],
-'posix_uname' => ['array'],
+'posix_uname' => ['array|false'],
'Postal\Expand::expand_address' => ['string[]', 'address'=>'string', 'options='=>'array'],
'Postal\Parser::parse_address' => ['array', 'address'=>'string', 'options='=>'array'],
'pow' => ['float|int', 'base'=>'int|float', 'exponent'=>'int|float'],
-'preg_filter' => ['mixed', 'regex'=>'mixed', 'replace'=>'mixed', 'subject'=>'mixed', 'limit='=>'int', '&w_count='=>'int'],
-'preg_grep' => ['array', 'regex'=>'string', 'input'=>'array', 'flags='=>'int'],
+'preg_filter' => ['string|array|null', 'regex'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
+'preg_grep' => ['array|false', 'regex'=>'string', 'input'=>'array', 'flags='=>'int'],
'preg_last_error' => ['int'],
-'preg_match' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_subpatterns='=>'string[]', 'flags='=>'int', 'offset='=>'int'],
-'preg_match_all' => ['int|false', 'pattern'=>'string', 'subject'=>'string', '&w_subpatterns='=>'array', 'flags='=>'int', 'offset='=>'int'],
+'preg_match' => ['0|1|false', 'pattern'=>'string', 'subject'=>'string', '&w_subpatterns='=>'string[]', 'flags='=>'int', 'offset='=>'int'],
+'preg_match_all' => ['0|positive-int|false|null', 'pattern'=>'string', 'subject'=>'string', '&w_subpatterns='=>'array', 'flags='=>'int', 'offset='=>'int'],
'preg_quote' => ['string', 'str'=>'string', 'delim_char='=>'string'],
'preg_replace' => ['string|array|null', 'regex'=>'string|array', 'replace'=>'string|array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
-'preg_replace_callback' => ['string|array|null', 'regex'=>'string|array', 'callback'=>'callable', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
+'preg_replace_callback' => ['string|array|null', 'regex'=>'string|array', 'callback'=>'callable(array):string', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
'preg_replace_callback_array' => ['string|array|null', 'pattern'=>'array', 'subject'=>'string|array', 'limit='=>'int', '&w_count='=>'int'],
-'preg_split' => ['array|false', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'?int', 'flags='=>'int'],
-'prev' => ['mixed', '&rw_array_arg'=>'array'],
-'print' => ['int', 'arg'=>'string'],
+'preg_split' => ['list|false', 'pattern'=>'string', 'subject'=>'string', 'limit='=>'?int', 'flags='=>'int'],
+'prev' => ['mixed', '&rw_array_arg'=>'array|object'],
'print_r' => ['string|true', 'var'=>'mixed', 'return='=>'bool'],
-'printf' => ['int', 'format'=>'string', '...args='=>'string|int|float'],
+'printf' => ['int', 'format'=>'string', '...values='=>'__stringAndStringable|int|float|null|bool'],
'proc_close' => ['int', 'process'=>'resource'],
-'proc_get_status' => ['array', 'process'=>'resource'],
+'proc_get_status' => ['array{command: string, pid: int, running: bool, signaled: bool, stopped: bool, exitcode: int, termsig: int, stopsig: int}|false', 'process'=>'resource'],
'proc_nice' => ['bool', 'priority'=>'int'],
'proc_open' => ['resource|false', 'command'=>'string', 'descriptorspec'=>'array', '&w_pipes'=>'resource[]', 'cwd='=>'?string', 'env='=>'?array', 'other_options='=>'array'],
'proc_terminate' => ['bool', 'process'=>'resource', 'signal='=>'int'],
@@ -8950,7 +9190,7 @@
'pspell_new_personal' => ['int|false', 'personal'=>'string', 'language'=>'string', 'spelling='=>'string', 'jargon='=>'string', 'encoding='=>'string', 'mode='=>'int'],
'pspell_save_wordlist' => ['bool', 'pspell'=>'int'],
'pspell_store_replacement' => ['bool', 'pspell'=>'int', 'misspell'=>'string', 'correct'=>'string'],
-'pspell_suggest' => ['array', 'pspell'=>'int', 'word'=>'string'],
+'pspell_suggest' => ['array|false', 'pspell'=>'int', 'word'=>'string'],
'putenv' => ['bool', 'setting'=>'string'],
'px_close' => ['bool', 'pxdoc'=>'resource'],
'px_create_fp' => ['bool', 'pxdoc'=>'resource', 'file'=>'resource', 'fielddesc'=>'array'],
@@ -9032,9 +9272,9 @@
'quoted_printable_encode' => ['string', 'str'=>'string'],
'quotemeta' => ['string', 'str'=>'string'],
'rad2deg' => ['float', 'number'=>'float'],
-'radius_acct_open' => ['resource'],
+'radius_acct_open' => ['resource|false'],
'radius_add_server' => ['bool', 'radius_handle'=>'resource', 'hostname'=>'string', 'port'=>'int', 'secret'=>'string', 'timeout'=>'int', 'max_tries'=>'int'],
-'radius_auth_open' => ['resource'],
+'radius_auth_open' => ['resource|false'],
'radius_close' => ['bool', 'radius_handle'=>'resource'],
'radius_config' => ['bool', 'radius_handle'=>'resource', 'file'=>'string'],
'radius_create_request' => ['bool', 'radius_handle'=>'resource', 'type'=>'int'],
@@ -9062,9 +9302,9 @@
'radius_strerror' => ['string', 'radius_handle'=>'resource'],
'rand' => ['int', 'min'=>'int', 'max'=>'int'],
'rand\'1' => ['int'],
-'random_bytes' => ['string', 'length'=>'int'],
+'random_bytes' => ['non-empty-string', 'length'=>'positive-int'],
'random_int' => ['int', 'min'=>'int', 'max'=>'int'],
-'range' => ['array', 'low'=>'mixed', 'high'=>'mixed', 'step='=>'int|float'],
+'range' => ['array', 'low'=>'int|float|string', 'high'=>'int|float|string', 'step='=>'int|float'],
'RangeException::__clone' => ['void'],
'RangeException::__construct' => ['void', 'message='=>'string', 'code='=>'int', 'previous='=>'(?Throwable)|(?RangeException)'],
'RangeException::__toString' => ['string'],
@@ -9073,7 +9313,7 @@
'RangeException::getLine' => ['int'],
'RangeException::getMessage' => ['string'],
'RangeException::getPrevious' => ['Throwable|RangeException|null'],
-'RangeException::getTrace' => ['array'],
+'RangeException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'RangeException::getTraceAsString' => ['string'],
'rar_allow_broken_set' => ['bool', 'rarfile'=>'RarArchive', 'allow_broken'=>'bool'],
'rar_broken_is' => ['bool', 'rarfile'=>'RarArchive'],
@@ -9116,16 +9356,16 @@
'RarException::getLine' => ['int'],
'RarException::getMessage' => ['string'],
'RarException::getPrevious' => ['Exception|Throwable'],
-'RarException::getTrace' => ['array'],
+'RarException::getTrace' => ['list\',args?:mixed[],object?:object}>'],
'RarException::getTraceAsString' => ['string'],
'RarException::isUsingExceptions' => ['bool'],
'RarException::setUsingExceptions' => ['void', 'using_exceptions'=>'bool'],
'rawurldecode' => ['string', 'str'=>'string'],
'rawurlencode' => ['string', 'str'=>'string'],
'read_exif_data' => ['array', 'filename'=>'string|resource', 'sections_needed='=>'string', 'sub_arrays='=>'bool', 'read_thumbnail='=>'bool'],
-'readdir' => ['string|false', 'dir_handle='=>'resource'],
-'readfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'],
-'readgzfile' => ['int|false', 'filename'=>'string', 'use_include_path='=>'int'],
+'readdir' => ['non-empty-string|false', 'dir_handle='=>'resource'],
+'readfile' => ['0|positive-int|false', 'filename'=>'string', 'use_include_path='=>'bool', 'context='=>'resource'],
+'readgzfile' => ['0|positive-int|false', 'filename'=>'string', 'use_include_path='=>'int'],
'readline' => ['string|false', 'prompt='=>'?string'],
'readline_add_history' => ['bool', 'prompt'=>'string'],
'readline_callback_handler_install' => ['bool', 'prompt'=>'string', 'callback'=>'callable'],
@@ -9140,14 +9380,14 @@
'readline_redisplay' => ['void'],
'readline_write_history' => ['bool', 'filename='=>'string'],
'readlink' => ['string|false', 'filename'=>'string'],
-'realpath' => ['string|false', 'path'=>'string'],
+'realpath' => ['non-empty-string|false', 'path'=>'string'],
'realpath_cache_get' => ['array'],
'realpath_cache_size' => ['int'],
'recode' => ['string', 'request'=>'string', 'str'=>'string'],
'recode_file' => ['bool', 'request'=>'string', 'input'=>'resource', 'output'=>'resource'],
'recode_string' => ['string', 'request'=>'string', 'str'=>'string'],
'rectObj::__construct' => ['void'],
-'rectObj::draw' => ['int', 'map'=>'MapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'],
+'rectObj::draw' => ['int', 'map'=>'mapObj', 'layer'=>'layerObj', 'img'=>'imageObj', 'class_index'=>'int', 'text'=>'string'],
'rectObj::fit' => ['float', 'width'=>'int', 'height'=>'int'],
'rectObj::ms_newRectObj' => ['rectObj'],
'rectObj::project' => ['int', 'in'=>'projectionObj', 'out'=>'projectionObj'],
@@ -9156,7 +9396,7 @@
'RecursiveArrayIterator::__construct' => ['void', 'array='=>'array|object', 'flags='=>'int'],
'RecursiveArrayIterator::append' => ['void', 'value'=>'mixed'],
'RecursiveArrayIterator::asort' => ['void'],
-'RecursiveArrayIterator::count' => ['int'],
+'RecursiveArrayIterator::count' => ['0|positive-int'],
'RecursiveArrayIterator::current' => ['mixed'],
'RecursiveArrayIterator::getArrayCopy' => ['array'],
'RecursiveArrayIterator::getChildren' => ['RecursiveArrayIterator'],
@@ -9175,14 +9415,14 @@
'RecursiveArrayIterator::seek' => ['void', 'position'=>'int'],
'RecursiveArrayIterator::serialize' => ['string'],
'RecursiveArrayIterator::setFlags' => ['void', 'flags'=>'string'],
-'RecursiveArrayIterator::uasort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'],
-'RecursiveArrayIterator::uksort' => ['void', 'cmp_function'=>'callable(mixed,mixed):int'],
+'RecursiveArrayIterator::uasort' => ['void', 'callback'=>'callable(mixed,mixed):int'],
+'RecursiveArrayIterator::uksort' => ['void', 'callback'=>'callable(array-key,array-key):int'],
'RecursiveArrayIterator::unserialize' => ['string', 'serialized'=>'string'],
'RecursiveArrayIterator::valid' => ['bool'],
-'RecursiveCachingIterator::__construct' => ['void', 'it'=>'Iterator', 'flags'=>''],
+'RecursiveCachingIterator::__construct' => ['void', 'iterator'=>'Iterator', 'flags'=>''],
'RecursiveCachingIterator::getChildren' => ['RecursiveCachingIterator'],
'RecursiveCachingIterator::hasChildren' => ['bool'],
-'RecursiveCallbackFilterIterator::__construct' => ['void', 'it'=>'recursiveiterator', 'func'=>'callable'],
+'RecursiveCallbackFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'func'=>'callable'],
'RecursiveCallbackFilterIterator::getChildren' => ['RecursiveCallbackFilterIterator'],
'RecursiveCallbackFilterIterator::hasChildren' => ['void'],
'RecursiveDirectoryIterator::__construct' => ['void', 'path'=>'string', 'flags='=>'int'],
@@ -9193,12 +9433,12 @@
'RecursiveDirectoryIterator::key' => ['string'],
'RecursiveDirectoryIterator::next' => ['void'],
'RecursiveDirectoryIterator::rewind' => ['void'],
-'RecursiveFilterIterator::__construct' => ['void', 'it'=>'recursiveiterator'],
+'RecursiveFilterIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator'],
'RecursiveFilterIterator::getChildren' => ['RecursiveFilterIterator'],
'RecursiveFilterIterator::hasChildren' => ['bool'],
'RecursiveIterator::getChildren' => ['RecursiveIterator'],
'RecursiveIterator::hasChildren' => ['bool'],
-'RecursiveIteratorIterator::__construct' => ['void', 'it'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'int', 'flags='=>'int'],
+'RecursiveIteratorIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'mode='=>'RecursiveIteratorIterator::LEAVES_ONLY|RecursiveIteratorIterator::SELF_FIRST|RecursiveIteratorIterator::CHILD_FIRST', 'flags='=>'0|RecursiveIteratorIterator::CATCH_GET_CHILD'],
'RecursiveIteratorIterator::beginChildren' => ['void'],
'RecursiveIteratorIterator::beginIteration' => ['RecursiveIterator'],
'RecursiveIteratorIterator::callGetChildren' => ['RecursiveIterator'],
@@ -9216,10 +9456,10 @@
'RecursiveIteratorIterator::rewind' => ['void'],
'RecursiveIteratorIterator::setMaxDepth' => ['void', 'max_depth='=>'int'],
'RecursiveIteratorIterator::valid' => ['bool'],
-'RecursiveRegexIterator::__construct' => ['void', 'it'=>'recursiveiterator', 'regex='=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'],
+'RecursiveRegexIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator', 'regex='=>'string', 'mode='=>'int', 'flags='=>'int', 'preg_flags='=>'int'],
'RecursiveRegexIterator::getChildren' => ['RecursiveRegexIterator'],
'RecursiveRegexIterator::hasChildren' => ['bool'],
-'RecursiveTreeIterator::__construct' => ['void', 'it'=>'recursiveiterator|iteratoraggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode='=>'int'],
+'RecursiveTreeIterator::__construct' => ['void', 'iterator'=>'RecursiveIterator|IteratorAggregate', 'flags='=>'int', 'cit_flags='=>'int', 'mode='=>'int'],
'RecursiveTreeIterator::beginChildren' => ['void'],
'RecursiveTreeIterator::beginIteration' => ['RecursiveIterator'],
'RecursiveTreeIterator::callGetChildren' => ['RecursiveIterator'],
@@ -9237,228 +9477,276 @@
'RecursiveTreeIterator::setPostfix' => ['void', 'prefix'=>'string'],
'RecursiveTreeIterator::setPrefixPart' => ['void', 'part'=>'int', 'prefix'=>'string'],
'RecursiveTreeIterator::valid' => ['bool'],
-'Redis::__construct' => ['void'],
-'Redis::_prefix' => ['string', 'value'=>'mixed'],
-'Redis::_serialize' => ['mixed', 'value'=>'mixed'],
-'Redis::_unserialize' => ['mixed', 'value'=>'string'],
-'Redis::append' => ['int', 'key'=>'string', 'value'=>'string'],
-'Redis::auth' => ['bool', 'password'=>'string'],
-'Redis::bgRewriteAOF' => ['bool'],
-'Redis::bgSave' => ['bool'],
-'Redis::bitCount' => ['int', 'key'=>'string'],
-'Redis::bitOp' => ['int', 'operation'=>'string', '...args'=>'string'],
-'Redis::bitpos' => ['int', 'key'=>'string', 'bit'=>'int', 'start='=>'int', 'end='=>'int'],
-'Redis::blPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'],
+'Redis::__construct' => ['void', 'options='=>'?array{host?:string,port?:int,connectTimeout?:float,auth?:list{string|null|false,string}|list{string},ssl?:array,backoff?:array}'],
+'Redis::_compress' => ['string', 'value'=>'string'],
+'Redis::_uncompress' => ['string', 'value'=>'string'],
+'Redis::_prefix' => ['string', 'key'=>'mixed'],
+'Redis::_serialize' => ['mixed', 'value'=>'string'],
+'Redis::_unserialize' => ['string', 'value'=>'mixed'],
+'Redis::_pack' => ['mixed', 'value'=>'string'],
+'Redis::_unpack' => ['string', 'value'=>'mixed'],
+'Redis::acl' => ['mixed', 'subcmd'=>'string', '...args='=>'string'],
+'Redis::append' => ['__benevolent', 'key'=>'string', 'value'=>'string'],
+'Redis::auth' => ['__benevolent', 'credentials'=>'string|string[]'],
+'Redis::bgrewriteaof' => ['__benevolent'],
+'Redis::bgSave' => ['__benevolent'],
+'Redis::bitcount' => ['__benevolent', 'key'=>'string', 'start='=>'int', 'end='=>'int', 'bybit='=>'bool'],
+'Redis::bitop' => ['__benevolent', 'operation'=>'string', 'deskey'=>'string', 'srckey'=>'string', '...other_keys'=>'string'],
+'Redis::bitpos' => ['__benevolent', 'key'=>'string', 'bit'=>'bool', 'start='=>'int', 'end='=>'int', 'bybit='=>'bool'],
+'Redis::blmove' => ['__benevolent', 'src'=>'string', 'dst'=>'string', 'wherefrom'=>'string', 'whereto'=>'string', 'timeout'=>'float'],
+'Redis::blmpop' => ['__benevolent', 'timeout'=>'float', 'keys'=>'string[]', 'from'=>'string', 'count='=>'int'],
+'Redis::blPop' => ['__benevolent', 'key_or_keys'=>'string|string[]', 'timeout_or_key'=>'string|float|int', '...extra_args'=>'mixed'],
'Redis::blPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'],
-'Redis::brPop' => ['array', 'keys'=>'string[]', 'timeout'=>'int'],
+'Redis::brPop' => ['__benevolent', 'key_or_keys'=>'string|string[]', 'timeout_or_key'=>'string|float|int', '...extra_args'=>'mixed'],
'Redis::brPop\'1' => ['array', 'key'=>'string', 'timeout_or_key'=>'int|string', '...extra_args'=>'int|string'],
-'Redis::brpoplpush' => ['string|false', 'srcKey'=>'string', 'dstKey'=>'string', 'timeout'=>'int'],
+'Redis::brpoplpush' => ['__benevolent', 'src'=>'string', 'dst'=>'string', 'timeout'=>'int|float'],
+'Redis::bzPopMax' => ['__benevolent', 'key'=>'string|string[]', 'timeout_or_key'=>'string|int', '...extra_args'=>'mixed'],
+'Redis::bzPopMin' => ['__benevolent', 'key'=>'string|string[]', 'timeout_or_key'=>'string|int', '...extra_args'=>'mixed'],
+'Redis::bzmpop' => ['__benevolent